From bee2abcf9c56ab4fdae28b1bd3ed703079fb1d4e Mon Sep 17 00:00:00 2001 From: Yuwang Cai Date: Thu, 14 Nov 2024 12:37:32 +0800 Subject: [PATCH] refactor: huge refactor (#8) * refactor: project structure no longer use multi workspaces * docs: vitepress * chore: remove utils file * chore: remove dts files * refactor: use-event-listener * refactor: use-clipboard-text * refactor: use-click-outside * refactor: use-boolean * refactor: use-async-effect * refactor: use-const-fn * refactor: use-const * chore: test descriptions * refactor: use-counter * refactor: use-debounce-effect * refactor: use-debounce * refactor: use-document * refactor: use-element-size * refactor: use-focus-trap * refactor: use user-event library * refactor: use-hover * chore: event instead of e * refactor: use-interval * refactor: use-is-mounted * refactor: use-keydown * refactor: use-latest * refactor: use-storage * refactor: use-media-query * refactor: use-mount * refactor: use-previous * refactor: use-rerender * refactor: use-safe-layout-effect * feat: remove defaultValue option from use-storage * refactor: use-text-selection * fix: clear mocks * refactor: use-theme * refactor: use-throttle-effect * refactor: use-throttle * refactor: use-timeout * refactor: use-title * refactor: use-toggle * refactor: use-unmount * refactor: use-unsafe-once-effect * refactor: use-update * refactor: use-window * refactor: use-window-size * test: cancel selection after each test * ci: only deploy docs on push to main * ci: only deploy docs on docs folder changes * chore: lowercase documentation * ci: do not run ci on docs update * chore: remove unused match-media * chore: exclude dist types * feat: use-document-event-listener * fix: export EventMap and EventType * chore: remove eslint-plugin-react-hooks * refactor: src * fix: no need to call useUnmount * refactor: src * refactor: useMount * fix: unsafe once effect under strict mode * refactor: use-is-mounted utilizes useUnmount * style: [entry] --- .commitlintrc.json | 3 - .eslintignore | 3 - .eslintrc.json | 3 - .github/CODE_OF_CONDUCT.md | 128 - .github/CONTRIBUTING.md | 132 - .github/ISSUE_TEMPLATE/bug-report.md | 44 - .github/ISSUE_TEMPLATE/config.yml | 5 - .../documentation-improvement.md | 17 - .github/ISSUE_TEMPLATE/feature_request.md | 34 - .github/workflows/ci.yaml | 106 + .github/workflows/codeql.yml | 40 - ...loy-documentation.yml => deploy-docs.yaml} | 8 +- .github/workflows/publish-package.yml | 43 - .github/workflows/publish.yaml | 36 + .github/workflows/test-package.yml | 37 - .gitignore | 39 +- .husky/commit-msg | 5 +- .husky/pre-commit | 3 - .husky/pre-push | 1 + .lintstagedrc.json | 7 - .prettierignore | 3 + .prettierrc.json | 1 - LICENSE | 2 +- README.md | 41 +- commitlint.config.ts | 5 + docs/.vitepress/config.ts | 60 + docs/astro.config.ts | 27 - docs/index.md | 32 + docs/introduction/getting-started.md | 47 + docs/package.json | 29 - docs/public/banner.png | Bin 69569 -> 0 bytes docs/public/favicon.svg | 4 - docs/public/logo.svg | 1 + docs/public/robots.txt | 3 - .../components/doc-footer/doc-footer.astro | 27 - .../src/components/doc-footer/edit-link.astro | 17 - docs/src/components/doc-footer/index.ts | 2 - .../doc-footer/last-updated-at.astro | 21 - .../src/components/doc-footer/page-link.astro | 27 - docs/src/components/doc-footer/utils.ts | 36 - docs/src/components/header/header.astro | 22 - docs/src/components/header/index.ts | 2 - docs/src/components/header/logo.astro | 7 - .../header/navigation-toggler.astro | 29 - .../components/header/source-code-link.astro | 12 - .../src/components/header/theme-toggler.astro | 50 - docs/src/components/navigation/index.ts | 2 - docs/src/components/navigation/link.astro | 22 - .../components/navigation/navigation.astro | 35 - docs/src/components/on-this-page/anchor.astro | 16 - docs/src/components/on-this-page/index.ts | 2 - .../on-this-page/on-this-page.astro | 95 - docs/src/data/navigation.json | 172 - docs/src/env.d.ts | 1 - docs/src/global.css | 36 - docs/src/icons/chevron-right.astro | 22 - docs/src/icons/edit.astro | 23 - docs/src/icons/github.astro | 24 - docs/src/icons/menu.astro | 24 - docs/src/icons/moon.astro | 22 - docs/src/icons/sun.astro | 30 - docs/src/icons/utils.ts | 3 - docs/src/layouts/doc-layout.astro | 55 - docs/src/layouts/layout.astro | 82 - docs/src/layouts/normal-layout.astro | 20 - docs/src/pages/404.astro | 25 - docs/src/pages/index.astro | 3 - docs/src/pages/installation.md | 48 - docs/src/pages/introduction.md | 32 - docs/src/pages/use-async-effect.md | 46 - docs/src/pages/use-boolean.md | 63 - docs/src/plugins/autolink-headings.ts | 27 - docs/src/plugins/inject-frontmatter.ts | 7 - docs/src/utils/get-git-update-date.ts | 18 - docs/tailwind.config.cjs | 19 - docs/tsconfig.json | 10 - docs/vercel.json | 16 - eslint.config.js | 17 + lint-staged.config.js | 4 + package.json | 93 +- packages/commitlint-config-custom/index.json | 3 - .../commitlint-config-custom/package.json | 15 - packages/eslint-config-custom/index.json | 30 - packages/eslint-config-custom/package.json | 23 - packages/hooks/README.md | 40 - packages/hooks/package.json | 68 - .../hooks/plugins/remove-redundant-dts.ts | 11 - packages/hooks/src/types/events.d.ts | 136 - packages/hooks/src/types/utils.d.ts | 6 - packages/hooks/src/use-boolean.ts | 14 - packages/hooks/src/use-click-outside.ts | 29 - packages/hooks/src/use-clipboard-text.ts | 51 - packages/hooks/src/use-const.ts | 9 - packages/hooks/src/use-debounce.ts | 28 - packages/hooks/src/use-element-size.ts | 29 - packages/hooks/src/use-event-listener.ts | 40 - packages/hooks/src/use-focus-trap.ts | 40 - packages/hooks/src/use-interval.ts | 14 - packages/hooks/src/use-is-mounted.ts | 17 - packages/hooks/src/use-keydown.ts | 42 - packages/hooks/src/use-local-storage.ts | 16 - packages/hooks/src/use-selection.ts | 32 - packages/hooks/src/use-session-storage.ts | 16 - packages/hooks/src/use-storage.ts | 101 - packages/hooks/src/use-theme.ts | 32 - packages/hooks/src/use-throttle.ts | 37 - packages/hooks/src/use-timeout.ts | 14 - packages/hooks/src/use-title.ts | 10 - packages/hooks/src/use-unmount.ts | 9 - packages/hooks/src/use-unsafe-once-effect.ts | 19 - packages/hooks/src/use-update.ts | 24 - packages/hooks/src/utils.ts | 3 - .../hooks/tests/use-clipboard-text.test.ts | 150 - packages/hooks/tests/use-const.test.ts | 17 - packages/hooks/tests/use-element-size.test.ts | 29 - .../hooks/tests/use-event-listener.test.ts | 132 - packages/hooks/tests/use-focus-trap.test.ts | 51 - packages/hooks/tests/use-hover.test.ts | 34 - packages/hooks/tests/use-interval.test.ts | 50 - packages/hooks/tests/use-is-mounted.test.ts | 23 - packages/hooks/tests/use-keydown.test.ts | 95 - .../hooks/tests/use-local-storage.test.ts | 142 - packages/hooks/tests/use-media-query.test.ts | 33 - packages/hooks/tests/use-selection.test.ts | 69 - .../hooks/tests/use-session-storage.test.ts | 142 - packages/hooks/tests/use-timeout.test.ts | 38 - packages/hooks/tests/use-title.test.ts | 12 - packages/hooks/tests/use-update.test.ts | 23 - packages/hooks/tests/use-window-size.test.ts | 25 - packages/hooks/tests/utils/match-media.ts | 62 - packages/hooks/tsconfig.json | 9 - packages/prettier-config-custom/index.json | 11 - packages/prettier-config-custom/package.json | 15 - packages/typescript-config-custom/base.json | 33 - .../typescript-config-custom/package.json | 14 - pnpm-lock.yaml | 9418 +++++++---------- pnpm-workspace.yaml | 3 - prettier.config.js | 2 + scripts/generate-navigation-json.js | 51 - {packages/hooks/src => src}/index.ts | 10 +- src/types.ts | 2 + .../hooks/src => src}/use-async-effect.ts | 14 +- src/use-boolean.ts | 15 + src/use-click-outside.ts | 29 + src/use-clipboard-text.ts | 64 + {packages/hooks/src => src}/use-const-fn.ts | 5 +- src/use-const.ts | 8 + {packages/hooks/src => src}/use-counter.ts | 10 +- .../hooks/src => src}/use-debounce-effect.ts | 8 +- src/use-debounce.ts | 18 + src/use-document-event-listener.ts | 18 + {packages/hooks/src => src}/use-document.ts | 7 +- src/use-element-size.ts | 35 + src/use-event-listener.ts | 190 + src/use-focus-trap.ts | 44 + {packages/hooks/src => src}/use-hover.ts | 2 +- src/use-interval.ts | 16 + src/use-is-mounted.ts | 20 + src/use-keydown.ts | 40 + {packages/hooks/src => src}/use-latest.ts | 2 + src/use-local-storage.ts | 13 + .../hooks/src => src}/use-media-query.ts | 9 +- {packages/hooks/src => src}/use-mount.ts | 3 +- {packages/hooks/src => src}/use-previous.ts | 8 +- {packages/hooks/src => src}/use-rerender.ts | 1 + .../src => src}/use-safe-layout-effect.ts | 0 src/use-session-storage.ts | 13 + src/use-storage.ts | 75 + src/use-text-selection.ts | 36 + src/use-theme.ts | 37 + .../hooks/src => src}/use-throttle-effect.ts | 9 +- src/use-throttle.ts | 18 + src/use-timeout.ts | 16 + src/use-title.ts | 35 + {packages/hooks/src => src}/use-toggle.ts | 9 +- src/use-unmount.ts | 8 + src/use-unsafe-once-effect.ts | 21 + .../use-update-deps.ts => src/use-update.ts | 18 +- .../hooks/src => src}/use-window-size.ts | 7 +- {packages/hooks/src => src}/use-window.ts | 7 +- .../tests => tests}/use-async-effect.test.ts | 21 +- .../hooks/tests => tests}/use-boolean.test.ts | 50 +- .../tests => tests}/use-click-outside.test.ts | 53 +- tests/use-clipboard-text.test.ts | 155 + .../tests => tests}/use-const-fn.test.ts | 9 +- tests/use-const.test.ts | 16 + .../hooks/tests => tests}/use-counter.test.ts | 23 +- .../use-debounce-effect.test.ts | 63 +- .../tests => tests}/use-debounce.test.ts | 75 +- .../tests => tests}/use-document.test.ts | 1 + tests/use-element-size.test.ts | 61 + tests/use-event-listener.test.ts | 212 + tests/use-focus-trap.test.ts | 74 + tests/use-hover.test.ts | 26 + tests/use-interval.test.ts | 92 + tests/use-is-mounted.test.ts | 16 + tests/use-keydown.test.ts | 121 + .../hooks/tests => tests}/use-latest.test.ts | 9 + tests/use-local-storage.test.ts | 167 + tests/use-media-query.test.ts | 55 + .../hooks/tests => tests}/use-mount.test.ts | 10 +- .../tests => tests}/use-previous.test.ts | 20 +- .../tests => tests}/use-rerender.test.ts | 8 +- .../use-safe-layout-effect.test.ts | 7 +- tests/use-session-storage.test.ts | 167 + tests/use-text-selection.test.ts | 110 + .../hooks/tests => tests}/use-theme.test.ts | 126 +- .../use-throttle-effect.test.ts | 59 +- .../tests => tests}/use-throttle.test.ts | 55 +- tests/use-timeout.test.ts | 74 + tests/use-title.test.ts | 14 + .../hooks/tests => tests}/use-toggle.test.ts | 38 +- .../hooks/tests => tests}/use-unmount.test.ts | 9 +- .../use-unsafe-once-effect.test.ts | 12 +- .../use-update.test.ts | 69 +- tests/use-window-size.test.ts | 19 + .../hooks/tests => tests}/use-window.test.ts | 1 + tsconfig.json | 50 +- turbo.json | 15 - vercel.json | 5 + .../hooks/vite.config.ts => vite.config.ts | 20 +- 221 files changed, 7077 insertions(+), 9966 deletions(-) delete mode 100644 .commitlintrc.json delete mode 100644 .eslintignore delete mode 100644 .eslintrc.json delete mode 100644 .github/CODE_OF_CONDUCT.md delete mode 100644 .github/CONTRIBUTING.md delete mode 100644 .github/ISSUE_TEMPLATE/bug-report.md delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/ISSUE_TEMPLATE/documentation-improvement.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/ci.yaml delete mode 100644 .github/workflows/codeql.yml rename .github/workflows/{deploy-documentation.yml => deploy-docs.yaml} (68%) delete mode 100644 .github/workflows/publish-package.yml create mode 100644 .github/workflows/publish.yaml delete mode 100644 .github/workflows/test-package.yml create mode 100644 .husky/pre-push delete mode 100644 .lintstagedrc.json delete mode 100644 .prettierrc.json mode change 120000 => 100644 README.md create mode 100644 commitlint.config.ts create mode 100644 docs/.vitepress/config.ts delete mode 100644 docs/astro.config.ts create mode 100644 docs/index.md create mode 100644 docs/introduction/getting-started.md delete mode 100644 docs/package.json delete mode 100644 docs/public/banner.png delete mode 100644 docs/public/favicon.svg create mode 100644 docs/public/logo.svg delete mode 100644 docs/public/robots.txt delete mode 100644 docs/src/components/doc-footer/doc-footer.astro delete mode 100644 docs/src/components/doc-footer/edit-link.astro delete mode 100644 docs/src/components/doc-footer/index.ts delete mode 100644 docs/src/components/doc-footer/last-updated-at.astro delete mode 100644 docs/src/components/doc-footer/page-link.astro delete mode 100644 docs/src/components/doc-footer/utils.ts delete mode 100644 docs/src/components/header/header.astro delete mode 100644 docs/src/components/header/index.ts delete mode 100644 docs/src/components/header/logo.astro delete mode 100644 docs/src/components/header/navigation-toggler.astro delete mode 100644 docs/src/components/header/source-code-link.astro delete mode 100644 docs/src/components/header/theme-toggler.astro delete mode 100644 docs/src/components/navigation/index.ts delete mode 100644 docs/src/components/navigation/link.astro delete mode 100644 docs/src/components/navigation/navigation.astro delete mode 100644 docs/src/components/on-this-page/anchor.astro delete mode 100644 docs/src/components/on-this-page/index.ts delete mode 100644 docs/src/components/on-this-page/on-this-page.astro delete mode 100644 docs/src/data/navigation.json delete mode 100644 docs/src/env.d.ts delete mode 100644 docs/src/global.css delete mode 100644 docs/src/icons/chevron-right.astro delete mode 100644 docs/src/icons/edit.astro delete mode 100644 docs/src/icons/github.astro delete mode 100644 docs/src/icons/menu.astro delete mode 100644 docs/src/icons/moon.astro delete mode 100644 docs/src/icons/sun.astro delete mode 100644 docs/src/icons/utils.ts delete mode 100644 docs/src/layouts/doc-layout.astro delete mode 100644 docs/src/layouts/layout.astro delete mode 100644 docs/src/layouts/normal-layout.astro delete mode 100644 docs/src/pages/404.astro delete mode 100644 docs/src/pages/index.astro delete mode 100644 docs/src/pages/installation.md delete mode 100644 docs/src/pages/introduction.md delete mode 100644 docs/src/pages/use-async-effect.md delete mode 100644 docs/src/pages/use-boolean.md delete mode 100644 docs/src/plugins/autolink-headings.ts delete mode 100644 docs/src/plugins/inject-frontmatter.ts delete mode 100644 docs/src/utils/get-git-update-date.ts delete mode 100644 docs/tailwind.config.cjs delete mode 100644 docs/tsconfig.json delete mode 100644 docs/vercel.json create mode 100644 eslint.config.js create mode 100644 lint-staged.config.js delete mode 100644 packages/commitlint-config-custom/index.json delete mode 100644 packages/commitlint-config-custom/package.json delete mode 100644 packages/eslint-config-custom/index.json delete mode 100644 packages/eslint-config-custom/package.json delete mode 100644 packages/hooks/README.md delete mode 100644 packages/hooks/package.json delete mode 100644 packages/hooks/plugins/remove-redundant-dts.ts delete mode 100644 packages/hooks/src/types/events.d.ts delete mode 100644 packages/hooks/src/types/utils.d.ts delete mode 100644 packages/hooks/src/use-boolean.ts delete mode 100644 packages/hooks/src/use-click-outside.ts delete mode 100644 packages/hooks/src/use-clipboard-text.ts delete mode 100644 packages/hooks/src/use-const.ts delete mode 100644 packages/hooks/src/use-debounce.ts delete mode 100644 packages/hooks/src/use-element-size.ts delete mode 100644 packages/hooks/src/use-event-listener.ts delete mode 100644 packages/hooks/src/use-focus-trap.ts delete mode 100644 packages/hooks/src/use-interval.ts delete mode 100644 packages/hooks/src/use-is-mounted.ts delete mode 100644 packages/hooks/src/use-keydown.ts delete mode 100644 packages/hooks/src/use-local-storage.ts delete mode 100644 packages/hooks/src/use-selection.ts delete mode 100644 packages/hooks/src/use-session-storage.ts delete mode 100644 packages/hooks/src/use-storage.ts delete mode 100644 packages/hooks/src/use-theme.ts delete mode 100644 packages/hooks/src/use-throttle.ts delete mode 100644 packages/hooks/src/use-timeout.ts delete mode 100644 packages/hooks/src/use-title.ts delete mode 100644 packages/hooks/src/use-unmount.ts delete mode 100644 packages/hooks/src/use-unsafe-once-effect.ts delete mode 100644 packages/hooks/src/use-update.ts delete mode 100644 packages/hooks/src/utils.ts delete mode 100644 packages/hooks/tests/use-clipboard-text.test.ts delete mode 100644 packages/hooks/tests/use-const.test.ts delete mode 100644 packages/hooks/tests/use-element-size.test.ts delete mode 100644 packages/hooks/tests/use-event-listener.test.ts delete mode 100644 packages/hooks/tests/use-focus-trap.test.ts delete mode 100644 packages/hooks/tests/use-hover.test.ts delete mode 100644 packages/hooks/tests/use-interval.test.ts delete mode 100644 packages/hooks/tests/use-is-mounted.test.ts delete mode 100644 packages/hooks/tests/use-keydown.test.ts delete mode 100644 packages/hooks/tests/use-local-storage.test.ts delete mode 100644 packages/hooks/tests/use-media-query.test.ts delete mode 100644 packages/hooks/tests/use-selection.test.ts delete mode 100644 packages/hooks/tests/use-session-storage.test.ts delete mode 100644 packages/hooks/tests/use-timeout.test.ts delete mode 100644 packages/hooks/tests/use-title.test.ts delete mode 100644 packages/hooks/tests/use-update.test.ts delete mode 100644 packages/hooks/tests/use-window-size.test.ts delete mode 100644 packages/hooks/tests/utils/match-media.ts delete mode 100644 packages/hooks/tsconfig.json delete mode 100644 packages/prettier-config-custom/index.json delete mode 100644 packages/prettier-config-custom/package.json delete mode 100644 packages/typescript-config-custom/base.json delete mode 100644 packages/typescript-config-custom/package.json delete mode 100644 pnpm-workspace.yaml create mode 100644 prettier.config.js delete mode 100644 scripts/generate-navigation-json.js rename {packages/hooks/src => src}/index.ts (91%) create mode 100644 src/types.ts rename {packages/hooks/src => src}/use-async-effect.ts (52%) create mode 100644 src/use-boolean.ts create mode 100644 src/use-click-outside.ts create mode 100644 src/use-clipboard-text.ts rename {packages/hooks/src => src}/use-const-fn.ts (50%) create mode 100644 src/use-const.ts rename {packages/hooks/src => src}/use-counter.ts (50%) rename {packages/hooks/src => src}/use-debounce-effect.ts (82%) create mode 100644 src/use-debounce.ts create mode 100644 src/use-document-event-listener.ts rename {packages/hooks/src => src}/use-document.ts (61%) create mode 100644 src/use-element-size.ts create mode 100644 src/use-event-listener.ts create mode 100644 src/use-focus-trap.ts rename {packages/hooks/src => src}/use-hover.ts (89%) create mode 100644 src/use-interval.ts create mode 100644 src/use-is-mounted.ts create mode 100644 src/use-keydown.ts rename {packages/hooks/src => src}/use-latest.ts (99%) create mode 100644 src/use-local-storage.ts rename {packages/hooks/src => src}/use-media-query.ts (83%) rename {packages/hooks/src => src}/use-mount.ts (56%) rename {packages/hooks/src => src}/use-previous.ts (66%) rename {packages/hooks/src => src}/use-rerender.ts (99%) rename {packages/hooks/src => src}/use-safe-layout-effect.ts (100%) create mode 100644 src/use-session-storage.ts create mode 100644 src/use-storage.ts create mode 100644 src/use-text-selection.ts create mode 100644 src/use-theme.ts rename {packages/hooks/src => src}/use-throttle-effect.ts (85%) create mode 100644 src/use-throttle.ts create mode 100644 src/use-timeout.ts create mode 100644 src/use-title.ts rename {packages/hooks/src => src}/use-toggle.ts (56%) create mode 100644 src/use-unmount.ts create mode 100644 src/use-unsafe-once-effect.ts rename packages/hooks/src/use-update-deps.ts => src/use-update.ts (53%) rename {packages/hooks/src => src}/use-window-size.ts (84%) rename {packages/hooks/src => src}/use-window.ts (60%) rename {packages/hooks/tests => tests}/use-async-effect.test.ts (73%) rename {packages/hooks/tests => tests}/use-boolean.test.ts (68%) rename {packages/hooks/tests => tests}/use-click-outside.test.ts (52%) create mode 100644 tests/use-clipboard-text.test.ts rename {packages/hooks/tests => tests}/use-const-fn.test.ts (59%) create mode 100644 tests/use-const.test.ts rename {packages/hooks/tests => tests}/use-counter.test.ts (92%) rename {packages/hooks/tests => tests}/use-debounce-effect.test.ts (58%) rename {packages/hooks/tests => tests}/use-debounce.test.ts (51%) rename {packages/hooks/tests => tests}/use-document.test.ts (99%) create mode 100644 tests/use-element-size.test.ts create mode 100644 tests/use-event-listener.test.ts create mode 100644 tests/use-focus-trap.test.ts create mode 100644 tests/use-hover.test.ts create mode 100644 tests/use-interval.test.ts create mode 100644 tests/use-is-mounted.test.ts create mode 100644 tests/use-keydown.test.ts rename {packages/hooks/tests => tests}/use-latest.test.ts (99%) create mode 100644 tests/use-local-storage.test.ts create mode 100644 tests/use-media-query.test.ts rename {packages/hooks/tests => tests}/use-mount.test.ts (78%) rename {packages/hooks/tests => tests}/use-previous.test.ts (60%) rename {packages/hooks/tests => tests}/use-rerender.test.ts (78%) rename {packages/hooks/tests => tests}/use-safe-layout-effect.test.ts (78%) create mode 100644 tests/use-session-storage.test.ts create mode 100644 tests/use-text-selection.test.ts rename {packages/hooks/tests => tests}/use-theme.test.ts (66%) rename {packages/hooks/tests => tests}/use-throttle-effect.test.ts (63%) rename {packages/hooks/tests => tests}/use-throttle.test.ts (63%) create mode 100644 tests/use-timeout.test.ts create mode 100644 tests/use-title.test.ts rename {packages/hooks/tests => tests}/use-toggle.test.ts (81%) rename {packages/hooks/tests => tests}/use-unmount.test.ts (78%) rename {packages/hooks/tests => tests}/use-unsafe-once-effect.test.ts (71%) rename packages/hooks/tests/use-update-deps.test.ts => tests/use-update.test.ts (64%) create mode 100644 tests/use-window-size.test.ts rename {packages/hooks/tests => tests}/use-window.test.ts (99%) delete mode 100644 turbo.json create mode 100644 vercel.json rename packages/hooks/vite.config.ts => vite.config.ts (69%) diff --git a/.commitlintrc.json b/.commitlintrc.json deleted file mode 100644 index b3d3d17..0000000 --- a/.commitlintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["custom"] -} diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index b113373..0000000 --- a/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage -dist -*.config.cjs diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index b3d3d17..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["custom"] -} diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md deleted file mode 100644 index 1adae37..0000000 --- a/.github/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,128 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -- Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -- The use of sexualized language or imagery, and sexual attention or - advances of any kind -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or email - address, without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -mrcaidev@gmail.com. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder](https://github.com/mozilla/diversity). - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see the FAQ at -https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md deleted file mode 100644 index a244329..0000000 --- a/.github/CONTRIBUTING.md +++ /dev/null @@ -1,132 +0,0 @@ -# Contributing Guide - -Thank you for your interest in contributing to this project! - -Before submitting your contribution, please take a moment and read through the following guidelines: - -- [Code of Conduct](https://github.com/mrcaidev/hooks/tree/master/.github/CODE_OF_CONDUCT.md) -- [Issues](#issues) -- [Pull Requests](#pull-requests) -- [Local Development](#local-development) - -## Issues - -[Open an issue](https://github.com/mrcaidev/hooks/issues/new) if you want to: - -- report a bug -- suggest a feature -- improve the documentation - -### Opening - -Please do: - -- Search [existing issues](https://github.com/mrcaidev/hooks/issues) to avoid duplicates. -- Make sure that you are using the latest version of the package. -- Complete all of the required fields in the template. - -Please don't: - -- Talk about irrelevant topics. [Send an email](mailto:mrcaidev@gmail.com) instead. -- Ask questions. [Start a discussion](https://github.com/mrcaidev/hooks/discussions) instead. - -### Commenting - -Please do: - -- Provide additional useful information under open issues. -- Explain why it should not be closed under closed issues. - -Please don't: - -- Bring up another topic. [Open a new issue](https://github.com/mrcaidev/hooks/issues/new) instead. -- Leave meaningless comments like "+1" or "me too". Use reactions instead. - -## Pull Requests - -[Create a pull request](https://github.com/mrcaidev/hooks/pulls) if you: - -- fixed a bug -- implemented a new feature -- modified the documentation - -### Working - -Please do: - -- Ideally, you should [open an issue](https://github.com/mrcaidev/hooks/issues/new) first, and have it thoroughly discussed and approved before actually working on it. -- If your work is related to an existing issue, mention it under that issue to avoid duplicate work. -- Fork the `master` branch, and work in your own repository. -- Follow the guidelines for [local development](#local-development). -- Commit as many times as you want, and use any style of commit messages you like. - -### Merging - -Please do: - -- Merge back against the `master` branch. -- Make sure that your title follows the [commit message convention](https://www.conventionalcommits.org/en/v1.0.0/), and include a link to the related issue if any. - -## Local Development - -You will need [Node.js](https://nodejs.org/) and [pnpm](https://pnpm.io/) installed beforehand. - -After cloning the repository, run: - -``` -pnpm i -``` - -### Project Structure - -``` -. -├── docs # Documentation website -├── packages # All packages -│ ├── commitlint-config-custom # Commitlint config -│ ├── eslint-config-custom # ESLint config -│ ├── hooks # @mrcaidev/hooks -│ ├── prettier-config-custom # Prettier config -│ └── typescript-config-custom # TypeScript config -└── scripts # Utility scripts -``` - -### Build - -Build both package and documentation: - -``` -pnpm run build -``` - -Build package `@mrcaidev/hooks`: - -``` -pnpm run build:package -``` - -Build documentation website: - -``` -pnpm run build:docs -``` - -If you added a new hook, you will additionally need to run: - -``` -pnpm run build:docs:nav -``` - -### Test - -Test package: - -``` -pnpm run test -``` - -Test package in watch mode: - -``` -pnpm run --filter @mrcaidev/hooks test:watch -``` diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md deleted file mode 100644 index a232e2f..0000000 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -name: Bug Report -about: Report a possible bug. -title: '' -labels: bug -assignees: mrcaidev - ---- - -## Description - -> This does not work properly... - -## Minimal Reproducible Example - -> Here is a [CodeSandbox template](https://codesandbox.io/p/sandbox/thirsty-chaum-9oplqq) to reproduce the bug... - -## To Reproduce - -> Scroll down to ..., click on ..., and something breaks. - -## Expected behavior - -> However, it is supposed to... - -## Screenshots (Optional) - -> I took a screenshot to show the bug on my machine... - -## Environment - -- **OS:** Windows, MacOS, Ubuntu... -- **Browser:** Chrome, Edge, Firefox... -- **React version:** v16.8.0, v18.2.0... - -## Additional context (Optional) - -> This might also be helpful... - -## Checklist - -- [ ] I have searched existing issues and found no duplicate. -- [ ] I am using the latest version of the package. -- [ ] I am willing to submit a PR to fix this bug. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index e472b6c..0000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Ask a question - url: https://github.com/mrcaidev/hooks/discussions - about: Ask anything about this project. diff --git a/.github/ISSUE_TEMPLATE/documentation-improvement.md b/.github/ISSUE_TEMPLATE/documentation-improvement.md deleted file mode 100644 index 2f97753..0000000 --- a/.github/ISSUE_TEMPLATE/documentation-improvement.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: Documentation Improvement -about: Add or correct the documentation. -title: '' -labels: documentation -assignees: mrcaidev - ---- - -## Description - -> I found a mistake in the documentation... - -## Checklist - -- [ ] I have searched existing issues and found no duplicate. -- [ ] I am willing to submit a PR to modify the documentation. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 9535e96..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: Feature request -about: Suggest a new feature. -title: '' -labels: enhancement -assignees: mrcaidev - ---- - -## Description - -> I have a good idea on... - -## Reason - -> I think it is important to add this feature, because... - -## Related Issue (Optional) - -> This is related to this issue... - -## Alternatives (Optional) - -> If this can't be done, may be we can... - -## Additional Context (Optional) - -> This might also be helpful... - -## Checklist - -- [ ] I have searched existing issues and found no duplicate. -- [ ] I am using the latest version of the package. -- [ ] I am willing to submit a PR to implement this feature. diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..6afd7e5 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,106 @@ +name: CI + +on: + push: + branches: + - main + paths-ignore: + - docs/** + + pull_request: + branches: + - main + paths-ignore: + - docs/** + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: pnpm + + - name: Install dependencies + run: pnpm install + + - name: Lint with TSC + run: pnpm tsc + + - name: Lint with ESLint + run: pnpm eslint . + + format: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: pnpm + + - name: Install dependencies + run: pnpm install + + - name: Check format + run: pnpm prettier --check . + + build: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: pnpm + + - name: Install dependencies + run: pnpm install + + - name: Build + run: pnpm run build + + test: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: pnpm + + - name: Install dependencies + run: pnpm install + + - name: Test + run: pnpm run test diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index d680a7c..0000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: CodeQL - -on: - push: - branches: - - master - pull_request: - branches: - - master - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: ["javascript"] - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 - with: - category: "/language:${{matrix.language}}" diff --git a/.github/workflows/deploy-documentation.yml b/.github/workflows/deploy-docs.yaml similarity index 68% rename from .github/workflows/deploy-documentation.yml rename to .github/workflows/deploy-docs.yaml index 2e00762..8c60038 100644 --- a/.github/workflows/deploy-documentation.yml +++ b/.github/workflows/deploy-docs.yaml @@ -1,16 +1,16 @@ -name: Deploy Documentation +name: Deploy documentation on: push: branches: - - master + - main paths: - - "docs/**" - workflow_dispatch: + - docs/** jobs: deploy: runs-on: ubuntu-latest + steps: - name: Call deploy hook run: curl -X POST ${{ secrets.DEPLOY_HOOK }} diff --git a/.github/workflows/publish-package.yml b/.github/workflows/publish-package.yml deleted file mode 100644 index 1e94566..0000000 --- a/.github/workflows/publish-package.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Publish Package - -on: - release: - types: - - published - workflow_dispatch: - -jobs: - publish: - runs-on: ubuntu-latest - env: - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ secrets.TURBO_TEAM }} - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Setup pnpm - uses: pnpm/action-setup@v2 - with: - version: latest - - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version: 16 - registry-url: "https://registry.npmjs.org" - cache: "pnpm" - - - name: Install dependencies - run: pnpm i - - - name: Test - run: pnpm run test - - - name: Build package - run: pnpm run build:package - - - name: Publish to NPM - run: pnpm publish --filter @mrcaidev/hooks --no-git-checks - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 0000000..adb45c1 --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,36 @@ +name: Publish + +on: + release: + types: + - published + workflow_dispatch: + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: pnpm + registry-url: https://registry.npmjs.org + + - name: Install dependencies + run: pnpm install + + - name: Build + run: pnpm run build + + - name: Publish + run: pnpm publish --no-git-checks + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml deleted file mode 100644 index 74215d1..0000000 --- a/.github/workflows/test-package.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Test package - -on: - push: - branches: - - master - pull_request: - branches: - - master - workflow_dispatch: - -jobs: - test: - runs-on: ubuntu-latest - env: - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ secrets.TURBO_TEAM }} - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Setup pnpm - uses: pnpm/action-setup@v2 - with: - version: latest - - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: "pnpm" - - - name: Install dependencies - run: pnpm i - - - name: Test - run: pnpm run test diff --git a/.gitignore b/.gitignore index 735b75f..2eed64f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,37 +1,8 @@ -# dependencies -node_modules -.pnp -.pnp.js - -# output -dist -build -out -.next - -# testing coverage - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# log -logs -*.log - -# env -.env* - -# turbo -.turbo - -# misc -temp -next-env.d.ts +dist +node_modules *.tgz *.tsbuildinfo -.DS_Store -*.pem + +docs/.vitepress/cache +docs/.vitepress/dist diff --git a/.husky/commit-msg b/.husky/commit-msg index 10cb551..cfe7510 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -pnpm commitlint --edit "$1" +pnpm commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit index fab6428..cb2c84d 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - pnpm lint-staged diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100644 index 0000000..cc36afe --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1 @@ +pnpm vitest run diff --git a/.lintstagedrc.json b/.lintstagedrc.json deleted file mode 100644 index cd9ddaf..0000000 --- a/.lintstagedrc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "*.{ts,tsx,astro}": [ - "eslint --fix --cache --cache-location ./node_modules/.cache/eslint/.eslintcache", - "prettier --write --cache --plugin-search-dir=." - ], - "*.{css,json,md}": "prettier --write --cache --plugin-search-dir=." -} diff --git a/.prettierignore b/.prettierignore index 9f7f384..0709120 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,6 @@ coverage dist pnpm-lock.yaml + +docs/.vitepress/cache +docs/.vitepress/dist diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index ba63a7c..0000000 --- a/.prettierrc.json +++ /dev/null @@ -1 +0,0 @@ -"prettier-config-custom" diff --git a/LICENSE b/LICENSE index 2dda4d3..f1517f0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Yuwang Cai +Copyright (c) 2024 Yuwang Cai Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md deleted file mode 120000 index f2fcc40..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -packages/hooks/README.md \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..79436bb --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# @mrcaidev/hooks + +A collection of React utility hooks. + +- **Easy to use:** Good defaults, while highly customizable. +- **Fully typed:** Enjoy 100% type safety with TypeScript. +- **Server ready:** SSG/SSR support out of the box. +- **Lightweight:** <3KB gzipped. Tree-shaking supported. + +## Getting started + +Please follow the [documentation](https://hooks.mrcai.dev) to get started with `@mrcaidev/hooks`. + +## Built with + +[![TypeScript](https://img.shields.io/badge/typescript-3178c6?style=for-the-badge&logo=typescript&logoColor=ffffff)](https://www.typescriptlang.org/) +[![React](https://img.shields.io/badge/react-23272f?style=for-the-badge&logo=react)](https://reactjs.org/) +[![Vite](https://img.shields.io/badge/vite-646cff?style=for-the-badge&logo=vite&logoColor=ffffff)](https://vitejs.dev/) +[![Vitest](https://img.shields.io/badge/vitest-6da13f?style=for-the-badge&logo=vitest&logoColor=ffffff)](https://vitest.dev/) +[![Testing Library](https://shields.io/badge/testing%20library-e33433?style=for-the-badge&logo=testinglibrary&logoColor=ffffff)](https://testing-library.com/) +[![Astro](https://img.shields.io/badge/astro-7e22ce?style=for-the-badge&logo=astro&logoColor=ffffff)](https://astro.build/) +[![Tailwind CSS](https://shields.io/badge/tailwind%20css-38bdf8?style=for-the-badge&logo=tailwindcss&logoColor=ffffff)](https://tailwindcss.com/) +[![pnpm](https://img.shields.io/badge/pnpm-f69220?style=for-the-badge&logo=pnpm&logoColor=ffffff)](https://pnpm.io/) +[![Turborepo](https://img.shields.io/badge/turborepo-000000?style=for-the-badge&logo=turborepo)](https://turbo.build/repo) +[![ESLint](https://shields.io/badge/eslint-4b32c3?style=for-the-badge&logo=eslint&logoColor=ffffff)](https://eslint.org/) +[![Prettier](https://shields.io/badge/prettier-24292e?style=for-the-badge&logo=prettier)](https://prettier.io/) +[![Commitlint](https://shields.io/badge/commitlint-121212?style=for-the-badge&logo=commitlint&logoColor=ffffff)](https://commitlint.js.org/) +[![EditorConfig](https://shields.io/badge/editorconfig-000?style=for-the-badge&logo=editorconfig&logoColor=ffffff)](https://editorconfig.org/) +[![Husky](https://shields.io/badge/husky-42b983?style=for-the-badge&logo=git&logoColor=ffffff)](https://typicode.github.io/husky/) +[![Lint staged](https://shields.io/badge/lint%20staged-f54d27?style=for-the-badge&logo=git&logoColor=ffffff)](https://github.com/okonet/lint-staged) + +## Contributing + +Please read the [contributing guide](https://github.com/mrcaidev/hooks/tree/master/.github/CONTRIBUTING.md) before any contribution. + +> Currently this is really just a personal project. I'm trying to build a library that can make me proud of, while also learning React and Web APIs. But if you decide to help out, I believe it will definitely make this project better, and we can surely learn a lot from each other. + +## License + +[MIT](https://github.com/mrcaidev/hooks/tree/master/LICENSE) diff --git a/commitlint.config.ts b/commitlint.config.ts new file mode 100644 index 0000000..983a213 --- /dev/null +++ b/commitlint.config.ts @@ -0,0 +1,5 @@ +import type { UserConfig } from "@commitlint/types"; + +export default { + extends: ["@commitlint/config-conventional"], +} satisfies UserConfig; diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts new file mode 100644 index 0000000..300b32d --- /dev/null +++ b/docs/.vitepress/config.ts @@ -0,0 +1,60 @@ +import { defineConfig } from "vitepress"; + +export default defineConfig({ + title: "@mrcaidev/hooks", + description: "React utility hooks", + head: [ + [ + "link", + { + rel: "icon", + type: "image/svg+xml", + href: "/logo.svg", + }, + ], + ], + cleanUrls: true, + metaChunk: true, + lastUpdated: true, + themeConfig: { + logo: "/logo.svg", + nav: [ + { + text: "Docs", + link: "/introduction/getting-started", + }, + { + text: "Playground", + link: "https://codesandbox.io/p/sandbox/thirsty-chaum-9oplqq", + }, + ], + sidebar: [ + { + text: "Introduction", + base: "/introduction", + items: [ + { + text: "Getting Started", + link: "/getting-started", + }, + ], + }, + ], + socialLinks: [ + { + icon: "github", + link: "https://github.com/mrcaidev/hooks", + }, + ], + footer: { + message: "Released under the MIT License.", + copyright: "© 2022-present Yuwang Cai", + }, + editLink: { + pattern: "https://github.com/mrcaidev/hooks/edit/main/docs/:path", + }, + search: { + provider: "local", + }, + }, +}); diff --git a/docs/astro.config.ts b/docs/astro.config.ts deleted file mode 100644 index 12fbb90..0000000 --- a/docs/astro.config.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { rehypeHeadingIds } from "@astrojs/markdown-remark"; -import sitemap from "@astrojs/sitemap"; -import tailwind from "@astrojs/tailwind"; -import { defineConfig } from "astro/config"; -import { autolinkHeadings } from "./src/plugins/autolink-headings"; -import { injectFrontmatter } from "./src/plugins/inject-frontmatter"; - -export default defineConfig({ - integrations: [ - sitemap(), - tailwind({ - config: { - applyBaseStyles: false, - }, - }), - ], - markdown: { - remarkPlugins: [injectFrontmatter], - rehypePlugins: [rehypeHeadingIds, autolinkHeadings], - }, - site: "https://hooks.mrcai.dev", - vite: { - build: { - assetsInlineLimit: 0, - }, - }, -}); diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..c5810ee --- /dev/null +++ b/docs/index.md @@ -0,0 +1,32 @@ +--- +layout: home + +hero: + name: "@mrcaidev/hooks" + text: React Utility Hooks + tagline: Collection of 40+ common hooks + image: + src: /logo.svg + alt: React logo + actions: + - theme: brand + text: Getting Started + link: /introduction/getting-started + - theme: alt + text: GitHub + link: https://github.com/mrcaidev/hooks + +features: + - icon: 👍 + title: Easy to use + details: Reasonable defaults, flexible customization + - icon: 💯 + title: 100% TypeScript + details: Every hook is fully typed + - icon: ✅ + title: SSR ready + details: Runs on server without any error + - icon: ☁️ + title: Lightweight + details: <3KB gzipped, tree-shaking supported +--- diff --git a/docs/introduction/getting-started.md b/docs/introduction/getting-started.md new file mode 100644 index 0000000..a6e670b --- /dev/null +++ b/docs/introduction/getting-started.md @@ -0,0 +1,47 @@ +# Getting Started + +## Try It Online + +You can try @mrcaidev/hooks directly in your browser on [CodeSandbox](https://codesandbox.io/p/sandbox/thirsty-chaum-9oplqq). + +## Installation + +### Prerequisites + +[React](https://www.npmjs.com/package/react) and [React DOM](https://www.npmjs.com/package/react-dom) (version 16.8.0 or higher) are required. + +For TypeScript users, you may also want to install [@types/react](https://www.npmjs.com/package/@types/react) and [@types/react-dom](https://www.npmjs.com/package/@types/react-dom). + +### Install Package + +::: code-group + +```sh [npm] +npm add @mrcaidev/hooks +``` + +```sh [yarn] +yarn add @mrcaidev/hooks +``` + +```sh [pnpm] +pnpm add @mrcaidev/hooks +``` + +```sh [bun] +bun add @mrcaidev/hooks +``` + +::: + +### Usage + +```tsx +import { useBoolean } from "@mrcaidev/hooks"; + +function Component() { + const { value, toggle } = useBoolean(); + + return ; +} +``` diff --git a/docs/package.json b/docs/package.json deleted file mode 100644 index 4149035..0000000 --- a/docs/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "docs", - "version": "0.0.0", - "private": true, - "scripts": { - "dev": "astro dev", - "build": "astro build", - "preview": "astro preview" - }, - "dependencies": { - "@astrojs/markdown-remark": "^2.0.1", - "@astrojs/sitemap": "^1.0.1", - "@astrojs/tailwind": "^3.0.1", - "@fontsource/inter": "^4.5.15", - "@tailwindcss/typography": "^0.5.9", - "astro": "^2.0.6", - "cross-spawn": "^7.0.3", - "hastscript": "^7.2.0", - "rehype-autolink-headings": "^6.1.1", - "tailwindcss": "^3.2.4", - "tailwindcss-radix-colors": "^0.3.0" - }, - "devDependencies": { - "@types/cross-spawn": "^6.0.2", - "@types/node": "^18.11.18", - "typescript": "^4.9.5", - "typescript-config-custom": "workspace:^0.0.0" - } -} diff --git a/docs/public/banner.png b/docs/public/banner.png deleted file mode 100644 index cfa26db2f593a2f66c5dd73be513ed417a1f7c1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69569 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 l2^TL=mhjjwregQu&X%Q~loCIA2d?f?J) diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg deleted file mode 100644 index 6c748f0..0000000 --- a/docs/public/favicon.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/public/logo.svg b/docs/public/logo.svg new file mode 100644 index 0000000..b7615a1 --- /dev/null +++ b/docs/public/logo.svg @@ -0,0 +1 @@ + diff --git a/docs/public/robots.txt b/docs/public/robots.txt deleted file mode 100644 index 5c20652..0000000 --- a/docs/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -User-agent: * -Allow: / -Sitemap: https://hooks.mrcai.dev/sitemap-index.xml diff --git a/docs/src/components/doc-footer/doc-footer.astro b/docs/src/components/doc-footer/doc-footer.astro deleted file mode 100644 index d7ac523..0000000 --- a/docs/src/components/doc-footer/doc-footer.astro +++ /dev/null @@ -1,27 +0,0 @@ ---- -import EditLink from "./edit-link.astro"; -import LastUpdatedAt from "./last-updated-at.astro"; -import PageLink from "./page-link.astro"; -import { findPreviousAndNext } from "./utils"; - -export type Props = { - updateIso: string; - url: string; -}; -const { updateIso, url } = Astro.props; - -const editUrl = `https://github.com/mrcaidev/hooks/blob/master/docs/src/pages${url}.md`; -const { previous, next } = findPreviousAndNext(url); ---- - -
-
- - -
-
-
- - -
-
diff --git a/docs/src/components/doc-footer/edit-link.astro b/docs/src/components/doc-footer/edit-link.astro deleted file mode 100644 index 8e5219c..0000000 --- a/docs/src/components/doc-footer/edit-link.astro +++ /dev/null @@ -1,17 +0,0 @@ ---- -import Edit from "icons/edit.astro"; - -export type Props = { - url: string; -}; -const { url } = Astro.props; ---- - - - - Edit this page on GitHub - diff --git a/docs/src/components/doc-footer/index.ts b/docs/src/components/doc-footer/index.ts deleted file mode 100644 index d24be7b..0000000 --- a/docs/src/components/doc-footer/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -// @ts-expect-error: It actually works. -export { default } from "./doc-footer.astro"; diff --git a/docs/src/components/doc-footer/last-updated-at.astro b/docs/src/components/doc-footer/last-updated-at.astro deleted file mode 100644 index d049356..0000000 --- a/docs/src/components/doc-footer/last-updated-at.astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -export type Props = { - iso: string; -}; -const { iso } = Astro.props; ---- - - - Last updated: - - - - diff --git a/docs/src/components/doc-footer/page-link.astro b/docs/src/components/doc-footer/page-link.astro deleted file mode 100644 index 9084d83..0000000 --- a/docs/src/components/doc-footer/page-link.astro +++ /dev/null @@ -1,27 +0,0 @@ ---- -export type Props = { - type: "previous" | "next"; - name: string; - href: string; -}; -const { type, name, href } = Astro.props; - -const hint = type === "previous" ? "Previous page" : "Next page"; ---- - -
- { - href && ( - - {hint} - {name} - - ) - } -
diff --git a/docs/src/components/doc-footer/utils.ts b/docs/src/components/doc-footer/utils.ts deleted file mode 100644 index 61fbd26..0000000 --- a/docs/src/components/doc-footer/utils.ts +++ /dev/null @@ -1,36 +0,0 @@ -import navigation from "data/navigation.json"; - -export function findPreviousAndNext(href: string) { - let previous = { name: "", href: "" }; - let isFindingNext = false; - - for (const { links } of navigation) { - for (const link of links) { - if (isFindingNext) { - return { - previous, - next: link, - }; - } - - if (link.href !== href) { - previous = link; - continue; - } - - isFindingNext = true; - } - } - - if (isFindingNext) { - return { - previous, - next: { name: "", href: "" }, - }; - } - - return { - previous: { name: "", href: "" }, - next: { name: "", href: "" }, - }; -} diff --git a/docs/src/components/header/header.astro b/docs/src/components/header/header.astro deleted file mode 100644 index a4b6d4a..0000000 --- a/docs/src/components/header/header.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -import Logo from "./logo.astro"; -import NavigationToggler from "./navigation-toggler.astro"; -import SourceCodeLink from "./source-code-link.astro"; -import ThemeToggler from "./theme-toggler.astro"; - -export type Props = { - hasNavigation?: boolean; -}; -const { hasNavigation = false } = Astro.props; ---- - -
- -
- - - {hasNavigation && } -
-
diff --git a/docs/src/components/header/index.ts b/docs/src/components/header/index.ts deleted file mode 100644 index f622c40..0000000 --- a/docs/src/components/header/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -// @ts-expect-error: It actually works. -export { default } from "./header.astro"; diff --git a/docs/src/components/header/logo.astro b/docs/src/components/header/logo.astro deleted file mode 100644 index 121ea43..0000000 --- a/docs/src/components/header/logo.astro +++ /dev/null @@ -1,7 +0,0 @@ - - Logo - - diff --git a/docs/src/components/header/navigation-toggler.astro b/docs/src/components/header/navigation-toggler.astro deleted file mode 100644 index f296fa9..0000000 --- a/docs/src/components/header/navigation-toggler.astro +++ /dev/null @@ -1,29 +0,0 @@ ---- -import Menu from "icons/menu.astro"; ---- - - - - diff --git a/docs/src/components/header/source-code-link.astro b/docs/src/components/header/source-code-link.astro deleted file mode 100644 index fa885a2..0000000 --- a/docs/src/components/header/source-code-link.astro +++ /dev/null @@ -1,12 +0,0 @@ ---- -import Github from "icons/github.astro"; ---- - - - - View source code on GitHub - diff --git a/docs/src/components/header/theme-toggler.astro b/docs/src/components/header/theme-toggler.astro deleted file mode 100644 index 365acbd..0000000 --- a/docs/src/components/header/theme-toggler.astro +++ /dev/null @@ -1,50 +0,0 @@ ---- -import Moon from "icons/moon.astro"; -import Sun from "icons/sun.astro"; ---- - - - - diff --git a/docs/src/components/navigation/index.ts b/docs/src/components/navigation/index.ts deleted file mode 100644 index 036a189..0000000 --- a/docs/src/components/navigation/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -// @ts-expect-error: It actually works. -export { default } from "./navigation.astro"; diff --git a/docs/src/components/navigation/link.astro b/docs/src/components/navigation/link.astro deleted file mode 100644 index 901b674..0000000 --- a/docs/src/components/navigation/link.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -export type Props = { - href: string; - name: string; -}; -const { href, name } = Astro.props; - -const isCurrent = Astro.url.pathname.startsWith(href); ---- - - - {name} - diff --git a/docs/src/components/navigation/navigation.astro b/docs/src/components/navigation/navigation.astro deleted file mode 100644 index 25f7c4a..0000000 --- a/docs/src/components/navigation/navigation.astro +++ /dev/null @@ -1,35 +0,0 @@ ---- -import navigation from "data/navigation.json"; -import ChevronRight from "icons/chevron-right.astro"; -import Link from "./link.astro"; ---- - - diff --git a/docs/src/components/on-this-page/anchor.astro b/docs/src/components/on-this-page/anchor.astro deleted file mode 100644 index ba9db87..0000000 --- a/docs/src/components/on-this-page/anchor.astro +++ /dev/null @@ -1,16 +0,0 @@ ---- -import type { MarkdownHeading } from "astro"; - -export type Props = MarkdownHeading; -const { slug, depth, text } = Astro.props; - -const href = "#" + slug; -const name = depth === 1 ? "Overview" : text; ---- - - - {name} - diff --git a/docs/src/components/on-this-page/index.ts b/docs/src/components/on-this-page/index.ts deleted file mode 100644 index 078ff12..0000000 --- a/docs/src/components/on-this-page/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -// @ts-expect-error: It actually works. -export { default } from "./on-this-page.astro"; diff --git a/docs/src/components/on-this-page/on-this-page.astro b/docs/src/components/on-this-page/on-this-page.astro deleted file mode 100644 index 2cde545..0000000 --- a/docs/src/components/on-this-page/on-this-page.astro +++ /dev/null @@ -1,95 +0,0 @@ ---- -import type { MarkdownHeading } from "astro"; -import Anchor from "./anchor.astro"; - -export type Props = { - anchors: MarkdownHeading[]; -}; -const { anchors } = Astro.props; ---- - - - - diff --git a/docs/src/data/navigation.json b/docs/src/data/navigation.json deleted file mode 100644 index c57bbaf..0000000 --- a/docs/src/data/navigation.json +++ /dev/null @@ -1,172 +0,0 @@ -[ - { - "section": "Getting Started", - "links": [ - { - "name": "Introduction", - "href": "/introduction" - }, - { - "name": "Installation", - "href": "/installation" - } - ] - }, - { - "section": "Hooks", - "links": [ - { - "name": "useAsyncEffect", - "href": "/use-async-effect" - }, - { - "name": "useBoolean", - "href": "/use-boolean" - }, - { - "name": "useClickOutside", - "href": "/use-click-outside" - }, - { - "name": "useClipboardText", - "href": "/use-clipboard-text" - }, - { - "name": "useConstFn", - "href": "/use-const-fn" - }, - { - "name": "useConst", - "href": "/use-const" - }, - { - "name": "useCounter", - "href": "/use-counter" - }, - { - "name": "useDebounceEffect", - "href": "/use-debounce-effect" - }, - { - "name": "useDebounce", - "href": "/use-debounce" - }, - { - "name": "useDocument", - "href": "/use-document" - }, - { - "name": "useElementSize", - "href": "/use-element-size" - }, - { - "name": "useEventListener", - "href": "/use-event-listener" - }, - { - "name": "useFocusTrap", - "href": "/use-focus-trap" - }, - { - "name": "useHover", - "href": "/use-hover" - }, - { - "name": "useInterval", - "href": "/use-interval" - }, - { - "name": "useIsMounted", - "href": "/use-is-mounted" - }, - { - "name": "useKeydown", - "href": "/use-keydown" - }, - { - "name": "useLatest", - "href": "/use-latest" - }, - { - "name": "useLocalStorage", - "href": "/use-local-storage" - }, - { - "name": "useMediaQuery", - "href": "/use-media-query" - }, - { - "name": "useMount", - "href": "/use-mount" - }, - { - "name": "usePrevious", - "href": "/use-previous" - }, - { - "name": "useRerender", - "href": "/use-rerender" - }, - { - "name": "useSafeLayoutEffect", - "href": "/use-safe-layout-effect" - }, - { - "name": "useSelection", - "href": "/use-selection" - }, - { - "name": "useSessionStorage", - "href": "/use-session-storage" - }, - { - "name": "useTheme", - "href": "/use-theme" - }, - { - "name": "useThrottleEffect", - "href": "/use-throttle-effect" - }, - { - "name": "useThrottle", - "href": "/use-throttle" - }, - { - "name": "useTimeout", - "href": "/use-timeout" - }, - { - "name": "useTitle", - "href": "/use-title" - }, - { - "name": "useToggle", - "href": "/use-toggle" - }, - { - "name": "useUnmount", - "href": "/use-unmount" - }, - { - "name": "useUnsafeOnceEffect", - "href": "/use-unsafe-once-effect" - }, - { - "name": "useUpdateDeps", - "href": "/use-update-deps" - }, - { - "name": "useUpdate", - "href": "/use-update" - }, - { - "name": "useWindowSize", - "href": "/use-window-size" - }, - { - "name": "useWindow", - "href": "/use-window" - } - ] - } -] diff --git a/docs/src/env.d.ts b/docs/src/env.d.ts deleted file mode 100644 index f964fe0..0000000 --- a/docs/src/env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/docs/src/global.css b/docs/src/global.css deleted file mode 100644 index ad9feb6..0000000 --- a/docs/src/global.css +++ /dev/null @@ -1,36 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - *::-webkit-scrollbar { - @apply w-2 h-1 bg-gray-1 dark:bg-graydark-1; - } - *::-webkit-scrollbar-thumb { - @apply w-2 h-1 rounded bg-gray-7 dark:bg-graydark-7 hover:bg-gray-8 dark:hover:bg-graydark-8; - } - *::-webkit-scrollbar-corner { - @apply hidden; - } -} - -@layer components { - .typography { - @apply prose dark:prose-invert - prose-headings:text-gray-12 dark:prose-headings:text-graydark-12 - prose-headings:scroll-mt-20 - prose-a:text-cyan-11 dark:prose-a:text-cyandark-11 hover:prose-a:text-cyan-11 dark:hover:prose-a:text-cyandark-11 - prose-a:no-underline hover:prose-a:underline underline-offset-4 - [&_sup_a]:no-underline - prose-blockquote:text-gray-11 dark:prose-blockquote:text-graydark-11 - prose-blockquote:border-gray-6 dark:prose-blockquote:border-graydark-6 - [&_blockquote_p]:before:content-none [&_blockquote_p]:after:content-none - prose-strong:text-current - prose-code:text-current - prose-li:marker:text-current - prose-thead:border-b prose-thead:border-gray-6 dark:prose-thead:border-graydark-6 - prose-tr:border-gray-6 dark:prose-tr:border-graydark-6 - prose-img:mx-auto - prose-hr:border-gray-6 dark:prose-hr:border-graydark-6; - } -} diff --git a/docs/src/icons/chevron-right.astro b/docs/src/icons/chevron-right.astro deleted file mode 100644 index 5abeba6..0000000 --- a/docs/src/icons/chevron-right.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -import type { IconProps } from "./utils"; - -export type Props = IconProps; -const { size = 24, ...rest } = Astro.props; ---- - - diff --git a/docs/src/icons/edit.astro b/docs/src/icons/edit.astro deleted file mode 100644 index 9e7878f..0000000 --- a/docs/src/icons/edit.astro +++ /dev/null @@ -1,23 +0,0 @@ ---- -import type { IconProps } from "./utils"; - -export type Props = IconProps; -const { size = 24, ...rest } = Astro.props; ---- - - diff --git a/docs/src/icons/github.astro b/docs/src/icons/github.astro deleted file mode 100644 index 8b4e53d..0000000 --- a/docs/src/icons/github.astro +++ /dev/null @@ -1,24 +0,0 @@ ---- -import type { IconProps } from "./utils"; - -export type Props = IconProps; -const { size = 24, ...rest } = Astro.props; ---- - - diff --git a/docs/src/icons/menu.astro b/docs/src/icons/menu.astro deleted file mode 100644 index 5e5d662..0000000 --- a/docs/src/icons/menu.astro +++ /dev/null @@ -1,24 +0,0 @@ ---- -import type { IconProps } from "./utils"; - -export type Props = IconProps; -const { size = 24, ...rest } = Astro.props; ---- - - diff --git a/docs/src/icons/moon.astro b/docs/src/icons/moon.astro deleted file mode 100644 index 84cd71c..0000000 --- a/docs/src/icons/moon.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -import type { IconProps } from "./utils"; - -export type Props = IconProps; -const { size = 24, ...rest } = Astro.props; ---- - - diff --git a/docs/src/icons/sun.astro b/docs/src/icons/sun.astro deleted file mode 100644 index dcd6812..0000000 --- a/docs/src/icons/sun.astro +++ /dev/null @@ -1,30 +0,0 @@ ---- -import type { IconProps } from "./utils"; - -export type Props = IconProps; -const { size = 24, ...rest } = Astro.props; ---- - - diff --git a/docs/src/icons/utils.ts b/docs/src/icons/utils.ts deleted file mode 100644 index d35a56d..0000000 --- a/docs/src/icons/utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { HTMLAttributes } from "astro/types"; - -export type IconProps = HTMLAttributes<"svg"> & { size?: number }; diff --git a/docs/src/layouts/doc-layout.astro b/docs/src/layouts/doc-layout.astro deleted file mode 100644 index 5a16375..0000000 --- a/docs/src/layouts/doc-layout.astro +++ /dev/null @@ -1,55 +0,0 @@ ---- -import type { MarkdownLayoutProps } from "astro"; -import DocFooter from "components/doc-footer"; -import Header from "components/header"; -import Navigation from "components/navigation"; -import OnThisPage from "components/on-this-page"; -import { getGitUpdateDate } from "utils/get-git-update-date"; -import Layout from "./layout.astro"; - -type Frontmatter = { - description: string; -}; - -export type Props = MarkdownLayoutProps; -const { - frontmatter: { description }, - headings, - file, - url = "", -} = Astro.props; - -const title = - headings.find((heading) => heading.depth === 1)?.text || "@mrcaidev/hooks"; -const updateDate = await getGitUpdateDate(file); -const updateIso = updateDate.toISOString(); -const anchors = headings.filter((heading) => [1, 2].includes(heading.depth)); ---- - - - - - - - - - - - - - -
- -
-
-
-
- -
-
- -
-
- - - diff --git a/docs/src/layouts/layout.astro b/docs/src/layouts/layout.astro deleted file mode 100644 index 8e7803c..0000000 --- a/docs/src/layouts/layout.astro +++ /dev/null @@ -1,82 +0,0 @@ ---- -import "@fontsource/inter/400.css"; -import "@fontsource/inter/500.css"; -import "@fontsource/inter/700.css"; -import "global.css"; - -export type Props = { - title: string; - description: string; -}; -const { title, description } = Astro.props; - -const canonicalUrl = new URL(Astro.url.pathname, Astro.site); -const bannerUrl = new URL("/banner.png", Astro.site); ---- - - - - - - {title} - @mrcaidev/hooks - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/layouts/normal-layout.astro b/docs/src/layouts/normal-layout.astro deleted file mode 100644 index de153e1..0000000 --- a/docs/src/layouts/normal-layout.astro +++ /dev/null @@ -1,20 +0,0 @@ ---- -import Header from "components/header"; -import Layout from "./layout.astro"; - -export type Props = { - title: string; - description: string; -}; -const { title, description } = Astro.props; ---- - - - - - - -
- - - diff --git a/docs/src/pages/404.astro b/docs/src/pages/404.astro deleted file mode 100644 index 50ab079..0000000 --- a/docs/src/pages/404.astro +++ /dev/null @@ -1,25 +0,0 @@ ---- -import NormalLayout from "layouts/normal-layout.astro"; ---- - - -
- Logo -

Page Not Found

-

This page does not exist.

- - Back to homepage - -
-
diff --git a/docs/src/pages/index.astro b/docs/src/pages/index.astro deleted file mode 100644 index 03345e6..0000000 --- a/docs/src/pages/index.astro +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/docs/src/pages/installation.md b/docs/src/pages/installation.md deleted file mode 100644 index d10d343..0000000 --- a/docs/src/pages/installation.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -description: Install the package @mrcaidev/hooks in your project, and start to use it. ---- - -# Installation - -`@mrcaidev/hooks` is available in the npm registry. Use it with your favourite package manager! - -## Prerequisites - -You should have [React](https://www.npmjs.com/package/react) and [React DOM](https://www.npmjs.com/package/react-dom) installed beforehand. - -```sh -npm i react react-dom # npm -yarn add react react-dom # yarn -pnpm add react react-dom # pnpm -``` - -For TypeScript projects, you may also want to install [@types/react](https://www.npmjs.com/package/@types/react) and [@types/react-dom](https://www.npmjs.com/package/@types/react-dom). - -```sh -npm i @types/react @types/react-dom # npm -yarn add @types/react @types/react-dom # yarn -pnpm add @types/react @types/react-dom # pnpm -``` - -## Install the Package - -`@mrcaidev/hooks` is available in npm registry. Install it with your favourite package manager! - -``` -npm i @mrcaidev/hooks # npm -yarn add @mrcaidev/hooks # yarn -pnpm add @mrcaidev/hooks # pnpm -``` - -## Basic Usage - -Import hooks directly from the package. - -```ts -import { useBoolean } from "@mrcaidev/hooks"; - -export function Component() { - // Immediately start using hooks in your component, - // with full typing support! -} -``` diff --git a/docs/src/pages/introduction.md b/docs/src/pages/introduction.md deleted file mode 100644 index ed21907..0000000 --- a/docs/src/pages/introduction.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -description: The package @mrcaidev/hooks is a collection of React utility hooks, which is easy to use, fully typed, server ready and lightweight. ---- - -# Introdution - -`@mrcaidev/hooks` is a collection of React utility hooks. - -## Features - -- **Easy to use:** Good defaults, while highly customizable. -- **Fully typed:** Enjoy 100% type safety with TypeScript. -- **Server ready:** SSG/SSR support out of the box. -- **Lightweight:** <3KB gzipped. Tree-shaking supported. - -## Try it Out - -> Interested, but too lazy to create another repository for it? - -No worries, we have prepared a [playground](https://codesandbox.io/p/sandbox/thirsty-chaum-9oplqq) for you to try out the hooks right in the browser. - -This is also the official CodeSandbox template to create a minimal reproducible example. - -## Contributing - -Please read the [contributing guide](https://github.com/mrcaidev/hooks/blob/master/.github/CONTRIBUTING.md) before any contribution. - -> Currently this is really just a personal project. I'm trying to build a library that can make me proud of, while also learning React and Web APIs. But if you decide to help out, I believe it will definitely make this project better, and we can surely learn a lot from each other. - -## License - -[MIT](https://github.com/mrcaidev/hooks/blob/master/LICENSE) diff --git a/docs/src/pages/use-async-effect.md b/docs/src/pages/use-async-effect.md deleted file mode 100644 index 9433f4b..0000000 --- a/docs/src/pages/use-async-effect.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -description: The same as useEffect, but for async functions. ---- - -# useAsyncEffect - -The same as `useEffect`, but for async functions. - -## Signature - -```ts -useAsyncEffect(effect: () => Promise, deps?: unknown[]): void; -``` - -## Parameters - -### effect - -An async function, such as data fetching, subscriptions and timers. - -Cleanup function is currently not supported. - -### deps - -Dependencies of effect. The function will be executed every time one of the dependencies changes. - -Default: `undefined` - -## Example - -```tsx -import { useState } from "react"; -import { useAsyncEffect } from "@mrcaidev/hooks"; - -export function Component() { - const [message, setMessage] = useState(""); - - useAsyncEffect(async () => { - const data = await fetch("https://example.com"); - const json = await data.json(); - setMessage(json.message); - }, []); - - return

{message}

; -} -``` diff --git a/docs/src/pages/use-boolean.md b/docs/src/pages/use-boolean.md deleted file mode 100644 index 900e2b5..0000000 --- a/docs/src/pages/use-boolean.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -description: Use a boolean value. ---- - -# useBoolean - -Use a boolean value. - -Useful when managing the opening and closing of modals, drawers, etc. - -## Signature - -```ts -useBoolean(defaultValue?: boolean): { - value: boolean; - set: (value: boolean) => void; - toggle: () => void; - on: () => void; - off: () => void; -}; -``` - -## Parameters - -### defaultValue - -The initial boolean value. - -Default: `false` - -## Returns - -### value - -The stateful boolean value. - -### set - -Set value to either `true` or `false`. - -### toggle - -Toggle value between `true` and `false`. - -### on - -Set value to `true`. - -### off - -Set value to `false`. - -### Example - -```tsx -import { useBoolean } from "@mrcaidev/hooks"; - -export function Component() { - const { value, toggle } = useBoolean(); - - return ; -} -``` diff --git a/docs/src/plugins/autolink-headings.ts b/docs/src/plugins/autolink-headings.ts deleted file mode 100644 index 4e0b2bb..0000000 --- a/docs/src/plugins/autolink-headings.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { RehypePlugin } from "@astrojs/markdown-remark"; -import { h } from "hastscript"; -import type { Options } from "rehype-autolink-headings"; -import rehypeAutolinkHeadings from "rehype-autolink-headings"; - -const options: Options = { - group: () => h("div", { class: "group relative" }), - behavior: "after", - properties: { class: "absolute top-0 bottom-0 left-0 right-0" }, - content: () => [ - h( - "span", - { - ariaHidden: "true", - class: - "hidden group-hover:inline absolute top-1/2 -left-5 -translate-y-1/2", - }, - "#" - ), - h("span", { class: "sr-only" }, "This link goes to this heading"), - ], -}; - -export const autolinkHeadings: [RehypePlugin, Options] = [ - rehypeAutolinkHeadings, - options, -]; diff --git a/docs/src/plugins/inject-frontmatter.ts b/docs/src/plugins/inject-frontmatter.ts deleted file mode 100644 index 2b2609c..0000000 --- a/docs/src/plugins/inject-frontmatter.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { RemarkPlugin } from "@astrojs/markdown-remark"; - -export const injectFrontmatter: RemarkPlugin = () => { - return (_, { data }) => { - (data.astro as any).frontmatter.layout = "layouts/doc-layout.astro"; - }; -}; diff --git a/docs/src/utils/get-git-update-date.ts b/docs/src/utils/get-git-update-date.ts deleted file mode 100644 index 20de559..0000000 --- a/docs/src/utils/get-git-update-date.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { spawn } from "cross-spawn"; - -export async function getGitUpdateDate(file: string) { - return new Promise((resolve, reject) => { - const child = spawn("git", ["log", "-1", "--format=%ci", file]); - let stdout = ""; - - child.stdout.on("data", (data) => { - stdout += data; - }); - - child.on("close", () => { - resolve(stdout ? new Date(stdout) : new Date()); - }); - - child.on("error", reject); - }); -} diff --git a/docs/tailwind.config.cjs b/docs/tailwind.config.cjs deleted file mode 100644 index 43862f3..0000000 --- a/docs/tailwind.config.cjs +++ /dev/null @@ -1,19 +0,0 @@ -/** @type {import("tailwindcss").Config} */ -module.exports = { - content: [ - "src/{components,layouts,pages}/**/*.astro", - "src/plugins/autolink-headings.ts", - ], - darkMode: "class", - theme: { - extend: { - fontFamily: { - sans: ["Inter", "sans-serif"], - }, - }, - }, - plugins: [ - require("@tailwindcss/typography"), - require("tailwindcss-radix-colors"), - ], -}; diff --git a/docs/tsconfig.json b/docs/tsconfig.json deleted file mode 100644 index 7349ef8..0000000 --- a/docs/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "typescript-config-custom/base.json", - "compilerOptions": { - "baseUrl": "src", - "noEmit": true, - "resolveJsonModule": true, - "target": "ESNext" - }, - "include": ["src/**/*.ts", "src/**/*.json"] -} diff --git a/docs/vercel.json b/docs/vercel.json deleted file mode 100644 index c9663ea..0000000 --- a/docs/vercel.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "redirects": [ - { - "source": "/", - "destination": "/introduction" - } - ], - "git": { - "deploymentEnabled": { - "master": false - } - }, - "github": { - "silent": true - } -} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..6059ebb --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,17 @@ +import js from "@eslint/js"; +import prettier from "eslint-config-prettier"; +import ts from "typescript-eslint"; + +export default ts.config( + js.configs.recommended, + ...ts.configs.recommended, + prettier, + { + ignores: [ + "coverage", + "dist", + "docs/.vitepress/cache", + "docs/.vitepress/dist", + ], + }, +); diff --git a/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 0000000..13a6275 --- /dev/null +++ b/lint-staged.config.js @@ -0,0 +1,4 @@ +export default { + "*.{js,ts}": ["eslint --fix", "prettier --write"], + "*.{json,md}": "prettier --write", +}; diff --git a/package.json b/package.json index c9a5051..bacd5e2 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,78 @@ { - "name": "root", - "version": "0.0.0", - "private": true, + "name": "@mrcaidev/hooks", + "version": "0.9.0", + "description": "React utility hooks", + "keywords": [ + "react", + "hooks", + "typescript", + "ssr" + ], + "homepage": "https://hooks.mrcai.dev", + "bugs": "https://github.com/mrcaidev/hooks/issues", + "license": "MIT", + "author": { + "name": "Yuwang Cai", + "email": "mrcaidev@gmail.com", + "url": "https://mrcai.dev" + }, + "files": [ + "dist" + ], + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.umd.cjs" + } + }, + "module": "dist/index.js", + "main": "dist/index.umd.cjs", + "types": "dist/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/mrcaidev/hooks.git" + }, "type": "module", + "packageManager": "pnpm@9.12.3", "scripts": { - "build": "turbo run build", - "build:package": "turbo run build --filter @mrcaidev/hooks", - "build:docs": "turbo run build --filter docs", - "build:docs:nav": "node scripts/generate-navigation-json.js > docs/src/data/navigation.json", - "test": "turbo run test", - "lint": "turbo run lint:script", - "lint:script": "eslint . --fix --cache --cache-location ./node_modules/.cache/eslint/.eslintcache", - "format": "turbo run format:script", - "format:script": "prettier . --write --cache --plugin-search-dir=.", - "prepare": "husky install" + "build": "vite build", + "test": "vitest", + "prepare": "husky", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" }, "devDependencies": { - "commitlint": "^17.4.2", - "commitlint-config-custom": "workspace:^0.0.0", - "eslint": "^8.33.0", - "eslint-config-custom": "workspace:^0.0.0", - "husky": "^8.0.3", - "lint-staged": "^13.1.0", - "prettier": "^2.8.3", - "prettier-config-custom": "workspace:^0.0.0", - "turbo": "^1.7.3" + "@commitlint/cli": "^19.5.0", + "@commitlint/config-conventional": "^19.5.0", + "@commitlint/types": "^19.5.0", + "@eslint/js": "^9.14.0", + "@testing-library/react": "^16.0.1", + "@testing-library/user-event": "^14.5.2", + "@types/eslint-config-prettier": "^6.11.3", + "@types/eslint__js": "^8.42.3", + "@types/node": "^22.9.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitest/coverage-v8": "^2.1.4", + "eslint": "^9.14.0", + "eslint-config-prettier": "^9.1.0", + "husky": "^9.1.6", + "jsdom": "^25.0.1", + "lint-staged": "^15.2.10", + "prettier": "^3.3.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "typescript": "^5.6.3", + "typescript-eslint": "^8.13.0", + "vite": "^5.4.10", + "vite-plugin-dts": "^4.3.0", + "vite-tsconfig-paths": "^5.1.2", + "vitepress": "^1.5.0", + "vitest": "^2.1.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } } diff --git a/packages/commitlint-config-custom/index.json b/packages/commitlint-config-custom/index.json deleted file mode 100644 index c30e5a9..0000000 --- a/packages/commitlint-config-custom/index.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["@commitlint/config-conventional"] -} diff --git a/packages/commitlint-config-custom/package.json b/packages/commitlint-config-custom/package.json deleted file mode 100644 index e05fbcc..0000000 --- a/packages/commitlint-config-custom/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "commitlint-config-custom", - "version": "0.0.0", - "private": true, - "main": "index.json", - "dependencies": { - "@commitlint/config-conventional": "^17.4.2" - }, - "devDependencies": { - "commitlint": "^17.4.2" - }, - "peerDependencies": { - "commitlint": "^17.4.2" - } -} diff --git a/packages/eslint-config-custom/index.json b/packages/eslint-config-custom/index.json deleted file mode 100644 index 4c9e7b5..0000000 --- a/packages/eslint-config-custom/index.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/eslintrc", - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:react-hooks/recommended", - "plugin:astro/recommended", - "plugin:astro/jsx-a11y-recommended", - "turbo", - "prettier" - ], - "env": { - "browser": true, - "node": true, - "es2022": true - }, - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "overrides": [ - { - "files": ["*.ts", "*.astro"], - "rules": { - "no-undef": "off", - "@typescript-eslint/no-explicit-any": "off" - } - } - ] -} diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json deleted file mode 100644 index 717ed60..0000000 --- a/packages/eslint-config-custom/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "eslint-config-custom", - "version": "0.0.0", - "private": true, - "main": "index.json", - "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.50.0", - "@typescript-eslint/parser": "^5.50.0", - "eslint-config-prettier": "^8.6.0", - "eslint-config-turbo": "^0.0.7", - "eslint-plugin-astro": "^0.23.0", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react-hooks": "^4.6.0" - }, - "devDependencies": { - "eslint": "^8.33.0", - "typescript": "^4.9.5" - }, - "peerDependencies": { - "eslint": "^8.32.0", - "typescript": "^4.9.4" - } -} diff --git a/packages/hooks/README.md b/packages/hooks/README.md deleted file mode 100644 index 79436bb..0000000 --- a/packages/hooks/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# @mrcaidev/hooks - -A collection of React utility hooks. - -- **Easy to use:** Good defaults, while highly customizable. -- **Fully typed:** Enjoy 100% type safety with TypeScript. -- **Server ready:** SSG/SSR support out of the box. -- **Lightweight:** <3KB gzipped. Tree-shaking supported. - -## Getting started - -Please follow the [documentation](https://hooks.mrcai.dev) to get started with `@mrcaidev/hooks`. - -## Built with - -[![TypeScript](https://img.shields.io/badge/typescript-3178c6?style=for-the-badge&logo=typescript&logoColor=ffffff)](https://www.typescriptlang.org/) -[![React](https://img.shields.io/badge/react-23272f?style=for-the-badge&logo=react)](https://reactjs.org/) -[![Vite](https://img.shields.io/badge/vite-646cff?style=for-the-badge&logo=vite&logoColor=ffffff)](https://vitejs.dev/) -[![Vitest](https://img.shields.io/badge/vitest-6da13f?style=for-the-badge&logo=vitest&logoColor=ffffff)](https://vitest.dev/) -[![Testing Library](https://shields.io/badge/testing%20library-e33433?style=for-the-badge&logo=testinglibrary&logoColor=ffffff)](https://testing-library.com/) -[![Astro](https://img.shields.io/badge/astro-7e22ce?style=for-the-badge&logo=astro&logoColor=ffffff)](https://astro.build/) -[![Tailwind CSS](https://shields.io/badge/tailwind%20css-38bdf8?style=for-the-badge&logo=tailwindcss&logoColor=ffffff)](https://tailwindcss.com/) -[![pnpm](https://img.shields.io/badge/pnpm-f69220?style=for-the-badge&logo=pnpm&logoColor=ffffff)](https://pnpm.io/) -[![Turborepo](https://img.shields.io/badge/turborepo-000000?style=for-the-badge&logo=turborepo)](https://turbo.build/repo) -[![ESLint](https://shields.io/badge/eslint-4b32c3?style=for-the-badge&logo=eslint&logoColor=ffffff)](https://eslint.org/) -[![Prettier](https://shields.io/badge/prettier-24292e?style=for-the-badge&logo=prettier)](https://prettier.io/) -[![Commitlint](https://shields.io/badge/commitlint-121212?style=for-the-badge&logo=commitlint&logoColor=ffffff)](https://commitlint.js.org/) -[![EditorConfig](https://shields.io/badge/editorconfig-000?style=for-the-badge&logo=editorconfig&logoColor=ffffff)](https://editorconfig.org/) -[![Husky](https://shields.io/badge/husky-42b983?style=for-the-badge&logo=git&logoColor=ffffff)](https://typicode.github.io/husky/) -[![Lint staged](https://shields.io/badge/lint%20staged-f54d27?style=for-the-badge&logo=git&logoColor=ffffff)](https://github.com/okonet/lint-staged) - -## Contributing - -Please read the [contributing guide](https://github.com/mrcaidev/hooks/tree/master/.github/CONTRIBUTING.md) before any contribution. - -> Currently this is really just a personal project. I'm trying to build a library that can make me proud of, while also learning React and Web APIs. But if you decide to help out, I believe it will definitely make this project better, and we can surely learn a lot from each other. - -## License - -[MIT](https://github.com/mrcaidev/hooks/tree/master/LICENSE) diff --git a/packages/hooks/package.json b/packages/hooks/package.json deleted file mode 100644 index d7d4559..0000000 --- a/packages/hooks/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "@mrcaidev/hooks", - "version": "0.9.0", - "description": "React utility hooks", - "keywords": [ - "react", - "hooks", - "typescript" - ], - "homepage": "https://hooks.mrcai.dev", - "bugs": "https://github.com/mrcaidev/hooks/issues", - "license": "MIT", - "author": { - "name": "Yuwang Cai", - "email": "mrcaidev@gmail.com", - "url": "https://mrcai.dev" - }, - "files": [ - "dist" - ], - "type": "module", - "main": "dist/index.umd.cjs", - "module": "dist/index.js", - "types": "dist/index.d.ts", - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.umd.cjs" - } - }, - "repository": { - "type": "git", - "url": "https://github.com/mrcaidev/hooks", - "directory": "packages/hooks" - }, - "scripts": { - "build": "vite build", - "test": "vitest run", - "test:watch": "vitest", - "test:coverage": "vitest run --coverage" - }, - "devDependencies": { - "@testing-library/react": "^13.4.0", - "@types/node": "^18.11.18", - "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", - "@vitest/coverage-c8": "^0.28.4", - "fast-glob": "^3.2.12", - "jsdom": "^21.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "typescript": "^4.9.5", - "typescript-config-custom": "workspace:^0.0.0", - "vite": "^4.1.1", - "vite-plugin-dts": "^1.7.2", - "vite-tsconfig-paths": "^4.0.5", - "vitest": "^0.28.4" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - }, - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/", - "tag": "latest" - } -} diff --git a/packages/hooks/plugins/remove-redundant-dts.ts b/packages/hooks/plugins/remove-redundant-dts.ts deleted file mode 100644 index 78232cf..0000000 --- a/packages/hooks/plugins/remove-redundant-dts.ts +++ /dev/null @@ -1,11 +0,0 @@ -import glob from "fast-glob"; -import { rm } from "fs/promises"; -import { normalizePath } from "vite"; - -export async function removeRedundantDts() { - const files = await glob("*.d.ts", { - cwd: "dist", - ignore: ["!index.d.ts"], - }); - files.forEach((file) => rm(normalizePath(`dist/${file}`))); -} diff --git a/packages/hooks/src/types/events.d.ts b/packages/hooks/src/types/events.d.ts deleted file mode 100644 index 7f51949..0000000 --- a/packages/hooks/src/types/events.d.ts +++ /dev/null @@ -1,136 +0,0 @@ -export type EventMap = T extends HTMLVideoElement - ? HTMLVideoElementEventMap - : T extends HTMLBodyElement - ? HTMLBodyElementEventMap - : T extends HTMLMediaElement - ? HTMLMediaElementEventMap - : T extends SVGSVGElement - ? SVGSVGElementEventMap - : T extends Document - ? DocumentEventMap - : T extends HTMLElement - ? HTMLElementEventMap - : T extends IDBOpenDBRequest - ? IDBOpenDBRequestEventMap - : T extends MathMLElement - ? MathMLElementEventMap - : T extends OfflineAudioContext - ? OfflineAudioContextEventMap - : T extends ServiceWorker - ? ServiceWorkerEventMap - : T extends SVGElement - ? SVGElementEventMap - : T extends Window - ? WindowEventMap - : T extends Worker - ? WorkerEventMap - : T extends XMLHttpRequest - ? XMLHttpRequestEventMap - : T extends AbortSignal - ? AbortSignalEventMap - : T extends AbstractWorker - ? AbstractWorkerEventMap - : T extends Animation - ? AnimationEventMap - : T extends AudioScheduledSourceNode - ? AudioScheduledSourceNodeEventMap - : T extends AudioWorkletNode - ? AudioWorkletNodeEventMap - : T extends BaseAudioContext - ? BaseAudioContextEventMap - : T extends BroadcastChannel - ? BroadcastChannelEventMap - : T extends DocumentAndElementEventHandlers - ? DocumentAndElementEventHandlersEventMap - : T extends Element - ? ElementEventMap - : T extends EventSource - ? EventSourceEventMap - : T extends FileReader - ? FileReaderEventMap - : T extends FontFaceSet - ? FontFaceSetEventMap - : T extends GlobalEventHandlers - ? GlobalEventHandlersEventMap - : T extends IDBDatabase - ? IDBDatabaseEventMap - : T extends IDBRequest - ? IDBRequestEventMap - : T extends IDBTransaction - ? IDBTransactionEventMap - : T extends MediaDevices - ? MediaDevicesEventMap - : T extends MediaKeySession - ? MediaKeySessionEventMap - : T extends MediaQueryList - ? MediaQueryListEventMap - : T extends MediaRecorder - ? MediaRecorderEventMap - : T extends MediaSource - ? MediaSourceEventMap - : T extends MediaStream - ? MediaStreamEventMap - : T extends MediaStreamTrack - ? MediaStreamTrackEventMap - : T extends MessagePort - ? MessagePortEventMap - : T extends Notification - ? NotificationEventMap - : T extends PaymentRequest - ? PaymentRequestEventMap - : T extends Performance - ? PerformanceEventMap - : T extends PermissionStatus - ? PermissionStatusEventMap - : T extends PictureInPictureWindow - ? PictureInPictureWindowEventMap - : T extends RTCDTMFSender - ? RTCDTMFSenderEventMap - : T extends RTCDataChannel - ? RTCDataChannelEventMap - : T extends RTCDtlsTransport - ? RTCDtlsTransportEventMap - : T extends RTCIceTransport - ? RTCIceTransportEventMap - : T extends RTCPeerConnection - ? RTCPeerConnectionEventMap - : T extends RTCSctpTransport - ? RTCSctpTransportEventMap - : T extends RemotePlayback - ? RemotePlaybackEventMap - : T extends ScreenOrientation - ? ScreenOrientationEventMap - : T extends ServiceWorkerContainer - ? ServiceWorkerContainerEventMap - : T extends ServiceWorkerRegistration - ? ServiceWorkerRegistrationEventMap - : T extends ShadowRoot - ? ShadowRootEventMap - : T extends SourceBuffer - ? SourceBufferEventMap - : T extends SourceBufferList - ? SourceBufferListEventMap - : T extends SpeechSynthesis - ? SpeechSynthesisEventMap - : T extends SpeechSynthesisUtterance - ? SpeechSynthesisUtteranceEventMap - : T extends TextTrack - ? TextTrackEventMap - : T extends TextTrackCue - ? TextTrackCueEventMap - : T extends TextTrackList - ? TextTrackListEventMap - : T extends VisualViewport - ? VisualViewportEventMap - : T extends WebSocket - ? WebSocketEventMap - : T extends WindowEventHandlers - ? WindowEventHandlersEventMap - : T extends XMLHttpRequestEventTarget - ? XMLHttpRequestEventTargetEventMap - : Record; - -export type EventType = Extract< - keyof EventMap, - string ->; diff --git a/packages/hooks/src/types/utils.d.ts b/packages/hooks/src/types/utils.d.ts deleted file mode 100644 index 178d839..0000000 --- a/packages/hooks/src/types/utils.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type Fn = (...args: any) => any; - -export type Async = ( - ...args: Parameters -) => Promise>; diff --git a/packages/hooks/src/use-boolean.ts b/packages/hooks/src/use-boolean.ts deleted file mode 100644 index 384d804..0000000 --- a/packages/hooks/src/use-boolean.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useState } from "react"; - -/** - * Use a boolean value. - */ -export function useBoolean(defaultValue = false) { - const [value, setValue] = useState(defaultValue); - - const toggle = () => setValue((value) => !value); - const on = () => setValue(true); - const off = () => setValue(false); - - return { value, set: setValue, toggle, on, off }; -} diff --git a/packages/hooks/src/use-click-outside.ts b/packages/hooks/src/use-click-outside.ts deleted file mode 100644 index 11ba9e7..0000000 --- a/packages/hooks/src/use-click-outside.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { RefObject } from "react"; -import { useDocument } from "./use-document"; -import { useEventListener } from "./use-event-listener"; -import { useLatest } from "./use-latest"; - -/** - * Listen for click events outside of an element. - */ -export function useClickOutside( - ref: RefObject, - callback: (e: MouseEvent) => void -) { - const callbackRef = useLatest(callback); - const documentRef = useDocument(); - - useEventListener(documentRef, "mousedown", (e) => { - const container = ref.current; - if (!container) { - return; - } - - const isClickInside = container.contains(e.target as Node); - if (isClickInside) { - return; - } - - callbackRef.current(e); - }); -} diff --git a/packages/hooks/src/use-clipboard-text.ts b/packages/hooks/src/use-clipboard-text.ts deleted file mode 100644 index 3cc51f1..0000000 --- a/packages/hooks/src/use-clipboard-text.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { useEffect, useState } from "react"; -import { useDocument } from "./use-document"; -import { useEventListener } from "./use-event-listener"; -import { toError } from "./utils"; - -export type UseClipboardTextOptions = { - readOnMount?: boolean; -}; - -/** - * Manage text on clipboard. - */ -export function useClipboardText(options: UseClipboardTextOptions = {}) { - const { readOnMount = true } = options; - - const [text, setText] = useState(""); - const [error, setError] = useState(undefined); - - const read = async () => { - try { - setError(undefined); - const text = await navigator.clipboard.readText(); - setText(text); - } catch (err) { - setError(toError(err)); - } - }; - - const write = async (text: string) => { - try { - setError(undefined); - await navigator.clipboard.writeText(text); - setText(text); - } catch (err) { - setError(toError(err)); - } - }; - - useEffect(() => { - if (!readOnMount) { - return; - } - read(); - }, [readOnMount]); - - const documentRef = useDocument(); - useEventListener(documentRef, "cut", read); - useEventListener(documentRef, "copy", read); - - return { text, error, read, write }; -} diff --git a/packages/hooks/src/use-const.ts b/packages/hooks/src/use-const.ts deleted file mode 100644 index 6a8e495..0000000 --- a/packages/hooks/src/use-const.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { useMemo } from "react"; - -/** - * Make a value constant. - */ -export function useConst(fn: () => T) { - // eslint-disable-next-line react-hooks/exhaustive-deps - return useMemo(fn, []); -} diff --git a/packages/hooks/src/use-debounce.ts b/packages/hooks/src/use-debounce.ts deleted file mode 100644 index 7171f90..0000000 --- a/packages/hooks/src/use-debounce.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -export type UseDebounceOptions = { - timeout?: number; - onMount?: boolean; -}; - -/** - * Debounce a value. - */ -export function useDebounce(value: T, options: UseDebounceOptions = {}) { - const { timeout = 500, onMount = false } = options; - - const [debouncedValue, setDebouncedValue] = useState(value); - const shouldSkipRef = useRef(true); - - useEffect(() => { - if (!onMount && shouldSkipRef.current) { - shouldSkipRef.current = false; - return; - } - - const timer = setTimeout(() => setDebouncedValue(value), timeout); - return () => clearTimeout(timer); - }, [value, timeout, onMount]); - - return debouncedValue; -} diff --git a/packages/hooks/src/use-element-size.ts b/packages/hooks/src/use-element-size.ts deleted file mode 100644 index c63d34b..0000000 --- a/packages/hooks/src/use-element-size.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useEffect, useState, type RefObject } from "react"; - -/** - * Use the size of an element. - */ -export function useElementSize(ref: RefObject) { - const [width, setWidth] = useState(0); - const [height, setHeight] = useState(0); - - useEffect(() => { - const target = ref.current; - if (!target) { - return; - } - - const observer = new ResizeObserver((entries) => { - entries.forEach((entry) => { - const { clientWidth, clientHeight } = entry.target; - setWidth(clientWidth); - setHeight(clientHeight); - }); - }); - - observer.observe(target); - return () => observer.disconnect(); - }, [ref]); - - return { width, height }; -} diff --git a/packages/hooks/src/use-event-listener.ts b/packages/hooks/src/use-event-listener.ts deleted file mode 100644 index f5bea36..0000000 --- a/packages/hooks/src/use-event-listener.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { useEffect, type DependencyList, type RefObject } from "react"; -import type { EventMap, EventType } from "./types/events"; -import { useLatest } from "./use-latest"; - -export type UseEventListenerOptions = AddEventListenerOptions & { - extraDeps?: DependencyList; -}; - -/** - * Listen for any events. - */ -export function useEventListener>( - ref: RefObject, - type: K, - callback: (e: EventMap[K]) => void, - options: UseEventListenerOptions = {} -) { - const { - capture = false, - once = false, - passive = false, - extraDeps = [], - } = options; - - const callbackRef = useLatest(callback); - - useEffect(() => { - const target = ref.current; - if (!target) { - return; - } - - const listener = callbackRef.current as EventListener; - - target.addEventListener(type, listener, { capture, once, passive }); - return () => target.removeEventListener(type, listener); - - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ref, type, callbackRef, capture, once, passive, ...extraDeps]); -} diff --git a/packages/hooks/src/use-focus-trap.ts b/packages/hooks/src/use-focus-trap.ts deleted file mode 100644 index cdc5642..0000000 --- a/packages/hooks/src/use-focus-trap.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { RefObject } from "react"; -import { useEventListener } from "./use-event-listener"; - -/** - * Trap tab focus between two elements. - */ -export function useFocusTrap( - firstRef: RefObject, - lastRef: RefObject -) { - useEventListener(firstRef, "keydown", (e) => { - const first = firstRef.current; - const last = lastRef.current; - if (!first || !last) { - return; - } - - if (e.code !== "Tab" || !e.shiftKey) { - return; - } - - e.preventDefault(); - last.focus(); - }); - - useEventListener(lastRef, "keydown", (e) => { - const first = firstRef.current; - const last = lastRef.current; - if (!first || !last) { - return; - } - - if (e.code !== "Tab" || e.shiftKey) { - return; - } - - e.preventDefault(); - first.focus(); - }); -} diff --git a/packages/hooks/src/use-interval.ts b/packages/hooks/src/use-interval.ts deleted file mode 100644 index d34137c..0000000 --- a/packages/hooks/src/use-interval.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useEffect, type EffectCallback } from "react"; -import { useLatest } from "./use-latest"; - -/** - * Run an effect at a regular interval. - */ -export function useInterval(effect: EffectCallback, timeout = 500) { - const effectRef = useLatest(effect); - - useEffect(() => { - const timer = setInterval(effectRef.current, timeout); - return () => clearInterval(timer); - }, [effectRef, timeout]); -} diff --git a/packages/hooks/src/use-is-mounted.ts b/packages/hooks/src/use-is-mounted.ts deleted file mode 100644 index 7078213..0000000 --- a/packages/hooks/src/use-is-mounted.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { useEffect, useRef } from "react"; - -/** - * Check if the component is mounted. - */ -export function useIsMounted() { - const isMountedRef = useRef(false); - - useEffect(() => { - isMountedRef.current = true; - return () => { - isMountedRef.current = false; - }; - }, []); - - return isMountedRef; -} diff --git a/packages/hooks/src/use-keydown.ts b/packages/hooks/src/use-keydown.ts deleted file mode 100644 index f403eb1..0000000 --- a/packages/hooks/src/use-keydown.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { useDocument } from "./use-document"; -import { useEventListener } from "./use-event-listener"; -import { useLatest } from "./use-latest"; - -export type ModifierKeys = { - ctrl?: boolean; - shift?: boolean; - alt?: boolean; - meta?: boolean; -}; - -/** - * Listen for keydown events. - */ -export function useKeydown( - code: string, - callback: (e: KeyboardEvent) => void, - modifier: ModifierKeys = {} -) { - const { ctrl = false, shift = false, alt = false, meta = false } = modifier; - - const callbackRef = useLatest(callback); - const documentRef = useDocument(); - - useEventListener( - documentRef, - "keydown", - (e) => { - if ( - e.code !== code || - e.ctrlKey !== ctrl || - e.shiftKey !== shift || - e.altKey !== alt || - e.metaKey !== meta - ) { - return; - } - callbackRef.current(e); - }, - { extraDeps: [code, ctrl, shift, alt, meta] } - ); -} diff --git a/packages/hooks/src/use-local-storage.ts b/packages/hooks/src/use-local-storage.ts deleted file mode 100644 index 70471b6..0000000 --- a/packages/hooks/src/use-local-storage.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useStorage, type UseStorageOptions } from "./use-storage"; - -export type UseLocalStorageOptions = Omit< - UseStorageOptions, - "storageName" ->; - -/** - * Manage local storage. - */ -export function useLocalStorage( - key: string, - options: UseLocalStorageOptions = {} -) { - return useStorage(key, { storageName: "localStorage", ...options }); -} diff --git a/packages/hooks/src/use-selection.ts b/packages/hooks/src/use-selection.ts deleted file mode 100644 index 692dc42..0000000 --- a/packages/hooks/src/use-selection.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { useState } from "react"; -import { useDocument } from "./use-document"; -import { useEventListener } from "./use-event-listener"; - -export type UseSelectionOptions = { - sticky?: boolean; -}; - -/** - * Responds to user's text selection changes. - */ -export function useSelection(options: UseSelectionOptions = {}) { - const { sticky = false } = options; - - const [selection, setSelection] = useState(""); - const documentRef = useDocument(); - - useEventListener( - documentRef, - "mouseup", - () => { - const selection = document.getSelection()?.toString() ?? ""; - if (sticky && !selection) { - return; - } - setSelection(selection); - }, - { extraDeps: [sticky] } - ); - - return selection; -} diff --git a/packages/hooks/src/use-session-storage.ts b/packages/hooks/src/use-session-storage.ts deleted file mode 100644 index d93784a..0000000 --- a/packages/hooks/src/use-session-storage.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useStorage, type UseStorageOptions } from "./use-storage"; - -export type UseSessionStorageOptions = Omit< - UseStorageOptions, - "storageName" ->; - -/** - * Manage session storage. - */ -export function useSessionStorage( - key: string, - options: UseSessionStorageOptions = {} -) { - return useStorage(key, { storageName: "sessionStorage", ...options }); -} diff --git a/packages/hooks/src/use-storage.ts b/packages/hooks/src/use-storage.ts deleted file mode 100644 index 32c11f5..0000000 --- a/packages/hooks/src/use-storage.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { useEffect, useState } from "react"; -import { useLatest } from "./use-latest"; - -export type StorageName = "localStorage" | "sessionStorage"; - -export type UseStorageOptions = { - storageName: StorageName; - defaultValue?: T | undefined; - serializer?: (value: T) => string; - deserializer?: (value: string) => T; -}; - -/** - * Manage storage. - */ -export function useStorage(key: string, options: UseStorageOptions) { - const { - storageName, - defaultValue = undefined, - serializer = JSON.stringify, - deserializer = JSON.parse, - } = options; - - const storage = getStorage(storageName); - - const [value, setValue] = useState(defaultValue); - const deserializerRef = useLatest(deserializer); - - useEffect(() => { - const storedValue = getItem(key, { - storage, - deserializer: deserializerRef.current, - }); - setValue(storedValue ?? defaultValue); - }, [key, storage, defaultValue, deserializerRef]); - - const set: typeof setValue = (action) => { - const newValue = action instanceof Function ? action(value) : action; - setItem(key, newValue, { storage, serializer }); - setValue(newValue); - }; - - const remove = () => set(undefined); - - return { value, set, remove }; -} - -function getStorage(storageName: StorageName) { - try { - const map = { localStorage, sessionStorage }; - return map[storageName]; - } catch { - return undefined; - } -} - -type GetItemOptions = { - storage: Storage | undefined; - deserializer: (value: string) => T; -}; - -function getItem(key: string, options: GetItemOptions) { - const { storage, deserializer } = options; - - if (!storage) { - return null; - } - - try { - const value = storage.getItem(key); - if (value === null) { - return null; - } - return deserializer(value); - } catch { - return null; - } -} - -type SetItemOptions = { - storage: Storage | undefined; - serializer: (value: T) => string; -}; - -function setItem(key: string, value: T, options: SetItemOptions) { - const { storage, serializer } = options; - - if (!storage) { - return; - } - - try { - if (value === undefined) { - storage.removeItem(key); - return; - } - storage.setItem(key, serializer(value)); - } catch { - return; - } -} diff --git a/packages/hooks/src/use-theme.ts b/packages/hooks/src/use-theme.ts deleted file mode 100644 index a3917f4..0000000 --- a/packages/hooks/src/use-theme.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { useLocalStorage } from "./use-local-storage"; -import { useMediaQuery } from "./use-media-query"; - -export type Theme = "light" | "dark"; - -export type UseThemeOptions = { - defaultTheme?: Theme; - storageKey?: string; -}; - -/** - * Use current theme. - */ -export function useTheme(options: UseThemeOptions = {}) { - const { defaultTheme, storageKey = "theme" } = options; - - const isDarkOs = useMediaQuery("(prefers-color-scheme: dark)"); - const osTheme = isDarkOs ? "dark" : "light"; - - const { value: theme, set } = useLocalStorage(storageKey, { - defaultValue: defaultTheme ?? osTheme, - serializer: (value) => value, - deserializer: (value) => value as Theme, - }); - - const toggle = () => set((theme) => (theme === "dark" ? "light" : "dark")); - const setLight = () => set("light"); - const setDark = () => set("dark"); - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return { theme: theme!, set, toggle, setLight, setDark }; -} diff --git a/packages/hooks/src/use-throttle.ts b/packages/hooks/src/use-throttle.ts deleted file mode 100644 index d727617..0000000 --- a/packages/hooks/src/use-throttle.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -export type UseThrottleOptions = { - timeout?: number; - onMount?: boolean; -}; - -/** - * Throttle a value. - */ -export function useThrottle(value: T, options: UseThrottleOptions = {}) { - const { timeout = 500, onMount = false } = options; - - const shouldSkipRef = useRef(true); - const isCoolingDownRef = useRef(false); - const [throttledValue, setThrottledValue] = useState(value); - - useEffect(() => { - if (!onMount && shouldSkipRef.current) { - shouldSkipRef.current = false; - return; - } - - if (isCoolingDownRef.current) { - return; - } - - setThrottledValue(value); - - isCoolingDownRef.current = true; - setTimeout(() => { - isCoolingDownRef.current = false; - }, timeout); - }, [value, timeout, onMount]); - - return throttledValue; -} diff --git a/packages/hooks/src/use-timeout.ts b/packages/hooks/src/use-timeout.ts deleted file mode 100644 index 0ed1dde..0000000 --- a/packages/hooks/src/use-timeout.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useEffect, type EffectCallback } from "react"; -import { useLatest } from "./use-latest"; - -/** - * Run an effect after a timeout. - */ -export function useTimeout(effect: EffectCallback, timeout = 500) { - const effectRef = useLatest(effect); - - useEffect(() => { - const timer = setTimeout(effectRef.current, timeout); - return () => clearTimeout(timer); - }, [effectRef, timeout]); -} diff --git a/packages/hooks/src/use-title.ts b/packages/hooks/src/use-title.ts deleted file mode 100644 index 0c3e676..0000000 --- a/packages/hooks/src/use-title.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { useEffect } from "react"; - -/** - * Manage page title. - */ -export function useTitle(title: string) { - useEffect(() => { - document.title = title; - }, [title]); -} diff --git a/packages/hooks/src/use-unmount.ts b/packages/hooks/src/use-unmount.ts deleted file mode 100644 index 558f6cc..0000000 --- a/packages/hooks/src/use-unmount.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { useEffect } from "react"; - -/** - * Trigger effect before the component is unmounted. - */ -export function useUnmount(cleanup: () => void) { - // eslint-disable-next-line react-hooks/exhaustive-deps - useEffect(() => cleanup, []); -} diff --git a/packages/hooks/src/use-unsafe-once-effect.ts b/packages/hooks/src/use-unsafe-once-effect.ts deleted file mode 100644 index 37fa2fe..0000000 --- a/packages/hooks/src/use-unsafe-once-effect.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useEffect, useRef, type EffectCallback } from "react"; -import { useLatest } from "./use-latest"; - -/** - * Trigger effect only once, even under React 18 strict dev mode. - */ -export function useUnsafeOnceEffect(effect: EffectCallback) { - const effectRef = useLatest(effect); - const shouldSkipRef = useRef(false); - - useEffect(() => { - if (shouldSkipRef.current) { - return; - } - shouldSkipRef.current = true; - - return effectRef.current(); - }, [effectRef]); -} diff --git a/packages/hooks/src/use-update.ts b/packages/hooks/src/use-update.ts deleted file mode 100644 index 30526f6..0000000 --- a/packages/hooks/src/use-update.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { EffectCallback, useEffect, useRef } from "react"; -import { useLatest } from "./use-latest"; -import { useUnmount } from "./use-unmount"; - -/** - * Trigger effect after the component is updated. - */ -export function useUpdate(effect: EffectCallback) { - const effectRef = useLatest(effect); - const shouldSkipRef = useRef(true); - - useEffect(() => { - if (shouldSkipRef.current) { - shouldSkipRef.current = false; - return; - } - - return effectRef.current(); - }); - - useUnmount(() => { - shouldSkipRef.current = true; - }); -} diff --git a/packages/hooks/src/utils.ts b/packages/hooks/src/utils.ts deleted file mode 100644 index a192b70..0000000 --- a/packages/hooks/src/utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function toError(err: unknown) { - return err instanceof Error ? err : new Error(String(err)); -} diff --git a/packages/hooks/tests/use-clipboard-text.test.ts b/packages/hooks/tests/use-clipboard-text.test.ts deleted file mode 100644 index 4d98e8c..0000000 --- a/packages/hooks/tests/use-clipboard-text.test.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { act, fireEvent, renderHook, waitFor } from "@testing-library/react"; -import { useClipboardText } from "src"; - -let clipboard = "hello"; -const readText = vi.fn(async () => clipboard); -const writeText = vi.fn(async (text: string) => (clipboard = text)); - -beforeAll(() => { - vi.stubGlobal("navigator", { - clipboard: { - readText, - writeText, - }, - }); -}); -afterAll(() => { - vi.unstubAllGlobals(); -}); -beforeEach(() => { - clipboard = "hello"; - readText.mockClear(); - writeText.mockClear(); -}); - -it("reads clipboard on mount", async () => { - const { result } = renderHook(() => useClipboardText()); - await waitFor(() => expect(result.current.text).toEqual("hello")); - expect(result.current.error).toEqual(undefined); - expect(readText).toHaveBeenCalledTimes(1); -}); - -it("can disable read on mount", async () => { - const { result } = renderHook(() => useClipboardText({ readOnMount: false })); - expect(result.current.text).toEqual(""); - expect(result.current.error).toEqual(undefined); - expect(readText).toHaveBeenCalledTimes(0); -}); - -it("responds to stateful readOnMount", async () => { - const { result, rerender } = renderHook( - (readOnMount) => useClipboardText({ readOnMount }), - { initialProps: false } - ); - expect(result.current.text).toEqual(""); - expect(result.current.error).toEqual(undefined); - expect(readText).toHaveBeenCalledTimes(0); - - rerender(true); - await waitFor(() => expect(result.current.text).toEqual("hello")); - expect(result.current.error).toEqual(undefined); - expect(readText).toHaveBeenCalledTimes(1); -}); - -it("can manually read", async () => { - const { result } = renderHook(() => useClipboardText({ readOnMount: false })); - expect(result.current.text).toEqual(""); - expect(result.current.error).toEqual(undefined); - expect(readText).toHaveBeenCalledTimes(0); - - await act(async () => await result.current.read()); - await waitFor(() => expect(result.current.text).toEqual("hello")); - expect(result.current.error).toEqual(undefined); - expect(readText).toHaveBeenCalledTimes(1); -}); - -it("can manually write", async () => { - const { result } = renderHook(() => useClipboardText()); - await waitFor(() => expect(result.current.text).toEqual("hello")); - expect(result.current.error).toEqual(undefined); - expect(writeText).toHaveBeenCalledTimes(0); - - await act(async () => await result.current.write("world")); - await waitFor(() => expect(result.current.text).toEqual("world")); - expect(result.current.error).toEqual(undefined); - expect(writeText).toHaveBeenCalledTimes(1); -}); - -it("responds to cut events", async () => { - const { result } = renderHook(() => useClipboardText()); - await waitFor(() => expect(result.current.text).toEqual("hello")); - expect(result.current.error).toEqual(undefined); - - clipboard = "world"; - fireEvent.cut(document); - await waitFor(() => expect(result.current.text).toEqual("world")); - expect(result.current.error).toEqual(undefined); -}); - -it("responds to copy events", async () => { - const { result } = renderHook(() => useClipboardText()); - await waitFor(() => expect(result.current.text).toEqual("hello")); - expect(result.current.error).toEqual(undefined); - - clipboard = "world"; - fireEvent.copy(document); - await waitFor(() => expect(result.current.text).toEqual("world")); - expect(result.current.error).toEqual(undefined); -}); - -it("returns error when read fails", async () => { - const error = new Error("read failed"); - readText.mockImplementationOnce(async () => { - throw error; - }); - - const { result } = renderHook(() => useClipboardText()); - await waitFor(() => expect(result.current.error).toEqual(error)); - expect(result.current.text).toEqual(""); -}); - -it("recovers from error on any successful read", async () => { - readText.mockImplementationOnce(async () => { - throw new Error("fail"); - }); - - const { result } = renderHook(() => useClipboardText()); - await waitFor(() => expect(result.current.error).not.toEqual(undefined)); - - await act(async () => await result.current.write("world")); - await waitFor(() => expect(result.current.text).toEqual("world")); - expect(result.current.error).toEqual(undefined); -}); - -it("returns error when write fails", async () => { - const error = new Error("write failed"); - writeText.mockImplementationOnce(async () => { - throw error; - }); - - const { result } = renderHook(() => useClipboardText()); - await waitFor(() => expect(result.current.text).toEqual("hello")); - expect(result.current.error).toEqual(undefined); - - await act(async () => await result.current.write("world")); - await waitFor(() => expect(result.current.error).toEqual(error)); - expect(result.current.text).toEqual("hello"); -}); - -it("recovers from error on any successful write", async () => { - readText.mockImplementationOnce(async () => { - throw new Error("fail"); - }); - - const { result } = renderHook(() => useClipboardText()); - await waitFor(() => expect(result.current.error).not.toEqual(undefined)); - - await act(async () => await result.current.write("world")); - await waitFor(() => expect(result.current.text).toEqual("world")); - expect(result.current.error).toEqual(undefined); -}); diff --git a/packages/hooks/tests/use-const.test.ts b/packages/hooks/tests/use-const.test.ts deleted file mode 100644 index efe7f94..0000000 --- a/packages/hooks/tests/use-const.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { renderHook } from "@testing-library/react"; -import { useConst } from "src"; - -it("remembers the value", () => { - const { result } = renderHook(() => useConst(() => 1)); - expect(result.current).toEqual(1); -}); - -it("computes only once across re-renders", () => { - const compute = vi.fn(); - - const { rerender } = renderHook(() => useConst(compute)); - expect(compute).toHaveBeenCalledTimes(1); - - rerender(); - expect(compute).toHaveBeenCalledTimes(1); -}); diff --git a/packages/hooks/tests/use-element-size.test.ts b/packages/hooks/tests/use-element-size.test.ts deleted file mode 100644 index 8fa33da..0000000 --- a/packages/hooks/tests/use-element-size.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { renderHook, screen } from "@testing-library/react"; -import { useElementSize } from "src"; - -beforeAll(() => { - document.body.innerHTML = ` - - `; - - vi.stubGlobal("ResizeObserver", function (this: Record) { - this.observe = () => 0; - this.disconnect = () => 0; - }); -}); -afterAll(() => { - vi.unstubAllGlobals(); -}); - -it("reads the size of element", () => { - const target = screen.getByRole("textbox"); - const { result } = renderHook(() => useElementSize({ current: target })); - expect(result.current.width).not.toEqual(undefined); - expect(result.current.height).not.toEqual(undefined); -}); - -it("does not throw with null ref", () => { - const { result } = renderHook(() => useElementSize({ current: null })); - expect(result.current.width).not.toEqual(undefined); - expect(result.current.height).not.toEqual(undefined); -}); diff --git a/packages/hooks/tests/use-event-listener.test.ts b/packages/hooks/tests/use-event-listener.test.ts deleted file mode 100644 index 08bcf9f..0000000 --- a/packages/hooks/tests/use-event-listener.test.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { fireEvent, renderHook, screen } from "@testing-library/react"; -import { useEventListener } from "src"; - -beforeAll(() => { - document.body.innerHTML = ` -
- `; -}); - -it("responds to document events", () => { - const callback = vi.fn(); - - renderHook(() => useEventListener({ current: document }, "click", callback)); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.click(document.body); - expect(callback).toHaveBeenCalledTimes(1); - - fireEvent.click(document.body); - expect(callback).toHaveBeenCalledTimes(2); -}); - -it("responds to element events", () => { - const target = screen.getByTestId("target"); - const callback = vi.fn(); - - renderHook(() => useEventListener({ current: target }, "click", callback)); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.click(target); - expect(callback).toHaveBeenCalledTimes(1); - - fireEvent.click(target); - expect(callback).toHaveBeenCalledTimes(2); -}); - -it("responds to window events", () => { - const callback = vi.fn(); - - renderHook(() => useEventListener({ current: window }, "click", callback)); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.click(window); - expect(callback).toHaveBeenCalledTimes(1); - - fireEvent.click(window); - expect(callback).toHaveBeenCalledTimes(2); -}); - -it("does not throw with null ref", () => { - const callback = vi.fn(); - - renderHook(() => useEventListener({ current: null }, "click", callback)); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.click(document.body); - expect(callback).toHaveBeenCalledTimes(0); -}); - -it("responds to stateful event type", () => { - const callback = vi.fn(); - - const { rerender } = renderHook( - (type) => useEventListener({ current: document }, type, callback), - { initialProps: "click" as keyof DocumentEventMap } - ); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.click(document.body); - expect(callback).toHaveBeenCalledTimes(1); - - rerender("keydown"); - fireEvent.keyDown(document.body); - expect(callback).toHaveBeenCalledTimes(2); - - fireEvent.click(document.body); - expect(callback).toHaveBeenCalledTimes(2); -}); - -it.skip("works with capture option", () => { - const target = screen.getByTestId("target"); - const callOrder: string[] = []; - const documentCallback = vi.fn(() => callOrder.push("document")); - const targetCallback = vi.fn(() => callOrder.push("target")); - - renderHook(() => - useEventListener({ current: document }, "click", documentCallback, { - capture: true, - }) - ); - renderHook(() => - useEventListener({ current: target }, "click", targetCallback) - ); - expect(documentCallback).toHaveBeenCalledTimes(0); - expect(targetCallback).toHaveBeenCalledTimes(0); - expect(callOrder).toEqual([]); - - fireEvent.click(target); - expect(documentCallback).toHaveBeenCalledTimes(1); - expect(targetCallback).toHaveBeenCalledTimes(1); - expect(callOrder).toEqual(["document", "target"]); -}); - -it.skip("works with passive option", () => { - const callback = vi.fn((e: MouseEvent) => e.preventDefault()); - - renderHook(() => - useEventListener({ current: document }, "click", callback, { - passive: true, - }) - ); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.click(document.body); - expect(callback).toHaveBeenCalledTimes(1); - expect(callback).toThrow(); -}); - -it.skip("works with once option", () => { - const callback = vi.fn(); - - renderHook(() => - useEventListener({ current: document }, "click", callback, { once: true }) - ); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.click(document.body); - expect(callback).toHaveBeenCalledTimes(1); - - fireEvent.click(document.body); - expect(callback).toHaveBeenCalledTimes(1); -}); diff --git a/packages/hooks/tests/use-focus-trap.test.ts b/packages/hooks/tests/use-focus-trap.test.ts deleted file mode 100644 index 9f6f179..0000000 --- a/packages/hooks/tests/use-focus-trap.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { fireEvent, renderHook, screen } from "@testing-library/react"; -import { useFocusTrap } from "src"; - -beforeAll(() => { - document.body.innerHTML = ` - - - - `; -}); - -it("traps the focus", () => { - const first = screen.getByTestId("first"); - const last = screen.getByTestId("last"); - first.focus(); - - renderHook(() => useFocusTrap({ current: first }, { current: last })); - expect(document.activeElement).toEqual(first); - - fireEvent.keyDown(first, { code: "Tab", shiftKey: true }); - expect(document.activeElement).toEqual(last); - - fireEvent.keyDown(last, { code: "Tab" }); - expect(document.activeElement).toEqual(first); -}); - -it("does not throw on other keydown events", () => { - const first = screen.getByTestId("first"); - const last = screen.getByTestId("last"); - first.focus(); - - renderHook(() => useFocusTrap({ current: first }, { current: last })); - expect(document.activeElement).toEqual(first); - - fireEvent.keyDown(first, { code: "Enter" }); - expect(document.activeElement).toEqual(first); - - fireEvent.keyDown(last, { code: "Escape" }); - expect(document.activeElement).toEqual(first); -}); - -it("does not throw with null ref", () => { - const last = screen.getByTestId("last"); - last.focus(); - - renderHook(() => useFocusTrap({ current: null }, { current: null })); - expect(document.activeElement).toEqual(last); - - fireEvent.keyDown(last, { code: "Tab" }); - expect(document.activeElement).toEqual(last); -}); diff --git a/packages/hooks/tests/use-hover.test.ts b/packages/hooks/tests/use-hover.test.ts deleted file mode 100644 index d39a370..0000000 --- a/packages/hooks/tests/use-hover.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { fireEvent, renderHook, screen } from "@testing-library/react"; -import { useHover } from "src"; - -beforeAll(() => { - document.body.innerHTML = ` -
- `; -}); - -it("responds to hover events", () => { - const target = screen.getByTestId("target"); - - const { result } = renderHook(() => useHover({ current: target })); - expect(result.current).toEqual(false); - - fireEvent.mouseEnter(target); - expect(result.current).toEqual(true); - - fireEvent.mouseLeave(target); - expect(result.current).toEqual(false); -}); - -it("does not throw with null ref", () => { - const target = screen.getByTestId("target"); - - const { result } = renderHook(() => useHover({ current: null })); - expect(result.current).toEqual(false); - - fireEvent.mouseEnter(target); - expect(result.current).toEqual(false); - - fireEvent.mouseLeave(target); - expect(result.current).toEqual(false); -}); diff --git a/packages/hooks/tests/use-interval.test.ts b/packages/hooks/tests/use-interval.test.ts deleted file mode 100644 index 0044a53..0000000 --- a/packages/hooks/tests/use-interval.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { renderHook } from "@testing-library/react"; -import { useInterval } from "src"; - -beforeAll(() => { - vi.useFakeTimers(); -}); -afterAll(() => { - vi.useRealTimers(); -}); -afterEach(() => { - vi.clearAllTimers(); -}); - -it("triggers effect after every timeout", () => { - const effect = vi.fn(); - - renderHook(() => useInterval(effect)); - expect(effect).toHaveBeenCalledTimes(0); - - vi.advanceTimersByTime(499); - expect(effect).toHaveBeenCalledTimes(0); - - vi.advanceTimersByTime(1); - expect(effect).toHaveBeenCalledTimes(1); - - vi.advanceTimersByTime(499); - expect(effect).toHaveBeenCalledTimes(1); - - vi.advanceTimersByTime(1); - expect(effect).toHaveBeenCalledTimes(2); -}); - -it("can customize timeout", () => { - const effect = vi.fn(); - - renderHook(() => useInterval(effect, 100)); - expect(effect).toHaveBeenCalledTimes(0); - - vi.advanceTimersByTime(99); - expect(effect).toHaveBeenCalledTimes(0); - - vi.advanceTimersByTime(1); - expect(effect).toHaveBeenCalledTimes(1); - - vi.advanceTimersByTime(99); - expect(effect).toHaveBeenCalledTimes(1); - - vi.advanceTimersByTime(1); - expect(effect).toHaveBeenCalledTimes(2); -}); diff --git a/packages/hooks/tests/use-is-mounted.test.ts b/packages/hooks/tests/use-is-mounted.test.ts deleted file mode 100644 index 164640c..0000000 --- a/packages/hooks/tests/use-is-mounted.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { renderHook } from "@testing-library/react"; -import { useIsMounted } from "src"; - -it("returns true on mount", () => { - const { result } = renderHook(() => useIsMounted()); - expect(result.current.current).toEqual(true); -}); - -it("returns true on update", () => { - const { result, rerender } = renderHook(() => useIsMounted()); - expect(result.current.current).toEqual(true); - - rerender(); - expect(result.current.current).toEqual(true); -}); - -it("returns false on unmount", () => { - const { result, unmount } = renderHook(() => useIsMounted()); - expect(result.current.current).toEqual(true); - - unmount(); - expect(result.current.current).toEqual(false); -}); diff --git a/packages/hooks/tests/use-keydown.test.ts b/packages/hooks/tests/use-keydown.test.ts deleted file mode 100644 index 7c25576..0000000 --- a/packages/hooks/tests/use-keydown.test.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { fireEvent, renderHook } from "@testing-library/react"; -import { useKeydown } from "src"; - -it("responds to target keydown", () => { - const callback = vi.fn(); - - renderHook(() => useKeydown("Tab", callback)); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.keyDown(document.body, { code: "Tab" }); - expect(callback).toHaveBeenCalledTimes(1); - - fireEvent.keyDown(document.body, { code: "Tab" }); - expect(callback).toHaveBeenCalledTimes(2); -}); - -it("does not respond to irrelevant keydown", () => { - const callback = vi.fn(); - - renderHook(() => useKeydown("Tab", callback)); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.keyDown(document.body, { code: "Enter" }); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.keyDown(document.body, { code: "Escape" }); - expect(callback).toHaveBeenCalledTimes(0); -}); - -it("responds to stateful key code", () => { - const callback = vi.fn(); - - const { rerender } = renderHook((code) => useKeydown(code, callback), { - initialProps: "Tab", - }); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.keyDown(document.body, { code: "Tab" }); - expect(callback).toHaveBeenCalledTimes(1); - - rerender("Enter"); - fireEvent.keyDown(document.body, { code: "Enter" }); - expect(callback).toHaveBeenCalledTimes(2); - - fireEvent.keyDown(document.body, { code: "Tab" }); - expect(callback).toHaveBeenCalledTimes(2); -}); - -it("requires pressed modifier keys to be exactly the same", () => { - const callback = vi.fn(); - - renderHook(() => useKeydown("Tab", callback, { ctrl: true, shift: true })); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.keyDown(document.body, { code: "Tab" }); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.keyDown(document.body, { code: "Tab", ctrlKey: true }); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.keyDown(document.body, { - code: "Tab", - ctrlKey: true, - shiftKey: true, - }); - expect(callback).toHaveBeenCalledTimes(1); - - fireEvent.keyDown(document.body, { - code: "Tab", - ctrlKey: true, - shiftKey: true, - altKey: true, - }); - expect(callback).toHaveBeenCalledTimes(1); -}); - -it("responds to stateful modifier keys", () => { - const callback = vi.fn(); - - const { rerender } = renderHook( - (ctrl) => useKeydown("Tab", callback, { ctrl }), - { initialProps: false } - ); - expect(callback).toHaveBeenCalledTimes(0); - - fireEvent.keyDown(document.body, { code: "Tab" }); - expect(callback).toHaveBeenCalledTimes(1); - - rerender(true); - fireEvent.keyDown(document.body, { code: "Tab", ctrlKey: true }); - expect(callback).toHaveBeenCalledTimes(2); - - fireEvent.keyDown(document.body, { code: "Tab" }); - expect(callback).toHaveBeenCalledTimes(2); -}); diff --git a/packages/hooks/tests/use-local-storage.test.ts b/packages/hooks/tests/use-local-storage.test.ts deleted file mode 100644 index e527351..0000000 --- a/packages/hooks/tests/use-local-storage.test.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { act, renderHook } from "@testing-library/react"; -import { useLocalStorage } from "src"; - -afterEach(() => localStorage.clear()); - -describe("without stored value", () => { - it("defaults to undefined", () => { - const { result } = renderHook(() => useLocalStorage("age")); - expect(result.current.value).toEqual(undefined); - expect(localStorage.getItem("age")).toEqual(null); - }); - - it("can customize default value", () => { - const { result } = renderHook(() => - useLocalStorage("age", { defaultValue: 24 }) - ); - expect(result.current.value).toEqual(24); - expect(localStorage.getItem("age")).toEqual(null); - }); - - it("responds to stateful default value", () => { - const { result, rerender } = renderHook( - (defaultValue) => useLocalStorage("age", { defaultValue }), - { initialProps: 24 } - ); - expect(result.current.value).toEqual(24); - expect(localStorage.getItem("age")).toEqual(null); - - rerender(18); - expect(result.current.value).toEqual(18); - expect(localStorage.getItem("age")).toEqual(null); - }); - - it("can create value in storage when setting", () => { - const { result } = renderHook(() => useLocalStorage("age")); - expect(result.current.value).toEqual(undefined); - expect(localStorage.getItem("age")).toEqual(null); - - act(() => result.current.set(18)); - expect(result.current.value).toEqual(18); - expect(localStorage.getItem("age")).toEqual("18"); - }); - - it("does nothing when removing", () => { - const { result } = renderHook(() => useLocalStorage("age")); - expect(result.current.value).toEqual(undefined); - expect(localStorage.getItem("age")).toEqual(null); - - act(() => result.current.remove()); - expect(result.current.value).toEqual(undefined); - expect(localStorage.getItem("age")).toEqual(null); - }); -}); - -describe("with stored value", () => { - beforeEach(() => localStorage.setItem("age", "18")); - - it("defaults to stored value", () => { - const { result } = renderHook(() => useLocalStorage("age")); - expect(result.current.value).toEqual(18); - expect(localStorage.getItem("age")).toEqual("18"); - }); - - it("responds to stateful storage key", () => { - const { result, rerender } = renderHook((key) => useLocalStorage(key), { - initialProps: "age", - }); - expect(result.current.value).toEqual(18); - expect(localStorage.getItem("age")).toEqual("18"); - - rerender("name"); - expect(result.current.value).toEqual(undefined); - expect(localStorage.getItem("name")).toEqual(null); - }); - - it("ignores default value", () => { - const { result } = renderHook(() => - useLocalStorage("age", { defaultValue: 24 }) - ); - expect(result.current.value).toEqual(18); - expect(localStorage.getItem("age")).toEqual("18"); - }); - - it("can customize serializer and deserializer", () => { - const { result } = renderHook(() => - useLocalStorage("age", { - serializer: (num) => String(num + 1), - deserializer: (str) => Number(str) - 1, - }) - ); - expect(result.current.value).toEqual(17); - expect(localStorage.getItem("age")).toEqual("18"); - - act(() => result.current.set(24)); - expect(result.current.value).toEqual(24); - expect(localStorage.getItem("age")).toEqual("25"); - - act(() => result.current.remove()); - expect(result.current.value).toEqual(undefined); - expect(localStorage.getItem("age")).toEqual(null); - }); - - it("can set storage", () => { - const { result } = renderHook(() => useLocalStorage("age")); - expect(result.current.value).toEqual(18); - expect(localStorage.getItem("age")).toEqual("18"); - - act(() => result.current.set(24)); - expect(result.current.value).toEqual(24); - expect(localStorage.getItem("age")).toEqual("24"); - }); - - it("can set storage with a function", () => { - const { result } = renderHook(() => useLocalStorage("age")); - expect(result.current.value).toEqual(18); - expect(localStorage.getItem("age")).toEqual("18"); - - act(() => result.current.set((prev: number) => prev + 6)); - expect(result.current.value).toEqual(24); - expect(localStorage.getItem("age")).toEqual("24"); - }); - - it("can remove storage", () => { - const { result } = renderHook(() => useLocalStorage("age")); - expect(result.current.value).toEqual(18); - expect(localStorage.getItem("age")).toEqual("18"); - - act(() => result.current.remove()); - expect(result.current.value).toEqual(undefined); - expect(localStorage.getItem("age")).toEqual(null); - }); - - it("can remove storage by setting value to undefined", () => { - const { result } = renderHook(() => useLocalStorage("age")); - expect(result.current.value).toEqual(18); - expect(localStorage.getItem("age")).toEqual("18"); - - act(() => result.current.set(undefined)); - expect(result.current.value).toEqual(undefined); - expect(localStorage.getItem("age")).toEqual(null); - }); -}); diff --git a/packages/hooks/tests/use-media-query.test.ts b/packages/hooks/tests/use-media-query.test.ts deleted file mode 100644 index 9bcddcc..0000000 --- a/packages/hooks/tests/use-media-query.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { renderHook } from "@testing-library/react"; -import { useMediaQuery } from "src"; -import { matchMedia } from "./utils/match-media"; - -beforeAll(() => { - vi.stubGlobal("matchMedia", matchMedia); -}); -afterAll(() => { - vi.unstubAllGlobals(); -}); -beforeEach(() => { - window.innerWidth = 1024; -}); - -it("returns true if matched", () => { - const { result } = renderHook(() => useMediaQuery("(max-width: 1280px)")); - expect(result.current).toEqual(true); -}); - -it("returns false if not matched", () => { - const { result } = renderHook(() => useMediaQuery("(max-width: 640px)")); - expect(result.current).toEqual(false); -}); - -it("responds to stateful query", () => { - const { result, rerender } = renderHook((query) => useMediaQuery(query), { - initialProps: "max-width: 1280px", - }); - expect(result.current).toEqual(true); - - rerender("max-width: 640px"); - expect(result.current).toEqual(false); -}); diff --git a/packages/hooks/tests/use-selection.test.ts b/packages/hooks/tests/use-selection.test.ts deleted file mode 100644 index fb341b9..0000000 --- a/packages/hooks/tests/use-selection.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { fireEvent, renderHook, screen } from "@testing-library/react"; -import { useSelection } from "src"; - -beforeAll(() => { - document.body.innerHTML = ` -

Hello

- `; -}); - -function selectOneLetter() { - const text = screen.getByText("Hello").firstChild as Text; - document.getSelection()?.setBaseAndExtent(text, 0, text, 1); - fireEvent.mouseUp(document); -} - -function selectTwoLetters() { - const text = screen.getByText("Hello").firstChild as Text; - document.getSelection()?.setBaseAndExtent(text, 0, text, 2); - fireEvent.mouseUp(document); -} - -function cancelSelection() { - document.getSelection()?.removeAllRanges(); - fireEvent.mouseUp(document); -} - -it("responds to selection changes", () => { - const { result } = renderHook(() => useSelection()); - expect(result.current).toEqual(""); - - selectOneLetter(); - expect(result.current).toEqual("H"); - - cancelSelection(); - expect(result.current).toEqual(""); - - selectTwoLetters(); - expect(result.current).toEqual("He"); -}); - -it("can keep selection after cancelling selection", () => { - const { result } = renderHook(() => useSelection({ sticky: true })); - selectOneLetter(); - expect(result.current).toEqual("H"); - - cancelSelection(); - expect(result.current).toEqual("H"); -}); - -it("responds to stateful sticky", () => { - const { result, rerender } = renderHook( - (sticky) => useSelection({ sticky }), - { initialProps: false } - ); - selectOneLetter(); - expect(result.current).toEqual("H"); - - cancelSelection(); - expect(result.current).toEqual(""); - - rerender(true); - expect(result.current).toEqual(""); - - selectOneLetter(); - expect(result.current).toEqual("H"); - - cancelSelection(); - expect(result.current).toEqual("H"); -}); diff --git a/packages/hooks/tests/use-session-storage.test.ts b/packages/hooks/tests/use-session-storage.test.ts deleted file mode 100644 index e5495c0..0000000 --- a/packages/hooks/tests/use-session-storage.test.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { act, renderHook } from "@testing-library/react"; -import { useSessionStorage } from "src"; - -afterEach(() => sessionStorage.clear()); - -describe("without stored value", () => { - it("defaults to undefined", () => { - const { result } = renderHook(() => useSessionStorage("age")); - expect(result.current.value).toEqual(undefined); - expect(sessionStorage.getItem("age")).toEqual(null); - }); - - it("can customize default value", () => { - const { result } = renderHook(() => - useSessionStorage("age", { defaultValue: 24 }) - ); - expect(result.current.value).toEqual(24); - expect(sessionStorage.getItem("age")).toEqual(null); - }); - - it("responds to stateful default value", () => { - const { result, rerender } = renderHook( - (defaultValue) => useSessionStorage("age", { defaultValue }), - { initialProps: 24 } - ); - expect(result.current.value).toEqual(24); - expect(sessionStorage.getItem("age")).toEqual(null); - - rerender(18); - expect(result.current.value).toEqual(18); - expect(sessionStorage.getItem("age")).toEqual(null); - }); - - it("can create value in storage when setting", () => { - const { result } = renderHook(() => useSessionStorage("age")); - expect(result.current.value).toEqual(undefined); - expect(sessionStorage.getItem("age")).toEqual(null); - - act(() => result.current.set(18)); - expect(result.current.value).toEqual(18); - expect(sessionStorage.getItem("age")).toEqual("18"); - }); - - it("does nothing when removing", () => { - const { result } = renderHook(() => useSessionStorage("age")); - expect(result.current.value).toEqual(undefined); - expect(sessionStorage.getItem("age")).toEqual(null); - - act(() => result.current.remove()); - expect(result.current.value).toEqual(undefined); - expect(sessionStorage.getItem("age")).toEqual(null); - }); -}); - -describe("with stored value", () => { - beforeEach(() => sessionStorage.setItem("age", "18")); - - it("defaults to stored value", () => { - const { result } = renderHook(() => useSessionStorage("age")); - expect(result.current.value).toEqual(18); - expect(sessionStorage.getItem("age")).toEqual("18"); - }); - - it("responds to stateful storage key", () => { - const { result, rerender } = renderHook((key) => useSessionStorage(key), { - initialProps: "age", - }); - expect(result.current.value).toEqual(18); - expect(sessionStorage.getItem("age")).toEqual("18"); - - rerender("name"); - expect(result.current.value).toEqual(undefined); - expect(sessionStorage.getItem("name")).toEqual(null); - }); - - it("ignores default value", () => { - const { result } = renderHook(() => - useSessionStorage("age", { defaultValue: 24 }) - ); - expect(result.current.value).toEqual(18); - expect(sessionStorage.getItem("age")).toEqual("18"); - }); - - it("can customize serializer and deserializer", () => { - const { result } = renderHook(() => - useSessionStorage("age", { - serializer: (num) => String(num + 1), - deserializer: (str) => Number(str) - 1, - }) - ); - expect(result.current.value).toEqual(17); - expect(sessionStorage.getItem("age")).toEqual("18"); - - act(() => result.current.set(24)); - expect(result.current.value).toEqual(24); - expect(sessionStorage.getItem("age")).toEqual("25"); - - act(() => result.current.remove()); - expect(result.current.value).toEqual(undefined); - expect(sessionStorage.getItem("age")).toEqual(null); - }); - - it("can set storage", () => { - const { result } = renderHook(() => useSessionStorage("age")); - expect(result.current.value).toEqual(18); - expect(sessionStorage.getItem("age")).toEqual("18"); - - act(() => result.current.set(24)); - expect(result.current.value).toEqual(24); - expect(sessionStorage.getItem("age")).toEqual("24"); - }); - - it("can set storage with a function", () => { - const { result } = renderHook(() => useSessionStorage("age")); - expect(result.current.value).toEqual(18); - expect(sessionStorage.getItem("age")).toEqual("18"); - - act(() => result.current.set((prev: number) => prev + 6)); - expect(result.current.value).toEqual(24); - expect(sessionStorage.getItem("age")).toEqual("24"); - }); - - it("can remove storage", () => { - const { result } = renderHook(() => useSessionStorage("age")); - expect(result.current.value).toEqual(18); - expect(sessionStorage.getItem("age")).toEqual("18"); - - act(() => result.current.remove()); - expect(result.current.value).toEqual(undefined); - expect(sessionStorage.getItem("age")).toEqual(null); - }); - - it("can remove storage by setting value to undefined", () => { - const { result } = renderHook(() => useSessionStorage("age")); - expect(result.current.value).toEqual(18); - expect(sessionStorage.getItem("age")).toEqual("18"); - - act(() => result.current.set(undefined)); - expect(result.current.value).toEqual(undefined); - expect(sessionStorage.getItem("age")).toEqual(null); - }); -}); diff --git a/packages/hooks/tests/use-timeout.test.ts b/packages/hooks/tests/use-timeout.test.ts deleted file mode 100644 index 02719af..0000000 --- a/packages/hooks/tests/use-timeout.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { renderHook } from "@testing-library/react"; -import { useTimeout } from "src"; - -beforeAll(() => { - vi.useFakeTimers(); -}); -afterAll(() => { - vi.useRealTimers(); -}); -afterEach(() => { - vi.clearAllTimers(); -}); - -it("triggers effect after timeout", () => { - const effect = vi.fn(); - - renderHook(() => useTimeout(effect)); - expect(effect).toHaveBeenCalledTimes(0); - - vi.advanceTimersByTime(499); - expect(effect).toHaveBeenCalledTimes(0); - - vi.advanceTimersByTime(1); - expect(effect).toHaveBeenCalledTimes(1); -}); - -it("can customize timeout", () => { - const effect = vi.fn(); - - renderHook(() => useTimeout(effect, 100)); - expect(effect).toHaveBeenCalledTimes(0); - - vi.advanceTimersByTime(99); - expect(effect).toHaveBeenCalledTimes(0); - - vi.advanceTimersByTime(1); - expect(effect).toHaveBeenCalledTimes(1); -}); diff --git a/packages/hooks/tests/use-title.test.ts b/packages/hooks/tests/use-title.test.ts deleted file mode 100644 index 90c3f5f..0000000 --- a/packages/hooks/tests/use-title.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { renderHook } from "@testing-library/react"; -import { useTitle } from "src"; - -it("responds to stateful title", () => { - const { rerender } = renderHook((title) => useTitle(title), { - initialProps: "1", - }); - expect(document.title).toEqual("1"); - - rerender("2"); - expect(document.title).toEqual("2"); -}); diff --git a/packages/hooks/tests/use-update.test.ts b/packages/hooks/tests/use-update.test.ts deleted file mode 100644 index 0a15a7f..0000000 --- a/packages/hooks/tests/use-update.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { renderHook } from "@testing-library/react"; -import { useUpdate } from "src"; - -it("only runs on component updates", () => { - const cleanup = vi.fn(); - const effect = vi.fn(() => cleanup); - - const { rerender, unmount } = renderHook(() => useUpdate(effect)); - expect(effect).toHaveBeenCalledTimes(0); - expect(cleanup).toHaveBeenCalledTimes(0); - - rerender(); - expect(effect).toHaveBeenCalledTimes(1); - expect(cleanup).toHaveBeenCalledTimes(0); - - rerender(); - expect(effect).toHaveBeenCalledTimes(2); - expect(cleanup).toHaveBeenCalledTimes(1); - - unmount(); - expect(effect).toHaveBeenCalledTimes(2); - expect(cleanup).toHaveBeenCalledTimes(2); -}); diff --git a/packages/hooks/tests/use-window-size.test.ts b/packages/hooks/tests/use-window-size.test.ts deleted file mode 100644 index 90a3f40..0000000 --- a/packages/hooks/tests/use-window-size.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { fireEvent, renderHook } from "@testing-library/react"; -import { useWindowSize } from "src"; - -beforeEach(() => { - window.innerWidth = 1024; - window.innerHeight = 768; -}); - -it("reads window size", () => { - const { result } = renderHook(() => useWindowSize()); - expect(result.current.width).toEqual(1024); - expect(result.current.height).toEqual(768); -}); - -it("responds to window resize events", () => { - const { result } = renderHook(() => useWindowSize()); - expect(result.current.width).toEqual(1024); - expect(result.current.height).toEqual(768); - - window.innerWidth = 500; - window.innerHeight = 200; - fireEvent.resize(window); - expect(result.current.width).toEqual(500); - expect(result.current.height).toEqual(200); -}); diff --git a/packages/hooks/tests/utils/match-media.ts b/packages/hooks/tests/utils/match-media.ts deleted file mode 100644 index 6f8c7c8..0000000 --- a/packages/hooks/tests/utils/match-media.ts +++ /dev/null @@ -1,62 +0,0 @@ -export function matchMedia(query: string) { - const defaultMediaQueryList = getDefaultMediaQueryList(); - - const widthQueryResult = getWidthQueryResult(query); - if (widthQueryResult !== undefined) { - return { - ...defaultMediaQueryList, - matches: widthQueryResult, - }; - } - - const themeQueryResult = getThemeQueryResult(query); - if (themeQueryResult !== undefined) { - return { - ...defaultMediaQueryList, - matches: themeQueryResult, - }; - } - - return defaultMediaQueryList; -} - -function getDefaultMediaQueryList() { - return { - matches: false, - addEventListener: () => 0, - removeEventListener: () => 0, - } as unknown as MediaQueryList; -} - -function getWidthQueryResult(query: string) { - const regex = /(max|min)-width:\s*(\d+?)px/; - const regexResult = query.match(regex); - if (!regexResult) { - return undefined; - } - - const condition = regexResult[1]; - const width = Number(regexResult[2]); - if (!condition || !width) { - return undefined; - } - - return condition === "max" - ? window.innerWidth <= width - : window.innerWidth >= width; -} - -function getThemeQueryResult(query: string) { - const regex = /prefers-color-scheme:\s*(light|dark)/; - const regexResult = query.match(regex); - if (!regexResult) { - return undefined; - } - - const theme = regexResult[1]; - if (!theme) { - return undefined; - } - - return theme === "dark"; -} diff --git a/packages/hooks/tsconfig.json b/packages/hooks/tsconfig.json deleted file mode 100644 index d46de1b..0000000 --- a/packages/hooks/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "typescript-config-custom/base.json", - "compilerOptions": { - "baseUrl": ".", - "rootDir": ".", - "types": ["node", "react", "react-dom", "vitest/globals"] - }, - "include": ["src", "tests"] -} diff --git a/packages/prettier-config-custom/index.json b/packages/prettier-config-custom/index.json deleted file mode 100644 index a66cb3c..0000000 --- a/packages/prettier-config-custom/index.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "overrides": [ - { - "files": ["*.astro"], - "options": { - "plugins": ["prettier-plugin-astro"], - "parser": "astro" - } - } - ] -} diff --git a/packages/prettier-config-custom/package.json b/packages/prettier-config-custom/package.json deleted file mode 100644 index 58fd531..0000000 --- a/packages/prettier-config-custom/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "prettier-config-custom", - "version": "0.0.0", - "private": true, - "main": "index.json", - "dependencies": { - "prettier-plugin-astro": "^0.8.0" - }, - "devDependencies": { - "prettier": "^2.8.3" - }, - "peerDependencies": { - "prettier": "^2.8.3" - } -} diff --git a/packages/typescript-config-custom/base.json b/packages/typescript-config-custom/base.json deleted file mode 100644 index 5d81852..0000000 --- a/packages/typescript-config-custom/base.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "allowUnreachableCode": false, - "allowUnusedLabels": false, - "exactOptionalPropertyTypes": true, - "noFallthroughCasesInSwitch": true, - "noImplicitOverride": true, - "noImplicitReturns": true, - "noUncheckedIndexedAccess": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "strict": true, - "module": "ESNext", - "moduleResolution": "Node", - "resolveJsonModule": true, - "declaration": true, - "importsNotUsedAsValues": "error", - "stripInternal": true, - "allowJs": true, - "checkJs": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "jsx": "react-jsx", - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "target": "ES6", - "composite": true, - "incremental": true, - "skipLibCheck": true - } -} diff --git a/packages/typescript-config-custom/package.json b/packages/typescript-config-custom/package.json deleted file mode 100644 index c17b56f..0000000 --- a/packages/typescript-config-custom/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "typescript-config-custom", - "version": "0.0.0", - "private": true, - "files": [ - "base.json" - ], - "devDependencies": { - "typescript": "^4.9.5" - }, - "peerDependencies": { - "typescript": "^4.9.4" - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89d1772..a8da6d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -8,6812 +8,5042 @@ importers: .: devDependencies: - commitlint: - specifier: ^17.4.2 - version: 17.4.2 - commitlint-config-custom: - specifier: workspace:^0.0.0 - version: link:packages/commitlint-config-custom - eslint: - specifier: ^8.33.0 - version: 8.33.0 - eslint-config-custom: - specifier: workspace:^0.0.0 - version: link:packages/eslint-config-custom - husky: - specifier: ^8.0.3 - version: 8.0.3 - lint-staged: - specifier: ^13.1.0 - version: 13.1.0 - prettier: - specifier: ^2.8.3 - version: 2.8.3 - prettier-config-custom: - specifier: workspace:^0.0.0 - version: link:packages/prettier-config-custom - turbo: - specifier: ^1.7.3 - version: 1.7.3 - - docs: - dependencies: - '@astrojs/markdown-remark': - specifier: ^2.0.1 - version: 2.0.1(astro@2.0.6) - '@astrojs/sitemap': - specifier: ^1.0.1 - version: 1.0.1 - '@astrojs/tailwind': - specifier: ^3.0.1 - version: 3.0.1(astro@2.0.6)(tailwindcss@3.2.4)(ts-node@10.9.1) - '@fontsource/inter': - specifier: ^4.5.15 - version: 4.5.15 - '@tailwindcss/typography': - specifier: ^0.5.9 - version: 0.5.9(tailwindcss@3.2.4) - astro: - specifier: ^2.0.6 - version: 2.0.6(@types/node@18.11.18) - cross-spawn: - specifier: ^7.0.3 - version: 7.0.3 - hastscript: - specifier: ^7.2.0 - version: 7.2.0 - rehype-autolink-headings: - specifier: ^6.1.1 - version: 6.1.1 - tailwindcss: - specifier: ^3.2.4 - version: 3.2.4(postcss@8.4.21)(ts-node@10.9.1) - tailwindcss-radix-colors: - specifier: ^0.3.0 - version: 0.3.0(tailwindcss@3.2.4) - devDependencies: - '@types/cross-spawn': - specifier: ^6.0.2 - version: 6.0.2 - '@types/node': - specifier: ^18.11.18 - version: 18.11.18 - typescript: - specifier: ^4.9.5 - version: 4.9.5 - typescript-config-custom: - specifier: workspace:^0.0.0 - version: link:../packages/typescript-config-custom - - packages/commitlint-config-custom: - dependencies: + '@commitlint/cli': + specifier: ^19.5.0 + version: 19.5.0(@types/node@22.9.0)(typescript@5.6.3) '@commitlint/config-conventional': - specifier: ^17.4.2 - version: 17.4.2 - devDependencies: - commitlint: - specifier: ^17.4.2 - version: 17.4.2 - - packages/eslint-config-custom: - dependencies: - '@typescript-eslint/eslint-plugin': - specifier: ^5.50.0 - version: 5.50.0(@typescript-eslint/parser@5.50.0)(eslint@8.33.0)(typescript@4.9.5) - '@typescript-eslint/parser': - specifier: ^5.50.0 - version: 5.50.0(eslint@8.33.0)(typescript@4.9.5) - eslint-config-prettier: - specifier: ^8.6.0 - version: 8.6.0(eslint@8.33.0) - eslint-config-turbo: - specifier: ^0.0.7 - version: 0.0.7(eslint@8.33.0) - eslint-plugin-astro: - specifier: ^0.23.0 - version: 0.23.0(eslint@8.33.0) - eslint-plugin-jsx-a11y: - specifier: ^6.7.1 - version: 6.7.1(eslint@8.33.0) - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@8.33.0) - devDependencies: - eslint: - specifier: ^8.33.0 - version: 8.33.0 - typescript: - specifier: ^4.9.5 - version: 4.9.5 - - packages/hooks: - devDependencies: + specifier: ^19.5.0 + version: 19.5.0 + '@commitlint/types': + specifier: ^19.5.0 + version: 19.5.0 + '@eslint/js': + specifier: ^9.14.0 + version: 9.14.0 '@testing-library/react': - specifier: ^13.4.0 - version: 13.4.0(react-dom@18.2.0)(react@18.2.0) + specifier: ^16.0.1 + version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@testing-library/user-event': + specifier: ^14.5.2 + version: 14.5.2(@testing-library/dom@10.4.0) + '@types/eslint-config-prettier': + specifier: ^6.11.3 + version: 6.11.3 + '@types/eslint__js': + specifier: ^8.42.3 + version: 8.42.3 '@types/node': - specifier: ^18.11.18 - version: 18.11.18 + specifier: ^22.9.0 + version: 22.9.0 '@types/react': - specifier: ^18.0.27 - version: 18.0.27 + specifier: ^18.3.12 + version: 18.3.12 '@types/react-dom': - specifier: ^18.0.10 - version: 18.0.10 - '@vitest/coverage-c8': - specifier: ^0.28.4 - version: 0.28.4(jsdom@21.1.0) - fast-glob: - specifier: ^3.2.12 - version: 3.2.12 + specifier: ^18.3.1 + version: 18.3.1 + '@vitest/coverage-v8': + specifier: ^2.1.4 + version: 2.1.4(vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1)) + eslint: + specifier: ^9.14.0 + version: 9.14.0(jiti@1.21.6) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.14.0(jiti@1.21.6)) + husky: + specifier: ^9.1.6 + version: 9.1.6 jsdom: - specifier: ^21.1.0 - version: 21.1.0 + specifier: ^25.0.1 + version: 25.0.1 + lint-staged: + specifier: ^15.2.10 + version: 15.2.10 + prettier: + specifier: ^3.3.3 + version: 3.3.3 react: - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.1 + version: 18.3.1 react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) typescript: - specifier: ^4.9.5 - version: 4.9.5 - typescript-config-custom: - specifier: workspace:^0.0.0 - version: link:../typescript-config-custom + specifier: ^5.6.3 + version: 5.6.3 + typescript-eslint: + specifier: ^8.13.0 + version: 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) vite: - specifier: ^4.1.1 - version: 4.1.1(@types/node@18.11.18) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vite-plugin-dts: - specifier: ^1.7.2 - version: 1.7.2(@types/node@18.11.18)(vite@4.1.1) + specifier: ^4.3.0 + version: 4.3.0(@types/node@22.9.0)(rollup@4.25.0)(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)) vite-tsconfig-paths: - specifier: ^4.0.5 - version: 4.0.5(typescript@4.9.5) + specifier: ^5.1.2 + version: 5.1.2(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)) + vitepress: + specifier: ^1.5.0 + version: 1.5.0(@algolia/client-search@5.13.0)(@types/node@22.9.0)(@types/react@18.3.12)(postcss@8.4.48)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3) vitest: - specifier: ^0.28.4 - version: 0.28.4(jsdom@21.1.0) - - packages/prettier-config-custom: - dependencies: - prettier-plugin-astro: - specifier: ^0.8.0 - version: 0.8.0 - devDependencies: - prettier: - specifier: ^2.8.3 - version: 2.8.3 - - packages/typescript-config-custom: - devDependencies: - typescript: - specifier: ^4.9.5 - version: 4.9.5 + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) packages: - /@ampproject/remapping@2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.17 - dev: false + '@algolia/autocomplete-core@1.17.6': + resolution: {integrity: sha512-lkDoW4I7h2kKlIgf3pUt1LqvxyYKkVyiypoGLlUnhPSnCpmeOwudM6rNq6YYsCmdQtnDQoW5lUNNuj6ASg3qeg==} - /@astrojs/compiler@0.31.4: - resolution: {integrity: sha512-6bBFeDTtPOn4jZaiD3p0f05MEGQL9pw2Zbfj546oFETNmjJFWO3nzHz6/m+P53calknCvyVzZ5YhoBLIvzn5iw==} - dev: false - - /@astrojs/compiler@1.0.1: - resolution: {integrity: sha512-77aacobLKcL98NmhK3OBS5EHIrX9gs1ckB/vGSIdkVZuB7u51V4jh05I6W0tSvG7/86tALv6QtHTRZ8rLhFTbQ==} - dev: false + '@algolia/autocomplete-plugin-algolia-insights@1.17.6': + resolution: {integrity: sha512-17NnaacuFzSWVuZu4NKzVeaFIe9Abpw8w+/gjc7xhZFtqj+GadufzodIdchwiB2eM2cDdiR3icW7gbNTB3K2YA==} + peerDependencies: + search-insights: '>= 1 < 3' - /@astrojs/language-server@0.28.3: - resolution: {integrity: sha512-fPovAX/X46eE2w03jNRMpQ7W9m2mAvNt4Ay65lD9wl1Z5vIQYxlg7Enp9qP225muTr4jSVB5QiLumFJmZMAaVA==} - hasBin: true - dependencies: - '@vscode/emmet-helper': 2.8.6 - events: 3.3.0 - prettier: 2.8.3 - prettier-plugin-astro: 0.7.2 - source-map: 0.7.4 - vscode-css-languageservice: 6.2.3 - vscode-html-languageservice: 5.0.4 - vscode-languageserver: 8.0.2 - vscode-languageserver-protocol: 3.17.2 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.2 - vscode-uri: 3.0.7 - dev: false - - /@astrojs/markdown-remark@2.0.1(astro@2.0.6): - resolution: {integrity: sha512-xQF1rXGJN18m+zZucwRRtmNehuhPMMhZhi6HWKrtpEAKnHSPk8lqf1GXgKH7/Sypglu8ivdECZ+EGs6kOYVasQ==} + '@algolia/autocomplete-preset-algolia@1.17.6': + resolution: {integrity: sha512-Cvg5JENdSCMuClwhJ1ON1/jSuojaYMiUW2KePm18IkdCzPJj/NXojaOxw58RFtQFpJgfVW8h2E8mEoDtLlMdeA==} peerDependencies: - astro: ^2.0.2 - dependencies: - '@astrojs/prism': 2.0.0 - astro: 2.0.6(@types/node@18.11.18) - github-slugger: 1.5.0 - import-meta-resolve: 2.2.1 - rehype-raw: 6.1.1 - rehype-stringify: 9.0.3 - remark-gfm: 3.0.1 - remark-parse: 10.0.1 - remark-rehype: 10.1.0 - remark-smartypants: 2.0.0 - shiki: 0.11.1 - unified: 10.1.2 - unist-util-visit: 4.1.2 - vfile: 5.3.6 - transitivePeerDependencies: - - supports-color - dev: false + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' - /@astrojs/prism@2.0.0: - resolution: {integrity: sha512-YgeoeEPqsxaEpg0rwe/bUq3653LqSQnMjrLlpYwrbQQMQQqz6Y5yXN+RX3SfLJ6ppNb4+Fu2+Z49EXjk48Ihjw==} - engines: {node: '>=16.12.0'} - dependencies: - prismjs: 1.29.0 - dev: false + '@algolia/autocomplete-shared@1.17.6': + resolution: {integrity: sha512-aq/3V9E00Tw2GC/PqgyPGXtqJUlVc17v4cn1EUhSc+O/4zd04Uwb3UmPm8KDaYQQOrkt1lwvCj2vG2wRE5IKhw==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' - /@astrojs/sitemap@1.0.1: - resolution: {integrity: sha512-qexepZPH6/dLToI/njxr2FjvyxJU0HBAnQRNzEggF0ok811oSNC6su1DkyW2VKp0TNPbWoujuSbcb1yFOjnAqA==} - dependencies: - sitemap: 7.1.1 - zod: 3.20.2 - dev: false + '@algolia/client-abtesting@5.13.0': + resolution: {integrity: sha512-6CoQjlMi1pmQYMQO8tXfuGxSPf6iKX5FP9MuMe6IWmvC81wwTvOehnwchyBl2wuPVhcw2Ar53K53mQ60DAC64g==} + engines: {node: '>= 14.0.0'} - /@astrojs/tailwind@3.0.1(astro@2.0.6)(tailwindcss@3.2.4)(ts-node@10.9.1): - resolution: {integrity: sha512-QSYh/xmz454j1yZU9rjw2J24PpH7j3h2ClesqMaAniOtcuL8RfP7KYCnCrk01xvjwqqO+QBpZNDD/SUhHNtFFg==} - peerDependencies: - astro: ^2.0.4 - tailwindcss: ^3.0.24 - dependencies: - '@proload/core': 0.3.3 - astro: 2.0.6(@types/node@18.11.18) - autoprefixer: 10.4.13(postcss@8.4.21) - postcss: 8.4.21 - postcss-load-config: 4.0.1(postcss@8.4.21)(ts-node@10.9.1) - tailwindcss: 3.2.4(postcss@8.4.21)(ts-node@10.9.1) - transitivePeerDependencies: - - ts-node - dev: false - - /@astrojs/telemetry@2.0.0: - resolution: {integrity: sha512-RnWojVMIsql3GGWDP5pNWmhmBQVkCpxGNZ8yPr2cbmUqsUYGSvErhqfkLfro9j2/STi5UDmSpNgjPkQmXpgnKw==} - engines: {node: '>=16.12.0'} - dependencies: - ci-info: 3.7.1 - debug: 4.3.4 - dlv: 1.1.3 - dset: 3.1.2 - is-docker: 3.0.0 - is-wsl: 2.2.0 - undici: 5.16.0 - which-pm-runs: 1.1.0 - transitivePeerDependencies: - - supports-color - dev: false + '@algolia/client-analytics@5.13.0': + resolution: {integrity: sha512-pS3qyXiWTwKnrt/jE79fqkNqZp7kjsFNlJDcBGkSWid74DNc6DmArlkvPqyLxnoaYGjUGACT6g56n7E3mVV2TA==} + engines: {node: '>= 14.0.0'} - /@astrojs/webapi@2.0.0: - resolution: {integrity: sha512-gziwy+XvY+/B9mq/eurgJMZ4iFnkcqg1wb0tA8BsVfiUPwl7yQKAFrBxrs2rWfKMXyWlVaTFc8rAYcB5VXQEuw==} - dependencies: - undici: 5.16.0 - dev: false + '@algolia/client-common@5.13.0': + resolution: {integrity: sha512-2SP6bGGWOTN920MLZv8s7yIR3OqY03vEe4U+vb2MGdL8a/8EQznF3L/nTC/rGf/hvEfZlX2tGFxPJaF2waravg==} + engines: {node: '>= 14.0.0'} - /@babel/code-frame@7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 + '@algolia/client-insights@5.13.0': + resolution: {integrity: sha512-ldHTe+LVgC6L4Wr6doAQQ7Ku0jAdhaaPg1T+IHzmmiRZb2Uq5OsjW2yC65JifOmzPCiMkIZE2mGRpWgkn5ktlw==} + engines: {node: '>= 14.0.0'} - /@babel/compat-data@7.20.14: - resolution: {integrity: sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==} - engines: {node: '>=6.9.0'} - dev: false + '@algolia/client-personalization@5.13.0': + resolution: {integrity: sha512-RnCfOSN4OUJDuMNHFca2M8lY64Tmw0kQOZikge4TknTqHmlbKJb8IbJE7Rol79Z80W2Y+B1ydcjV7DPje4GMRA==} + engines: {node: '>= 14.0.0'} - /@babel/core@7.20.12: - resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.14 - '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) - '@babel/helper-module-transforms': 7.20.11 - '@babel/helpers': 7.20.13 - '@babel/parser': 7.20.15 - '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false + '@algolia/client-query-suggestions@5.13.0': + resolution: {integrity: sha512-pYo0jbLUtPDN1r341UHTaF2fgN5rbaZfDZqjPRKPM+FRlRmxFxqFQm1UUfpkSUWYGn7lECwDpbKYiKUf81MTwA==} + engines: {node: '>= 14.0.0'} - /@babel/generator@7.20.14: - resolution: {integrity: sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.20.7 - '@jridgewell/gen-mapping': 0.3.2 - jsesc: 2.5.2 - dev: false + '@algolia/client-search@5.13.0': + resolution: {integrity: sha512-s2ge3uZ6Zg2sPSFibqijgEYsuorxcc8KVHg3I95nOPHvFHdnBtSHymhZvq4sp/fu8ijt/Y8jLwkuqm5myn+2Sg==} + engines: {node: '>= 14.0.0'} - /@babel/helper-annotate-as-pure@7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.20.7 - dev: false + '@algolia/ingestion@1.13.0': + resolution: {integrity: sha512-fm5LEOe4FPDOc1D+M9stEs8hfcdmbdD+pt9og5shql6ueTZJANDbFoQhDOpiPJizR/ps1GwmjkWfUEywx3sV+Q==} + engines: {node: '>= 14.0.0'} - /@babel/helper-compilation-targets@7.20.7(@babel/core@7.20.12): - resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.20.14 - '@babel/core': 7.20.12 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.0 - dev: false - - /@babel/helper-environment-visitor@7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} - engines: {node: '>=6.9.0'} - dev: false + '@algolia/monitoring@1.13.0': + resolution: {integrity: sha512-e8Hshlnm2G5fapyUgWTBwhJ22yXcnLtPC4LWZKx7KOvv35GcdoHtlUBX94I/sWCJLraUr65JvR8qOo3LXC43dg==} + engines: {node: '>= 14.0.0'} - /@babel/helper-function-name@7.19.0: - resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.20.7 - dev: false + '@algolia/recommend@5.13.0': + resolution: {integrity: sha512-53/wW96oaj1FKMzGdFcZ/epygfTppLDUvgI1thLkd475EtVZCH3ZZVUNCEvf1AtnNyH1RnItkFzX8ayWCpx2PQ==} + engines: {node: '>= 14.0.0'} - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.20.7 - dev: false + '@algolia/requester-browser-xhr@5.13.0': + resolution: {integrity: sha512-NV6oSCt5lFuzfsVQoSBpewEWf/h4ySr7pv2bfwu9yF/jc/g39pig8+YpuqsxlRWBm/lTGVA2V0Ai9ySwrNumIA==} + engines: {node: '>= 14.0.0'} - /@babel/helper-module-imports@7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.20.7 - dev: false + '@algolia/requester-fetch@5.13.0': + resolution: {integrity: sha512-094bK4rumf+rXJazxv3mq6eKRM0ep5AxIo8T0YmOdldswQt79apeufFiPLN19nHEWH22xR2FelimD+T/wRSP+Q==} + engines: {node: '>= 14.0.0'} - /@babel/helper-module-transforms@7.20.11: - resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.20.2 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 - transitivePeerDependencies: - - supports-color - dev: false + '@algolia/requester-node-http@5.13.0': + resolution: {integrity: sha512-JY5xhEYMgki53Wm+A6R2jUpOUdD0zZnBq+PC5R1TGMNOYL1s6JjDrJeMsvaI2YWxYMUSoCnRoltN/yf9RI8n3A==} + engines: {node: '>= 14.0.0'} - /@babel/helper-plugin-utils@7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} - engines: {node: '>=6.9.0'} - dev: false + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.20.7 - dev: false - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.20.7 - dev: false - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true - /@babel/helper-validator-option@7.18.6: - resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} - dev: false - /@babel/helpers@7.20.13: - resolution: {integrity: sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - /@babel/parser@7.20.15: - resolution: {integrity: sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==} - engines: {node: '>=6.0.0'} + '@commitlint/cli@19.5.0': + resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==} + engines: {node: '>=v18'} hasBin: true - dependencies: - '@babel/types': 7.20.7 - dev: false - /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.20.12): - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.20.2 - dev: false + '@commitlint/config-conventional@19.5.0': + resolution: {integrity: sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==} + engines: {node: '>=v18'} - /@babel/plugin-transform-react-jsx@7.20.13(@babel/core@7.20.12): - resolution: {integrity: sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.20.12) - '@babel/types': 7.20.7 - dev: false - - /@babel/runtime@7.20.13: - resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 + '@commitlint/config-validator@19.5.0': + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} + engines: {node: '>=v18'} - /@babel/template@7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 - dev: false + '@commitlint/ensure@19.5.0': + resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} + engines: {node: '>=v18'} - /@babel/traverse@7.20.13: - resolution: {integrity: sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.14 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false + '@commitlint/execute-rule@19.5.0': + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} + engines: {node: '>=v18'} - /@babel/types@7.20.7: - resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: false + '@commitlint/format@19.5.0': + resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} + engines: {node: '>=v18'} - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true + '@commitlint/is-ignored@19.5.0': + resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==} + engines: {node: '>=v18'} - /@commitlint/cli@17.4.2: - resolution: {integrity: sha512-0rPGJ2O1owhpxMIXL9YJ2CgPkdrFLKZElIZHXDN8L8+qWK1DGH7Q7IelBT1pchXTYTuDlqkOTdh//aTvT3bSUA==} - engines: {node: '>=v14'} - hasBin: true - dependencies: - '@commitlint/format': 17.4.0 - '@commitlint/lint': 17.4.2 - '@commitlint/load': 17.4.2 - '@commitlint/read': 17.4.2 - '@commitlint/types': 17.4.0 - execa: 5.1.1 - lodash.isfunction: 3.0.9 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.6.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - dev: true + '@commitlint/lint@19.5.0': + resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==} + engines: {node: '>=v18'} - /@commitlint/config-conventional@17.4.2: - resolution: {integrity: sha512-JVo1moSj5eDMoql159q8zKCU8lkOhQ+b23Vl3LVVrS6PXDLQIELnJ34ChQmFVbBdSSRNAbbXnRDhosFU+wnuHw==} - engines: {node: '>=v14'} - dependencies: - conventional-changelog-conventionalcommits: 5.0.0 - dev: false + '@commitlint/load@19.5.0': + resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} + engines: {node: '>=v18'} - /@commitlint/config-validator@17.4.0: - resolution: {integrity: sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/types': 17.4.0 - ajv: 8.12.0 - dev: true + '@commitlint/message@19.5.0': + resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} + engines: {node: '>=v18'} - /@commitlint/ensure@17.4.0: - resolution: {integrity: sha512-7oAxt25je0jeQ/E0O/M8L3ADb1Cvweu/5lc/kYF8g/kXatI0wxGE5La52onnAUAWeWlsuvBNar15WcrmDmr5Mw==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/types': 17.4.0 - lodash.camelcase: 4.3.0 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.startcase: 4.4.0 - lodash.upperfirst: 4.3.1 - dev: true + '@commitlint/parse@19.5.0': + resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} + engines: {node: '>=v18'} - /@commitlint/execute-rule@17.4.0: - resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} - engines: {node: '>=v14'} - dev: true + '@commitlint/read@19.5.0': + resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} + engines: {node: '>=v18'} - /@commitlint/format@17.4.0: - resolution: {integrity: sha512-Z2bWAU5+f1YZh9W76c84J8iLIWIvvm+mzqogTz0Nsc1x6EHW0Z2gI38g5HAjB0r0I3ZjR15IDEJKhsxyblcyhA==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/types': 17.4.0 - chalk: 4.1.2 - dev: true - - /@commitlint/is-ignored@17.4.2: - resolution: {integrity: sha512-1b2Y2qJ6n7bHG9K6h8S4lBGUl6kc7mMhJN9gy1SQfUZqe92ToDjUTtgNWb6LbzR1X8Cq4SEus4VU8Z/riEa94Q==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/types': 17.4.0 - semver: 7.3.8 - dev: true - - /@commitlint/lint@17.4.2: - resolution: {integrity: sha512-HcymabrdBhsDMNzIv146+ZPNBPBK5gMNsVH+el2lCagnYgCi/4ixrHooeVyS64Fgce2K26+MC7OQ4vVH8wQWVw==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/is-ignored': 17.4.2 - '@commitlint/parse': 17.4.2 - '@commitlint/rules': 17.4.2 - '@commitlint/types': 17.4.0 - dev: true - - /@commitlint/load@17.4.2: - resolution: {integrity: sha512-Si++F85rJ9t4hw6JcOw1i2h0fdpdFQt0YKwjuK4bk9KhFjyFkRxvR3SB2dPaMs+EwWlDrDBGL+ygip1QD6gmPw==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/config-validator': 17.4.0 - '@commitlint/execute-rule': 17.4.0 - '@commitlint/resolve-extends': 17.4.0 - '@commitlint/types': 17.4.0 - '@types/node': 18.11.18 - chalk: 4.1.2 - cosmiconfig: 8.0.0 - cosmiconfig-typescript-loader: 4.3.0(@types/node@18.11.18)(cosmiconfig@8.0.0)(ts-node@10.9.1)(typescript@4.9.5) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@18.11.18)(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - dev: true - - /@commitlint/message@17.4.2: - resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==} - engines: {node: '>=v14'} - dev: true - - /@commitlint/parse@17.4.2: - resolution: {integrity: sha512-DK4EwqhxfXpyCA+UH8TBRIAXAfmmX4q9QRBz/2h9F9sI91yt6mltTrL6TKURMcjUVmgaB80wgS9QybNIyVBIJA==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/types': 17.4.0 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 - dev: true - - /@commitlint/read@17.4.2: - resolution: {integrity: sha512-hasYOdbhEg+W4hi0InmXHxtD/1favB4WdwyFxs1eOy/DvMw6+2IZBmATgGOlqhahsypk4kChhxjAFJAZ2F+JBg==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/top-level': 17.4.0 - '@commitlint/types': 17.4.0 - fs-extra: 11.1.0 - git-raw-commits: 2.0.11 - minimist: 1.2.7 - dev: true - - /@commitlint/resolve-extends@17.4.0: - resolution: {integrity: sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/config-validator': 17.4.0 - '@commitlint/types': 17.4.0 - import-fresh: 3.3.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true + '@commitlint/resolve-extends@19.5.0': + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} + engines: {node: '>=v18'} - /@commitlint/rules@17.4.2: - resolution: {integrity: sha512-OGrPsMb9Fx3/bZ64/EzJehY9YDSGWzp81Pj+zJiY+r/NSgJI3nUYdlS37jykNIugzazdEXfMtQ10kmA+Kx2pZQ==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/ensure': 17.4.0 - '@commitlint/message': 17.4.2 - '@commitlint/to-lines': 17.4.0 - '@commitlint/types': 17.4.0 - execa: 5.1.1 - dev: true + '@commitlint/rules@19.5.0': + resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==} + engines: {node: '>=v18'} - /@commitlint/to-lines@17.4.0: - resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} - engines: {node: '>=v14'} - dev: true + '@commitlint/to-lines@19.5.0': + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} + engines: {node: '>=v18'} - /@commitlint/top-level@17.4.0: - resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} - engines: {node: '>=v14'} - dependencies: - find-up: 5.0.0 - dev: true + '@commitlint/top-level@19.5.0': + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} + engines: {node: '>=v18'} - /@commitlint/types@17.4.0: - resolution: {integrity: sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA==} - engines: {node: '>=v14'} - dependencies: - chalk: 4.1.2 - dev: true + '@commitlint/types@19.5.0': + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} + engines: {node: '>=v18'} - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 + '@docsearch/css@3.7.0': + resolution: {integrity: sha512-1OorbTwi1eeDmr0v5t+ckSRlt1zM5GHjm92iIl3kUu7im3GHuP+csf6E0WBg8pdXQczTWP9J9+o9n+Vg6DH5cQ==} - /@emmetio/abbreviation@2.2.3: - resolution: {integrity: sha512-87pltuCPt99aL+y9xS6GPZ+Wmmyhll2WXH73gG/xpGcQ84DRnptBsI2r0BeIQ0EB/SQTOe2ANPqFqj3Rj5FOGA==} - dependencies: - '@emmetio/scanner': 1.0.0 - dev: false + '@docsearch/js@3.7.0': + resolution: {integrity: sha512-ScfqOIKrSr8SImbpxVaD59xc/bytbL8QEM2GUpe3aICmoICflWp5DyTRzAdFky16HY+yEOAVZXt3COXQ1NOCWw==} - /@emmetio/css-abbreviation@2.1.4: - resolution: {integrity: sha512-qk9L60Y+uRtM5CPbB0y+QNl/1XKE09mSO+AhhSauIfr2YOx/ta3NJw2d8RtCFxgzHeRqFRr8jgyzThbu+MZ4Uw==} - dependencies: - '@emmetio/scanner': 1.0.0 - dev: false + '@docsearch/react@3.7.0': + resolution: {integrity: sha512-8e6tdDfkYoxafEEPuX5eE1h9cTkLvhe4KgoFkO5JCddXSQONnN1FHcDZRI4r8894eMpbYq6rdJF0dVYh8ikwNQ==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true - /@emmetio/scanner@1.0.0: - resolution: {integrity: sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA==} - dev: false + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] - /@esbuild/android-arm64@0.16.17: - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - optional: true - /@esbuild/android-arm@0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - optional: true - /@esbuild/android-x64@0.16.17: - resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - optional: true - /@esbuild/darwin-arm64@0.16.17: - resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - optional: true - /@esbuild/darwin-x64@0.16.17: - resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - optional: true - /@esbuild/freebsd-arm64@0.16.17: - resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - optional: true - /@esbuild/freebsd-x64@0.16.17: - resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - optional: true - /@esbuild/linux-arm64@0.16.17: - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-arm@0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-ia32@0.16.17: - resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-loong64@0.16.17: - resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-mips64el@0.16.17: - resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-ppc64@0.16.17: - resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-riscv64@0.16.17: - resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-s390x@0.16.17: - resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-x64@0.16.17: - resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/netbsd-x64@0.16.17: - resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - optional: true - /@esbuild/openbsd-x64@0.16.17: - resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - optional: true - /@esbuild/sunos-x64@0.16.17: - resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - optional: true - /@esbuild/win32-arm64@0.16.17: - resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-ia32@0.16.17: - resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-x64@0.16.17: - resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - optional: true - /@eslint/eslintrc@1.4.1: - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.4.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - /@fontsource/inter@4.5.15: - resolution: {integrity: sha512-FzleM9AxZQK2nqsTDtBiY0PMEVWvnKnuu2i09+p6DHvrHsuucoV2j0tmw+kAT3L4hvsLdAIDv6MdGehsPIdT+Q==} - dev: false + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@humanwhocodes/config-array@0.11.8: - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.14.0': + resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.2': + resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /@humanwhocodes/module-importer@1.0.1: + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + + '@iconify-json/simple-icons@1.2.11': + resolution: {integrity: sha512-AHCGDtBRqP+JzAbBzgO8uN/08CXxEmuaC6lQQZ3b5burKhRU12AJnJczwbUw2K5Mb/U85EpSUNhYMG3F28b8NA==} - /@istanbuljs/schema@0.1.3: + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - dev: true - - /@jridgewell/gen-mapping@0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: false - /@jridgewell/gen-mapping@0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 - dev: false - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - /@ljharb/has-package-exports-patterns@0.0.2: - resolution: {integrity: sha512-4/RWEeXDO6bocPONheFe6gX/oQdP/bEpv0oL4HqjPP5DCenBSt0mHgahppY49N0CpsaqffdwPq+TlX9CYOq2Dw==} - dev: false + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - /@microsoft/api-extractor-model@7.26.2(@types/node@18.11.18): - resolution: {integrity: sha512-V9tTHbYTNelTrNDXBzeDlszq29nQcjJdP6s27QJiATbqSRjEbKTeztlSVsCRHL2Wkkv5IN5jT4xkYjnFFPbK0A==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.55.0(@types/node@18.11.18) - transitivePeerDependencies: - - '@types/node' - dev: true + '@microsoft/api-extractor-model@7.29.8': + resolution: {integrity: sha512-t3Z/xcO6TRbMcnKGVMs4uMzv/gd5j0NhMiJIGjD4cJMeFJ1Hf8wnLSx37vxlRlL0GWlGJhnFgxvnaL6JlS+73g==} - /@microsoft/api-extractor@7.34.2(@types/node@18.11.18): - resolution: {integrity: sha512-oREyUU7p3JgjrqapJxEHe83gA1SXOWgaA4XCiY9PvsiLkgGHtn2ibTRgw9GCI/4kZzcb+OQv5waUDxsnQSKfwQ==} + '@microsoft/api-extractor@7.47.11': + resolution: {integrity: sha512-lrudfbPub5wzBhymfFtgZKuBvXxoSIAdrvS2UbHjoMT2TjIEddq6Z13pcve7A03BAouw0x8sW8G4txdgfiSwpQ==} hasBin: true - dependencies: - '@microsoft/api-extractor-model': 7.26.2(@types/node@18.11.18) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.55.0(@types/node@18.11.18) - '@rushstack/rig-package': 0.3.17 - '@rushstack/ts-command-line': 4.13.1 - colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.22.1 - semver: 7.3.8 - source-map: 0.6.1 - typescript: 4.8.4 - transitivePeerDependencies: - - '@types/node' - dev: true - /@microsoft/tsdoc-config@0.16.2: - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - dev: true + '@microsoft/tsdoc-config@0.17.0': + resolution: {integrity: sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==} - /@microsoft/tsdoc@0.14.2: - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: true + '@microsoft/tsdoc@0.15.0': + resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} - /@nodelib/fs.scandir@2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - /@nodelib/fs.walk@1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@pkgr/utils@2.3.1: - resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - is-glob: 4.0.3 - open: 8.4.0 - picocolors: 1.0.0 - tiny-glob: 0.2.9 - tslib: 2.5.0 - dev: false - - /@proload/core@0.3.3: - resolution: {integrity: sha512-7dAFWsIK84C90AMl24+N/ProHKm4iw0akcnoKjRvbfHifJZBLhaDsDus1QJmhG12lXj4e/uB/8mB/0aduCW+NQ==} - dependencies: - deepmerge: 4.3.0 - escalade: 3.1.1 - dev: false - /@radix-ui/colors@0.1.8: - resolution: {integrity: sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw==} - dev: false + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} - /@rollup/pluginutils@5.0.2: - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - dependencies: - '@types/estree': 1.0.0 - estree-walker: 2.0.2 - picomatch: 2.3.1 - dev: true - /@rushstack/node-core-library@3.55.0(@types/node@18.11.18): - resolution: {integrity: sha512-6lSel8w3DeGaD/JCKw64wfezEBijlCQlMwBoYg9Ci5VPy+dZ+FpBkIBrY8mi3Ge4xNzr4gyTbQ5XEt0QP1Kv/w==} - peerDependencies: - '@types/node': ^14.18.36 - peerDependenciesMeta: - '@types/node': - optional: true - dependencies: - '@types/node': 18.11.18 - colors: 1.2.5 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.1 - semver: 7.3.8 - z-schema: 5.0.5 - dev: true + '@rollup/rollup-android-arm-eabi@4.25.0': + resolution: {integrity: sha512-CC/ZqFZwlAIbU1wUPisHyV/XRc5RydFrNLtgl3dGYskdwPZdt4HERtKm50a/+DtTlKeCq9IXFEWR+P6blwjqBA==} + cpu: [arm] + os: [android] - /@rushstack/rig-package@0.3.17: - resolution: {integrity: sha512-nxvAGeIMnHl1LlZSQmacgcRV4y1EYtgcDIrw6KkeVjudOMonlxO482PhDj3LVZEp6L7emSf6YSO2s5JkHlwfZA==} - dependencies: - resolve: 1.17.0 - strip-json-comments: 3.1.1 - dev: true + '@rollup/rollup-android-arm64@4.25.0': + resolution: {integrity: sha512-/Y76tmLGUJqVBXXCfVS8Q8FJqYGhgH4wl4qTA24E9v/IJM0XvJCGQVSW1QZ4J+VURO9h8YCa28sTFacZXwK7Rg==} + cpu: [arm64] + os: [android] - /@rushstack/ts-command-line@4.13.1: - resolution: {integrity: sha512-UTQMRyy/jH1IS2U+6pyzyn9xQ2iMcoUKkTcZUzOP/aaMiKlWLwCTDiBVwhw/M1crDx6apF9CwyjuWO9r1SBdJQ==} - dependencies: - '@types/argparse': 1.0.38 - argparse: 1.0.10 - colors: 1.2.5 - string-argv: 0.3.1 - dev: true + '@rollup/rollup-darwin-arm64@4.25.0': + resolution: {integrity: sha512-YVT6L3UrKTlC0FpCZd0MGA7NVdp7YNaEqkENbWQ7AOVOqd/7VzyHpgIpc1mIaxRAo1ZsJRH45fq8j4N63I/vvg==} + cpu: [arm64] + os: [darwin] - /@tailwindcss/typography@0.5.9(tailwindcss@3.2.4): - resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' - dependencies: - lodash.castarray: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - postcss-selector-parser: 6.0.10 - tailwindcss: 3.2.4(postcss@8.4.21)(ts-node@10.9.1) - dev: false + '@rollup/rollup-darwin-x64@4.25.0': + resolution: {integrity: sha512-ZRL+gexs3+ZmmWmGKEU43Bdn67kWnMeWXLFhcVv5Un8FQcx38yulHBA7XR2+KQdYIOtD0yZDWBCudmfj6lQJoA==} + cpu: [x64] + os: [darwin] - /@testing-library/dom@8.20.0: - resolution: {integrity: sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==} - engines: {node: '>=12'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/runtime': 7.20.13 - '@types/aria-query': 5.0.1 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.4.4 - pretty-format: 27.5.1 - dev: true + '@rollup/rollup-freebsd-arm64@4.25.0': + resolution: {integrity: sha512-xpEIXhiP27EAylEpreCozozsxWQ2TJbOLSivGfXhU4G1TBVEYtUPi2pOZBnvGXHyOdLAUUhPnJzH3ah5cqF01g==} + cpu: [arm64] + os: [freebsd] - /@testing-library/react@13.4.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} - engines: {node: '>=12'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - dependencies: - '@babel/runtime': 7.20.13 - '@testing-library/dom': 8.20.0 - '@types/react-dom': 18.0.10 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true + '@rollup/rollup-freebsd-x64@4.25.0': + resolution: {integrity: sha512-sC5FsmZGlJv5dOcURrsnIK7ngc3Kirnx3as2XU9uER+zjfyqIjdcMVgzy4cOawhsssqzoAX19qmxgJ8a14Qrqw==} + cpu: [x64] + os: [freebsd] - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true + '@rollup/rollup-linux-arm-gnueabihf@4.25.0': + resolution: {integrity: sha512-uD/dbLSs1BEPzg564TpRAQ/YvTnCds2XxyOndAO8nJhaQcqQGFgv/DAVko/ZHap3boCvxnzYMa3mTkV/B/3SWA==} + cpu: [arm] + os: [linux] - /@ts-morph/common@0.18.1: - resolution: {integrity: sha512-RVE+zSRICWRsfrkAw5qCAK+4ZH9kwEFv5h0+/YeHTLieWP7F4wWq4JsKFuNWG+fYh/KF+8rAtgdj5zb2mm+DVA==} - dependencies: - fast-glob: 3.2.12 - minimatch: 5.1.6 - mkdirp: 1.0.4 - path-browserify: 1.0.1 - dev: true + '@rollup/rollup-linux-arm-musleabihf@4.25.0': + resolution: {integrity: sha512-ZVt/XkrDlQWegDWrwyC3l0OfAF7yeJUF4fq5RMS07YM72BlSfn2fQQ6lPyBNjt+YbczMguPiJoCfaQC2dnflpQ==} + cpu: [arm] + os: [linux] - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@rollup/rollup-linux-arm64-gnu@4.25.0': + resolution: {integrity: sha512-qboZ+T0gHAW2kkSDPHxu7quaFaaBlynODXpBVnPxUgvWYaE84xgCKAPEYE+fSMd3Zv5PyFZR+L0tCdYCMAtG0A==} + cpu: [arm64] + os: [linux] - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@rollup/rollup-linux-arm64-musl@4.25.0': + resolution: {integrity: sha512-ndWTSEmAaKr88dBuogGH2NZaxe7u2rDoArsejNslugHZ+r44NfWiwjzizVS1nUOHo+n1Z6qV3X60rqE/HlISgw==} + cpu: [arm64] + os: [linux] - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@rollup/rollup-linux-powerpc64le-gnu@4.25.0': + resolution: {integrity: sha512-BVSQvVa2v5hKwJSy6X7W1fjDex6yZnNKy3Kx1JGimccHft6HV0THTwNtC2zawtNXKUu+S5CjXslilYdKBAadzA==} + cpu: [ppc64] + os: [linux] - /@tsconfig/node16@1.0.3: - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + '@rollup/rollup-linux-riscv64-gnu@4.25.0': + resolution: {integrity: sha512-G4hTREQrIdeV0PE2JruzI+vXdRnaK1pg64hemHq2v5fhv8C7WjVaeXc9P5i4Q5UC06d/L+zA0mszYIKl+wY8oA==} + cpu: [riscv64] + os: [linux] - /@types/argparse@1.0.38: - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true + '@rollup/rollup-linux-s390x-gnu@4.25.0': + resolution: {integrity: sha512-9T/w0kQ+upxdkFL9zPVB6zy9vWW1deA3g8IauJxojN4bnz5FwSsUAD034KpXIVX5j5p/rn6XqumBMxfRkcHapQ==} + cpu: [s390x] + os: [linux] - /@types/aria-query@5.0.1: - resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} - dev: true + '@rollup/rollup-linux-x64-gnu@4.25.0': + resolution: {integrity: sha512-ThcnU0EcMDn+J4B9LD++OgBYxZusuA7iemIIiz5yzEcFg04VZFzdFjuwPdlURmYPZw+fgVrFzj4CA64jSTG4Ig==} + cpu: [x64] + os: [linux] - /@types/babel__core@7.20.0: - resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} - dependencies: - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.3 - dev: false + '@rollup/rollup-linux-x64-musl@4.25.0': + resolution: {integrity: sha512-zx71aY2oQxGxAT1JShfhNG79PnjYhMC6voAjzpu/xmMjDnKNf6Nl/xv7YaB/9SIa9jDYf8RBPWEnjcdlhlv1rQ==} + cpu: [x64] + os: [linux] - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.20.7 - dev: false + '@rollup/rollup-win32-arm64-msvc@4.25.0': + resolution: {integrity: sha512-JT8tcjNocMs4CylWY/CxVLnv8e1lE7ff1fi6kbGocWwxDq9pj30IJ28Peb+Y8yiPNSF28oad42ApJB8oUkwGww==} + cpu: [arm64] + os: [win32] - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 - dev: false + '@rollup/rollup-win32-ia32-msvc@4.25.0': + resolution: {integrity: sha512-dRLjLsO3dNOfSN6tjyVlG+Msm4IiZnGkuZ7G5NmpzwF9oOc582FZG05+UdfTbz5Jd4buK/wMb6UeHFhG18+OEg==} + cpu: [ia32] + os: [win32] - /@types/babel__traverse@7.18.3: - resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} - dependencies: - '@babel/types': 7.20.7 - dev: false + '@rollup/rollup-win32-x64-msvc@4.25.0': + resolution: {integrity: sha512-/RqrIFtLB926frMhZD0a5oDa4eFIbyNEwLLloMTEjmqfwZWXywwVVOVmwTsuyhC9HKkVEZcOOi+KV4U9wmOdlg==} + cpu: [x64] + os: [win32] - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.4 - dev: true + '@rushstack/node-core-library@5.9.0': + resolution: {integrity: sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true - /@types/chai@4.3.4: - resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} - dev: true + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - /@types/cross-spawn@6.0.2: - resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} - dependencies: - '@types/node': 18.11.18 - dev: true + '@rushstack/terminal@0.14.2': + resolution: {integrity: sha512-2fC1wqu1VCExKC0/L+0noVcFQEXEnoBOtCIex1TOjBzEDWcw8KzJjjj7aTP6mLxepG0XIyn9OufeFb6SFsa+sg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true - /@types/debug@4.1.7: - resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} - dependencies: - '@types/ms': 0.7.31 - dev: false + '@rushstack/ts-command-line@4.23.0': + resolution: {integrity: sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ==} - /@types/estree@1.0.0: - resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + '@shikijs/core@1.22.2': + resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==} - /@types/hast@2.3.4: - resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} - dependencies: - '@types/unist': 2.0.6 - dev: false + '@shikijs/engine-javascript@1.22.2': + resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==} - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true + '@shikijs/engine-oniguruma@1.22.2': + resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==} - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} - dev: false + '@shikijs/transformers@1.22.2': + resolution: {integrity: sha512-8f78OiBa6pZDoZ53lYTmuvpFPlWtevn23bzG+azpPVvZg7ITax57o/K3TC91eYL3OMJOO0onPbgnQyZjRos8XQ==} - /@types/json5@0.0.30: - resolution: {integrity: sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==} - dev: false + '@shikijs/types@1.22.2': + resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==} - /@types/mdast@3.0.10: - resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} - dependencies: - '@types/unist': 2.0.6 - dev: false + '@shikijs/vscode-textmate@9.3.0': + resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} - /@types/ms@0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: false + '@testing-library/react@16.0.1': + resolution: {integrity: sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 + '@types/react-dom': ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - /@types/nlcst@1.0.0: - resolution: {integrity: sha512-3TGCfOcy8R8mMQ4CNSNOe3PG66HttvjcLzCoOpvXvDtfWOTi+uT/rxeOKm/qEwbM4SNe1O/PjdiBK2YcTjU4OQ==} - dependencies: - '@types/unist': 2.0.6 - dev: false + '@testing-library/user-event@14.5.2': + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' - /@types/node@17.0.45: - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - dev: false + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - /@types/node@18.11.18: - resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true + '@types/conventional-commits-parser@5.0.0': + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} - /@types/parse5@6.0.3: - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - dev: false + '@types/eslint-config-prettier@6.11.3': + resolution: {integrity: sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==} - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - dev: true + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - /@types/react-dom@18.0.10: - resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==} - dependencies: - '@types/react': 18.0.27 - dev: true + '@types/eslint__js@8.42.3': + resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} - /@types/react@18.0.27: - resolution: {integrity: sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.1 - dev: true + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - /@types/resolve@1.20.2: - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - dev: false + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - /@types/sax@1.2.4: - resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} - dependencies: - '@types/node': 18.11.18 - dev: false + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - /@types/scheduler@0.16.2: - resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - dev: true + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - /@types/semver@7.3.13: - resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} - dev: false + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - /@types/unist@2.0.6: - resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - dev: false + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: false + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - /@typescript-eslint/eslint-plugin@5.50.0(@typescript-eslint/parser@5.50.0)(eslint@8.33.0)(typescript@4.9.5): - resolution: {integrity: sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@types/node@22.9.0': + resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} + + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} + + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@typescript-eslint/eslint-plugin@8.13.0': + resolution: {integrity: sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - dependencies: - '@typescript-eslint/parser': 5.50.0(eslint@8.33.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.50.0 - '@typescript-eslint/type-utils': 5.50.0(eslint@8.33.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.50.0(eslint@8.33.0)(typescript@4.9.5) - debug: 4.3.4 - eslint: 8.33.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.3.8 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: false - /@typescript-eslint/parser@5.50.0(eslint@8.33.0)(typescript@4.9.5): - resolution: {integrity: sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/parser@8.13.0': + resolution: {integrity: sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.50.0 - '@typescript-eslint/types': 5.50.0 - '@typescript-eslint/typescript-estree': 5.50.0(typescript@4.9.5) - debug: 4.3.4 - eslint: 8.33.0 - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: false - /@typescript-eslint/scope-manager@5.50.0: - resolution: {integrity: sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.50.0 - '@typescript-eslint/visitor-keys': 5.50.0 - dev: false + '@typescript-eslint/scope-manager@8.13.0': + resolution: {integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /@typescript-eslint/type-utils@5.50.0(eslint@8.33.0)(typescript@4.9.5): - resolution: {integrity: sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/type-utils@8.13.0': + resolution: {integrity: sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '*' typescript: '*' peerDependenciesMeta: typescript: optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.50.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.50.0(eslint@8.33.0)(typescript@4.9.5) - debug: 4.3.4 - eslint: 8.33.0 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: false - /@typescript-eslint/types@5.50.0: - resolution: {integrity: sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false + '@typescript-eslint/types@8.13.0': + resolution: {integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /@typescript-eslint/typescript-estree@5.50.0(typescript@4.9.5): - resolution: {integrity: sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/typescript-estree@8.13.0': + resolution: {integrity: sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - dependencies: - '@typescript-eslint/types': 5.50.0 - '@typescript-eslint/visitor-keys': 5.50.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: false - /@typescript-eslint/utils@5.50.0(eslint@8.33.0)(typescript@4.9.5): - resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/utils@8.13.0': + resolution: {integrity: sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.50.0 - '@typescript-eslint/types': 5.50.0 - '@typescript-eslint/typescript-estree': 5.50.0(typescript@4.9.5) - eslint: 8.33.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.33.0) - semver: 7.3.8 - transitivePeerDependencies: - - supports-color - - typescript - dev: false + eslint: ^8.57.0 || ^9.0.0 - /@typescript-eslint/visitor-keys@5.50.0: - resolution: {integrity: sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.50.0 - eslint-visitor-keys: 3.3.0 - dev: false + '@typescript-eslint/visitor-keys@8.13.0': + resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /@vitest/coverage-c8@0.28.4(jsdom@21.1.0): - resolution: {integrity: sha512-btelLBxaWhHnywXRQxDlrvPhGdnuIaD3XulsxcZRIcnpLPbFu39dNTT0IYu2QWP2ZZrV0AmNtdLIfD4c77zMAg==} - dependencies: - c8: 7.12.0 - picocolors: 1.0.0 - std-env: 3.3.2 - vitest: 0.28.4(jsdom@21.1.0) - transitivePeerDependencies: - - '@edge-runtime/vm' - - '@vitest/browser' - - '@vitest/ui' - - happy-dom - - jsdom - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - /@vitest/expect@0.28.4: - resolution: {integrity: sha512-JqK0NZ4brjvOSL8hXAnIsfi+jxDF7rH/ZWCGCt0FAqRnVFc1hXsfwXksQvEnKqD84avRt3gmeXoK4tNbmkoVsQ==} - dependencies: - '@vitest/spy': 0.28.4 - '@vitest/utils': 0.28.4 - chai: 4.3.7 - dev: true + '@vitejs/plugin-vue@5.1.5': + resolution: {integrity: sha512-dlnib73G05CDBAUR/YpuZcQQ47fpjihnnNouAAqN62z+oqSsWJ+kh52GRzIxpkgFG3q11eXK7Di7RMmoCwISZA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 - /@vitest/runner@0.28.4: - resolution: {integrity: sha512-Q8UV6GjDvBSTfUoq0QXVCNpNOUrWu4P2qvRq7ssJWzn0+S0ojbVOxEjMt+8a32X6SdkhF8ak+2nkppsqV0JyNQ==} - dependencies: - '@vitest/utils': 0.28.4 - p-limit: 4.0.0 - pathe: 1.1.0 - dev: true + '@vitest/coverage-v8@2.1.4': + resolution: {integrity: sha512-FPKQuJfR6VTfcNMcGpqInmtJuVXFSCd9HQltYncfR01AzXhLucMEtQ5SinPdZxsT5x/5BK7I5qFJ5/ApGCmyTQ==} + peerDependencies: + '@vitest/browser': 2.1.4 + vitest: 2.1.4 + peerDependenciesMeta: + '@vitest/browser': + optional: true - /@vitest/spy@0.28.4: - resolution: {integrity: sha512-8WuhfXLlvCXpNXEGJW6Gc+IKWI32435fQJLh43u70HnZ1otJOa2Cmg2Wy2Aym47ZnNCP4NolF+8cUPwd0MigKQ==} - dependencies: - tinyspy: 1.0.2 - dev: true + '@vitest/expect@2.1.4': + resolution: {integrity: sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==} - /@vitest/utils@0.28.4: - resolution: {integrity: sha512-l2QztOLdc2LkR+w/lP52RGh8hW+Ul4KESmCAgVE8q737I7e7bQoAfkARKpkPJ4JQtGpwW4deqlj1732VZD7TFw==} - dependencies: - cli-truncate: 3.1.0 - diff: 5.1.0 - loupe: 2.3.6 - picocolors: 1.0.0 - pretty-format: 27.5.1 - dev: true + '@vitest/mocker@2.1.4': + resolution: {integrity: sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - /@vscode/emmet-helper@2.8.6: - resolution: {integrity: sha512-IIB8jbiKy37zN8bAIHx59YmnIelY78CGHtThnibD/d3tQOKRY83bYVi9blwmZVUZh6l9nfkYH3tvReaiNxY9EQ==} - dependencies: - emmet: 2.3.6 - jsonc-parser: 2.3.1 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.2 - vscode-uri: 2.1.2 - dev: false + '@vitest/pretty-format@2.1.4': + resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==} - /@vscode/l10n@0.0.11: - resolution: {integrity: sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA==} - dev: false + '@vitest/runner@2.1.4': + resolution: {integrity: sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==} - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: true + '@vitest/snapshot@2.1.4': + resolution: {integrity: sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==} - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: true + '@vitest/spy@2.1.4': + resolution: {integrity: sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==} - /acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} - dependencies: - acorn: 8.8.2 - acorn-walk: 8.2.0 - dev: true + '@vitest/utils@2.1.4': + resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} - /acorn-jsx@5.3.2(acorn@8.8.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + '@volar/language-core@2.4.10': + resolution: {integrity: sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==} + + '@volar/source-map@2.4.10': + resolution: {integrity: sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==} + + '@volar/typescript@2.4.10': + resolution: {integrity: sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==} + + '@vue/compiler-core@3.5.12': + resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==} + + '@vue/compiler-dom@3.5.12': + resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==} + + '@vue/compiler-sfc@3.5.12': + resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==} + + '@vue/compiler-ssr@3.5.12': + resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/devtools-api@7.6.4': + resolution: {integrity: sha512-5AaJ5ELBIuevmFMZYYLuOO9HUuY/6OlkOELHE7oeDhy4XD/hSODIzktlsvBOsn+bto3aD0psj36LGzwVu5Ip8w==} + + '@vue/devtools-kit@7.6.4': + resolution: {integrity: sha512-Zs86qIXXM9icU0PiGY09PQCle4TI750IPLmAJzW5Kf9n9t5HzSYf6Rz6fyzSwmfMPiR51SUKJh9sXVZu78h2QA==} + + '@vue/devtools-shared@7.6.4': + resolution: {integrity: sha512-nD6CUvBEel+y7zpyorjiUocy0nh77DThZJ0k1GRnJeOmY3ATq2fWijEp7wk37gb023Cb0R396uYh5qMSBQ5WFg==} + + '@vue/language-core@2.1.6': + resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.8.2 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - /acorn-node@1.8.2: - resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - xtend: 4.0.2 - dev: false + '@vue/reactivity@3.5.12': + resolution: {integrity: sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==} - /acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - dev: false + '@vue/runtime-core@3.5.12': + resolution: {integrity: sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==} - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} + '@vue/runtime-dom@3.5.12': + resolution: {integrity: sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==} - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} + '@vue/server-renderer@3.5.12': + resolution: {integrity: sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==} + peerDependencies: + vue: 3.5.12 + + '@vue/shared@3.5.12': + resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==} + + '@vueuse/core@11.2.0': + resolution: {integrity: sha512-JIUwRcOqOWzcdu1dGlfW04kaJhW3EXnnjJJfLTtddJanymTL7lF1C0+dVVZ/siLfc73mWn+cGP1PE1PKPruRSA==} + + '@vueuse/integrations@11.2.0': + resolution: {integrity: sha512-zGXz3dsxNHKwiD9jPMvR3DAxQEOV6VWIEYTGVSB9PNpk4pTWR+pXrHz9gvXWcP2sTk3W2oqqS6KwWDdntUvNVA==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@11.2.0': + resolution: {integrity: sha512-L0ZmtRmNx+ZW95DmrgD6vn484gSpVeRbgpWevFKXwqqQxW9hnSi2Ppuh2BzMjnbv4aJRiIw8tQatXT9uOB23dQ==} + + '@vueuse/shared@11.2.0': + resolution: {integrity: sha512-VxFjie0EanOudYSgMErxXfq6fo8vhr5ICI+BuE3I9FnX7ePllEsVrRQ7O6Q1TLgApeLuPKcHQxAXpP+KnlrJsg==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true - dev: false - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true - /ajv@6.12.6: + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - /ajv@8.12.0: + ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - dependencies: - string-width: 4.2.3 - dev: false + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true + algoliasearch@5.13.0: + resolution: {integrity: sha512-04lyQX3Ev/oLYQx+aagamQDXvkUUfX1mwrLrus15+9fNaYj28GDxxEzbwaRfvmHFcZyoxvup7mMtDTTw8SrTEQ==} + engines: {node: '>= 14.0.0'} - /ansi-regex@5.0.1: + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - - /ansi-styles@4.3.0: + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - /ansi-styles@5.2.0: + ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - dev: true - /ansi-styles@6.2.1: + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: false - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: false - - /argparse@1.0.10: + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - /argparse@2.0.1: + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.0 + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - /array-ify@1.0.0: + array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - get-intrinsic: 1.2.0 - is-string: 1.0.7 - dev: false + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} - /array-iterate@2.0.1: - resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} - dev: false + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - es-shim-unscopables: 1.0.0 - dev: false + birpc@0.2.19: + resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - /ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - dev: false + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - dev: true - /astro-eslint-parser@0.11.0: - resolution: {integrity: sha512-vcz8KBQ20WNOot6qK6w7DQtz2hwg+aLLqlUa6nAnitJLqbR12GxJN/+96U3O+VI4da5Up+FMWqNoL9mywSENtA==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@astrojs/compiler': 1.0.1 - '@typescript-eslint/scope-manager': 5.50.0 - '@typescript-eslint/types': 5.50.0 - astrojs-compiler-sync: 0.3.1(@astrojs/compiler@1.0.1) - debug: 4.3.4 - eslint-visitor-keys: 3.3.0 - espree: 9.4.1 - transitivePeerDependencies: - - supports-color - dev: false + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} - /astro@2.0.6(@types/node@18.11.18): - resolution: {integrity: sha512-aI8Ijy2EpMyP5SpjmDJpEUdNL6CUAxnja6IeaBC1BokD/mNAnijtmMnTyWVI3UeEZ727wYLISQMyqCfEUq8VNA==} - engines: {node: '>=16.12.0', npm: '>=6.14.0'} - hasBin: true - dependencies: - '@astrojs/compiler': 1.0.1 - '@astrojs/language-server': 0.28.3 - '@astrojs/markdown-remark': 2.0.1(astro@2.0.6) - '@astrojs/telemetry': 2.0.0 - '@astrojs/webapi': 2.0.0 - '@babel/core': 7.20.12 - '@babel/generator': 7.20.14 - '@babel/parser': 7.20.15 - '@babel/plugin-transform-react-jsx': 7.20.13(@babel/core@7.20.12) - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 - '@types/babel__core': 7.20.0 - '@types/yargs-parser': 21.0.0 - acorn: 8.8.2 - boxen: 6.2.1 - ci-info: 3.7.1 - common-ancestor-path: 1.0.1 - cookie: 0.5.0 - debug: 4.3.4 - deepmerge-ts: 4.2.2 - devalue: 4.2.3 - diff: 5.1.0 - es-module-lexer: 1.1.0 - estree-walker: 3.0.3 - execa: 6.1.0 - fast-glob: 3.2.12 - github-slugger: 2.0.0 - gray-matter: 4.0.3 - html-escaper: 3.0.3 - kleur: 4.1.5 - magic-string: 0.27.0 - mime: 3.0.0 - ora: 6.1.2 - path-to-regexp: 6.2.1 - preferred-pm: 3.0.3 - prompts: 2.4.2 - rehype: 12.0.1 - semver: 7.3.8 - server-destroy: 1.0.1 - shiki: 0.11.1 - slash: 4.0.0 - string-width: 5.1.2 - strip-ansi: 7.0.1 - supports-esm: 1.0.0 - tsconfig-resolver: 3.0.1 - typescript: 4.9.5 - unist-util-visit: 4.1.2 - vfile: 5.3.6 - vite: 4.1.1(@types/node@18.11.18) - vitefu: 0.2.4(vite@4.1.1) - yargs-parser: 21.1.1 - zod: 3.20.2 - transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: false + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - /astrojs-compiler-sync@0.3.1(@astrojs/compiler@1.0.1): - resolution: {integrity: sha512-IzPuzkwdiRIZoBhCTuFhuBMWVESXgthTdwQ24QS8LvLargcWAA4E21KmZo4wimsmOG5vj4KKs9QFpy9zhXuo9Q==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@astrojs/compiler': '>=0.27.0' - dependencies: - '@astrojs/compiler': 1.0.1 - synckit: 0.8.5 - dev: false - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - - /autoprefixer@10.4.13(postcss@8.4.21): - resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001450 - fraction.js: 4.2.0 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - dev: false - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} - /axe-core@4.6.3: - resolution: {integrity: sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==} - engines: {node: '>=4'} - dev: false + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} - /axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} - dependencies: - deep-equal: 2.2.0 - dev: false + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: false + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} - /bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 3.6.0 - dev: false + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} - /boxen@6.2.1: - resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - dev: false + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001450 - electron-to-chromium: 1.4.286 - node-releases: 2.0.9 - update-browserslist-db: 1.0.10(browserslist@4.21.5) - dev: false + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: false + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - /c8@7.12.0: - resolution: {integrity: sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==} - engines: {node: '>=10.12.0'} - hasBin: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 2.0.0 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-report: 3.0.0 - istanbul-reports: 3.1.5 - rimraf: 3.0.2 - test-exclude: 6.0.0 - v8-to-istanbul: 9.0.1 - yargs: 16.2.0 - yargs-parser: 20.2.9 - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.0 + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: false + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: false + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true - /caniuse-lite@1.0.30001450: - resolution: {integrity: sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==} - dev: false + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: false + cosmiconfig-typescript-loader@5.1.0: + resolution: {integrity: sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + cross-spawn@7.0.5: + resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} + engines: {node: '>= 8'} - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false + cssstyle@4.1.0: + resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} + engines: {node: '>=18'} - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: false + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: false + dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: false + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: false + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - /ci-info@3.7.1: - resolution: {integrity: sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==} - engines: {node: '>=8'} - dev: false + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - dev: true - - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: false - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: true + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - restore-cursor: 4.0.0 - dev: false + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} - /cli-spinners@2.7.0: - resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: false - /cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - dev: true - /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - slice-ansi: 5.0.0 - string-width: 5.1.2 - dev: true + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: false + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - /code-block-writer@11.0.3: - resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} - dev: true + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} - /colorette@2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - dev: true + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - /colors@1.2.5: - resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} - engines: {node: '>=0.1.90'} - dev: true + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /commitlint@17.4.2: - resolution: {integrity: sha512-1UQecX+vSJHQXTKFMRZmf8EG3BYYjkT26JLe6FTQhu7N67FiWdWbqXMpcQSpqx/kWNz9a+DX2au2e61IH89PDA==} - engines: {node: '>=v14'} + eslint@9.14.0: + resolution: {integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true - dependencies: - '@commitlint/cli': 17.4.2 - '@commitlint/types': 17.4.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - dev: true - - /common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - dev: false + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} - /conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: true + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} - /conventional-changelog-conventionalcommits@5.0.0: - resolution: {integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - dev: false + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} - /conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: false + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} - /cosmiconfig-typescript-loader@4.3.0(@types/node@18.11.18)(cosmiconfig@8.0.0)(ts-node@10.9.1)(typescript@4.9.5): - resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=7' - ts-node: '>=10' - typescript: '>=3' - dependencies: - '@types/node': 18.11.18 - cosmiconfig: 8.0.0 - ts-node: 10.9.1(@types/node@18.11.18)(typescript@4.9.5) - typescript: 4.9.5 - dev: true - - /cosmiconfig@8.0.0: - resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} - engines: {node: '>=14'} - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - dev: true + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: false + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: true + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} - /cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - dev: true + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - /cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - dependencies: - cssom: 0.3.8 - dev: true + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - /csstype@3.1.1: - resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - dev: true + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: false + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - dev: true - /data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - dev: true + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true + focus-trap@7.6.1: + resolution: {integrity: sha512-nB8y4nQl8PshahLpGKZOq1sb0xrMVFSn6at7u/qOsBZTlZRzaapISGENcB6mOkoezbClZyiMwEF/dGY8AZ00rA==} - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: false + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /deep-equal@2.2.0: - resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} - dependencies: - call-bind: 1.0.2 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.0 - is-arguments: 1.1.1 - is-array-buffer: 3.0.1 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.9 - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} - /deepmerge-ts@4.2.2: - resolution: {integrity: sha512-Ka3Kb21tiWjvQvS9U+1Dx+aqFAHsdTnMdYptLTmC2VAmDFMugWMY1e15aTODstipmCun8iNuqeSfcx6rsUUk0Q==} - engines: {node: '>=12.4.0'} - dev: false + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} - /deepmerge@4.3.0: - resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} - engines: {node: '>=0.10.0'} - dev: false + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - dev: false + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: false + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - /define-properties@1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} - /defined@1.0.1: - resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} - dev: false + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: false + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} - /detective@5.2.1: - resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} - engines: {node: '>=0.8.0'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - dependencies: - acorn-node: 1.8.2 - defined: 1.0.1 - minimist: 1.2.7 - dev: false - /devalue@4.2.3: - resolution: {integrity: sha512-JG6Q248aN0pgFL57e3zqTVeFraBe+5W2ugvv1mLXsJP6YYIYJhRZhAl7QP8haJrqob6X10F9NEkuCvNILZTPeQ==} - dev: false + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: false + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: false + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.1.6: + resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdom@25.0.1: + resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@15.2.10: + resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minisearch@7.1.0: + resolution: {integrity: sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mlly@1.7.2: + resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nwsapi@2.2.13: + resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + oniguruma-to-js@0.4.3: + resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + + postcss@8.4.48: + resolution: {integrity: sha512-GCRK8F6+Dl7xYniR5a4FYbpBzU8XnZVeowqsQFYdcXuSbChgiks7qybSkbvnaeqv0G0B+dd9/jJgH8kkLDQeEA==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.24.3: + resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regex@4.4.0: + resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.25.0: + resolution: {integrity: sha512-uVbClXmR6wvx5R1M3Od4utyLUxrmOcEm3pAtMphn73Apq19PDtHpgZoEvqH2YnnaNUuvKmg2DgRd2Sqv+odyqg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + search-insights@2.17.2: + resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==} + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@1.22.2: + resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} - /domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - dependencies: - webidl-conversions: 7.0.0 - dev: true - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} - /dset@3.1.2: - resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==} - engines: {node: '>=4'} - dev: false + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} - /electron-to-chromium@1.4.286: - resolution: {integrity: sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==} - dev: false + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} - /emmet@2.3.6: - resolution: {integrity: sha512-pLS4PBPDdxuUAmw7Me7+TcHbykTsBKN/S9XJbUOMFQrNv9MoshzyMFK/R57JBm94/6HSL4vHnDeEmxlC82NQ4A==} - dependencies: - '@emmetio/abbreviation': 2.2.3 - '@emmetio/css-abbreviation': 2.1.4 - dev: false + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} - /entities@4.4.0: - resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} - engines: {node: '>=0.12'} - dev: true + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} - /es-abstract@1.21.1: - resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.0 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.4 - is-array-buffer: 3.0.1 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.10 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - safe-regex-test: 1.0.0 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 - dev: false - - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - - /es-module-lexer@1.1.0: - resolution: {integrity: sha512-fJg+1tiyEeS8figV+fPcPpm8WqJEflG3yPU0NOm5xMvrNkuiy7HzX/Ljng4Y0hAoiw4/3hQTCFYw+ub8+a2pRA==} - dev: false - - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - has-tostringtag: 1.0.0 - dev: false - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - dependencies: - has: 1.0.3 - dev: false + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: false + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - /esbuild@0.16.17: - resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.16.17 - '@esbuild/android-arm64': 0.16.17 - '@esbuild/android-x64': 0.16.17 - '@esbuild/darwin-arm64': 0.16.17 - '@esbuild/darwin-x64': 0.16.17 - '@esbuild/freebsd-arm64': 0.16.17 - '@esbuild/freebsd-x64': 0.16.17 - '@esbuild/linux-arm': 0.16.17 - '@esbuild/linux-arm64': 0.16.17 - '@esbuild/linux-ia32': 0.16.17 - '@esbuild/linux-loong64': 0.16.17 - '@esbuild/linux-mips64el': 0.16.17 - '@esbuild/linux-ppc64': 0.16.17 - '@esbuild/linux-riscv64': 0.16.17 - '@esbuild/linux-s390x': 0.16.17 - '@esbuild/linux-x64': 0.16.17 - '@esbuild/netbsd-x64': 0.16.17 - '@esbuild/openbsd-x64': 0.16.17 - '@esbuild/sunos-x64': 0.16.17 - '@esbuild/win32-arm64': 0.16.17 - '@esbuild/win32-ia32': 0.16.17 - '@esbuild/win32-x64': 0.16.17 - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: false + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - /escodegen@2.0.0: - resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} - engines: {node: '>=6.0'} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + tldts-core@6.1.60: + resolution: {integrity: sha512-XHjoxak8SFQnHnmYHb3PcnW5TZ+9ErLZemZei3azuIRhQLw4IExsVbL3VZJdHcLeNaXq6NqawgpDPpjBOg4B5g==} + + tldts@6.1.60: + resolution: {integrity: sha512-TYVHm7G9NCnhgqOsFalbX6MG1Po5F4efF+tLfoeiOGQq48Oqgwcgz8upY2R1BHWa4aDrj28RYx0dkYJ63qCFMg==} hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - dev: true - /eslint-config-prettier@8.6.0(eslint@8.33.0): - resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tough-cookie@5.0.0: + resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} + engines: {node: '>=16'} + + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + ts-api-utils@1.4.0: + resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tsconfck@3.1.4: + resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} + engines: {node: ^18 || >=20} hasBin: true peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.33.0 - dev: false + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /eslint-config-turbo@0.0.7(eslint@8.33.0): - resolution: {integrity: sha512-WbrGlyfs94rOXrhombi1wjIAYGdV2iosgJRndOZtmDQeq5GLTzYmBUCJQZWtLBEBUPCj96RxZ2OL7Cn+xv/Azg==} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.13.0: + resolution: {integrity: sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>6.6.0' - dependencies: - eslint: 8.33.0 - eslint-plugin-turbo: 0.0.7(eslint@8.33.0) - dev: false + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - /eslint-plugin-astro@0.23.0(eslint@8.33.0): - resolution: {integrity: sha512-KsIL1sOrz40qf/d9RP4E3sH6+p6nrIBBXB6rPuE9EWb5de+m9BWfvURuoECXfiXCmQh8UlHJUxgSWxn1bLsD8g==} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@2.1.4: + resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-dts@4.3.0: + resolution: {integrity: sha512-LkBJh9IbLwL6/rxh0C1/bOurDrIEmRE7joC+jFdOEEciAFPbpEKOLSAr5nNh5R7CJ45cMbksTrFfy52szzC5eA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: '>=7.0.0' - dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 - '@typescript-eslint/types': 5.50.0 - astro-eslint-parser: 0.11.0 - eslint: 8.33.0 - eslint-utils: 3.0.0(eslint@8.33.0) - postcss: 8.4.21 - postcss-selector-parser: 6.0.11 - transitivePeerDependencies: - - supports-color - dev: false + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.33.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} - engines: {node: '>=4.0'} + vite-tsconfig-paths@5.1.2: + resolution: {integrity: sha512-gEIbKfJzSEv0yR3XS2QEocKetONoWkbROj6hGx0FHM18qKUojhvcokQsxQx5nMkelZq2n37zbSGCJn+FSODSjA==} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - '@babel/runtime': 7.20.13 - aria-query: 5.1.3 - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - ast-types-flow: 0.0.7 - axe-core: 4.6.3 - axobject-query: 3.1.1 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.33.0 - has: 1.0.3 - jsx-ast-utils: 3.3.3 - language-tags: 1.0.5 - minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - semver: 6.3.0 - dev: false + vite: '*' + peerDependenciesMeta: + vite: + optional: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.33.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} + vite@5.4.10: + resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.33.0 - dev: false + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true - /eslint-plugin-turbo@0.0.7(eslint@8.33.0): - resolution: {integrity: sha512-iajOH8eD4jha3duztGVBD1BEmvNrQBaA/y3HFHf91vMDRYRwH7BpHSDFtxydDpk5ghlhRxG299SFxz7D6z4MBQ==} + vitepress@1.5.0: + resolution: {integrity: sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g==} + hasBin: true peerDependencies: - eslint: '>6.6.0' - dependencies: - eslint: 8.33.0 - dev: false + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: false + vitest@2.1.4: + resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.4 + '@vitest/ui': 2.1.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true - /eslint-scope@7.1.1: - resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - /eslint-utils@3.0.0(eslint@8.33.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.33.0 - eslint-visitor-keys: 2.1.0 + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue@3.5.12: + resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - /eslint-visitor-keys@3.3.0: - resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} - /eslint@8.33.0: - resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.11.8 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 - eslint-utils: 3.0.0(eslint@8.33.0) - eslint-visitor-keys: 3.3.0 - espree: 9.4.1 - esquery: 1.4.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.3.0 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - regexpp: 3.2.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - /espree@9.4.1: - resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) - eslint-visitor-keys: 3.3.0 + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - /esquery@1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 +snapshots: - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + '@algolia/autocomplete-core@1.17.6(@algolia/client-search@5.13.0)(algoliasearch@5.13.0)(search-insights@2.17.2)': dependencies: - estraverse: 5.3.0 + '@algolia/autocomplete-plugin-algolia-insights': 1.17.6(@algolia/client-search@5.13.0)(algoliasearch@5.13.0)(search-insights@2.17.2) + '@algolia/autocomplete-shared': 1.17.6(@algolia/client-search@5.13.0)(algoliasearch@5.13.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: false + '@algolia/autocomplete-plugin-algolia-insights@1.17.6(@algolia/client-search@5.13.0)(algoliasearch@5.13.0)(search-insights@2.17.2)': + dependencies: + '@algolia/autocomplete-shared': 1.17.6(@algolia/client-search@5.13.0)(algoliasearch@5.13.0) + search-insights: 2.17.2 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + '@algolia/autocomplete-preset-algolia@1.17.6(@algolia/client-search@5.13.0)(algoliasearch@5.13.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.6(@algolia/client-search@5.13.0)(algoliasearch@5.13.0) + '@algolia/client-search': 5.13.0 + algoliasearch: 5.13.0 - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true + '@algolia/autocomplete-shared@1.17.6(@algolia/client-search@5.13.0)(algoliasearch@5.13.0)': + dependencies: + '@algolia/client-search': 5.13.0 + algoliasearch: 5.13.0 - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + '@algolia/client-abtesting@5.13.0': dependencies: - '@types/estree': 1.0.0 - dev: false + '@algolia/client-common': 5.13.0 + '@algolia/requester-browser-xhr': 5.13.0 + '@algolia/requester-fetch': 5.13.0 + '@algolia/requester-node-http': 5.13.0 - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + '@algolia/client-analytics@5.13.0': + dependencies: + '@algolia/client-common': 5.13.0 + '@algolia/requester-browser-xhr': 5.13.0 + '@algolia/requester-fetch': 5.13.0 + '@algolia/requester-node-http': 5.13.0 - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: false + '@algolia/client-common@5.13.0': {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + '@algolia/client-insights@5.13.0': dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@6.1.0: - resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + '@algolia/client-common': 5.13.0 + '@algolia/requester-browser-xhr': 5.13.0 + '@algolia/requester-fetch': 5.13.0 + '@algolia/requester-node-http': 5.13.0 + + '@algolia/client-personalization@5.13.0': dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 3.0.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 + '@algolia/client-common': 5.13.0 + '@algolia/requester-browser-xhr': 5.13.0 + '@algolia/requester-fetch': 5.13.0 + '@algolia/requester-node-http': 5.13.0 - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + '@algolia/client-query-suggestions@5.13.0': dependencies: - is-extendable: 0.1.1 - dev: false + '@algolia/client-common': 5.13.0 + '@algolia/requester-browser-xhr': 5.13.0 + '@algolia/requester-fetch': 5.13.0 + '@algolia/requester-node-http': 5.13.0 - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false + '@algolia/client-search@5.13.0': + dependencies: + '@algolia/client-common': 5.13.0 + '@algolia/requester-browser-xhr': 5.13.0 + '@algolia/requester-fetch': 5.13.0 + '@algolia/requester-node-http': 5.13.0 - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + '@algolia/ingestion@1.13.0': + dependencies: + '@algolia/client-common': 5.13.0 + '@algolia/requester-browser-xhr': 5.13.0 + '@algolia/requester-fetch': 5.13.0 + '@algolia/requester-node-http': 5.13.0 - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} + '@algolia/monitoring@1.13.0': dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 + '@algolia/client-common': 5.13.0 + '@algolia/requester-browser-xhr': 5.13.0 + '@algolia/requester-fetch': 5.13.0 + '@algolia/requester-node-http': 5.13.0 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + '@algolia/recommend@5.13.0': + dependencies: + '@algolia/client-common': 5.13.0 + '@algolia/requester-browser-xhr': 5.13.0 + '@algolia/requester-fetch': 5.13.0 + '@algolia/requester-node-http': 5.13.0 - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + '@algolia/requester-browser-xhr@5.13.0': + dependencies: + '@algolia/client-common': 5.13.0 - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + '@algolia/requester-fetch@5.13.0': dependencies: - reusify: 1.0.4 + '@algolia/client-common': 5.13.0 - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + '@algolia/requester-node-http@5.13.0': dependencies: - flat-cache: 3.0.4 + '@algolia/client-common': 5.13.0 - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + '@ampproject/remapping@2.3.0': dependencies: - to-regex-range: 5.0.1 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + '@babel/code-frame@7.26.2': dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.2': dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 + '@babel/types': 7.26.0 - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + '@babel/runtime@7.26.0': dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.0 - dev: false + regenerator-runtime: 0.14.1 - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + '@babel/types@7.26.0': dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + '@bcoe/v8-coverage@0.2.3': {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + '@commitlint/cli@19.5.0(@types/node@22.9.0)(typescript@5.6.3)': dependencies: - is-callable: 1.2.7 + '@commitlint/format': 19.5.0 + '@commitlint/lint': 19.5.0 + '@commitlint/load': 19.5.0(@types/node@22.9.0)(typescript@5.6.3) + '@commitlint/read': 19.5.0 + '@commitlint/types': 19.5.0 + tinyexec: 0.3.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} + '@commitlint/config-conventional@19.5.0': dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - dev: true + '@commitlint/types': 19.5.0 + conventional-changelog-conventionalcommits: 7.0.2 - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + '@commitlint/config-validator@19.5.0': dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true + '@commitlint/types': 19.5.0 + ajv: 8.13.0 - /fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: false + '@commitlint/ensure@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + '@commitlint/execute-rule@19.5.0': {} + + '@commitlint/format@19.5.0': dependencies: - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true + '@commitlint/types': 19.5.0 + chalk: 5.3.0 - /fs-extra@11.1.0: - resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} - engines: {node: '>=14.14'} + '@commitlint/is-ignored@19.5.0': dependencies: - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true + '@commitlint/types': 19.5.0 + semver: 7.6.3 - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + '@commitlint/lint@19.5.0': dependencies: - graceful-fs: 4.2.10 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true + '@commitlint/is-ignored': 19.5.0 + '@commitlint/parse': 19.5.0 + '@commitlint/rules': 19.5.0 + '@commitlint/types': 19.5.0 - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + '@commitlint/load@19.5.0(@types/node@22.9.0)(typescript@5.6.3)': + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 + chalk: 5.3.0 + cosmiconfig: 9.0.0(typescript@5.6.3) + cosmiconfig-typescript-loader: 5.1.0(@types/node@22.9.0)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true + '@commitlint/message@19.5.0': {} - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + '@commitlint/parse@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} + '@commitlint/read@19.5.0': dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - functions-have-names: 1.2.3 - dev: false + '@commitlint/top-level': 19.5.0 + '@commitlint/types': 19.5.0 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + tinyexec: 0.3.1 - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + '@commitlint/resolve-extends@19.5.0': + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: false + '@commitlint/rules@19.5.0': + dependencies: + '@commitlint/ensure': 19.5.0 + '@commitlint/message': 19.5.0 + '@commitlint/to-lines': 19.5.0 + '@commitlint/types': 19.5.0 - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true + '@commitlint/to-lines@19.5.0': {} - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true + '@commitlint/top-level@19.5.0': + dependencies: + find-up: 7.0.0 - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + '@commitlint/types@19.5.0': dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 + '@types/conventional-commits-parser': 5.0.0 + chalk: 5.3.0 - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + '@docsearch/css@3.7.0': {} - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} + '@docsearch/js@3.7.0(@algolia/client-search@5.13.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)': dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - dev: false + '@docsearch/react': 3.7.0(@algolia/client-search@5.13.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2) + preact: 10.24.3 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + + '@docsearch/react@3.7.0(@algolia/client-search@5.13.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)': + dependencies: + '@algolia/autocomplete-core': 1.17.6(@algolia/client-search@5.13.0)(algoliasearch@5.13.0)(search-insights@2.17.2) + '@algolia/autocomplete-preset-algolia': 1.17.6(@algolia/client-search@5.13.0)(algoliasearch@5.13.0) + '@docsearch/css': 3.7.0 + algoliasearch: 5.13.0 + optionalDependencies: + '@types/react': 18.3.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + search-insights: 2.17.2 + transitivePeerDependencies: + - '@algolia/client-search' - /git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true + '@esbuild/aix-ppc64@0.21.5': + optional: true - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - dev: false + '@esbuild/android-arm64@0.21.5': + optional: true - /github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - dev: false + '@esbuild/android-arm@0.21.5': + optional: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 + '@esbuild/android-x64@0.21.5': + optional: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 + '@esbuild/darwin-arm64@0.21.5': + optional: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + '@esbuild/darwin-x64@0.21.5': + optional: true - /global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - dependencies: - ini: 1.3.8 - dev: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: false + '@esbuild/freebsd-x64@0.21.5': + optional: true - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 + '@esbuild/linux-arm64@0.21.5': + optional: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.1.4 - dev: false + '@esbuild/linux-arm@0.21.5': + optional: true - /globalyzer@0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - dev: false + '@esbuild/linux-ia32@0.21.5': + optional: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: false + '@esbuild/linux-loong64@0.21.5': + optional: true - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + '@esbuild/linux-mips64el@0.21.5': + optional: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.0 + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true - /graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + '@esbuild/linux-s390x@0.21.5': + optional: true - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + '@esbuild/linux-x64@0.21.5': + optional: true - /gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - dev: false + '@esbuild/netbsd-x64@0.21.5': + optional: true - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + '@esbuild/win32-arm64@0.21.5': + optional: true - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + '@esbuild/win32-ia32@0.21.5': + optional: true - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.14.0(jiti@1.21.6))': + dependencies: + eslint: 9.14.0(jiti@1.21.6) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} - /has-package-exports@1.3.0: - resolution: {integrity: sha512-e9OeXPQnmPhYoJ63lXC4wWe34TxEGZDZ3OQX9XRqp2VwsfLl3bQBy7VehLnd34g3ef8CmYlBLGqEMKXuz8YazQ==} + '@eslint/config-array@0.18.0': dependencies: - '@ljharb/has-package-exports-patterns': 0.0.2 - dev: false + '@eslint/object-schema': 2.1.4 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.7.0': {} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + '@eslint/eslintrc@3.1.0': dependencies: - get-intrinsic: 1.2.0 + ajv: 6.12.6 + debug: 4.3.7 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: false + '@eslint/js@9.14.0': {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + '@eslint/object-schema@2.1.4': {} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + '@eslint/plugin-kit@0.2.2': dependencies: - has-symbols: 1.0.3 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + '@humanfs/node@0.16.6': dependencies: - function-bind: 1.1.1 + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} - /hast-util-from-parse5@7.1.1: - resolution: {integrity: sha512-R6PoNcUs89ZxLJmMWsVbwSWuz95/9OriyQZ3e2ybwqGsRXzhA6gv49rgGmQvLbZuSNDv9fCg7vV7gXUsvtUFaA==} + '@humanwhocodes/retry@0.4.1': {} + + '@iconify-json/simple-icons@1.2.11': dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - hastscript: 7.2.0 - property-information: 6.2.0 - vfile: 5.3.6 - vfile-location: 4.0.1 - web-namespaces: 2.0.1 - dev: false + '@iconify/types': 2.0.0 - /hast-util-has-property@2.0.1: - resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==} - dev: false + '@iconify/types@2.0.0': {} - /hast-util-heading-rank@2.1.1: - resolution: {integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==} + '@isaacs/cliui@8.0.2': dependencies: - '@types/hast': 2.3.4 - dev: false + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} - /hast-util-is-element@2.1.3: - resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} + '@jridgewell/gen-mapping@0.3.5': dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - dev: false + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 - /hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@types/hast': 2.3.4 - dev: false + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - /hast-util-raw@7.2.3: - resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + '@microsoft/api-extractor-model@7.29.8(@types/node@22.9.0)': dependencies: - '@types/hast': 2.3.4 - '@types/parse5': 6.0.3 - hast-util-from-parse5: 7.1.1 - hast-util-to-parse5: 7.1.0 - html-void-elements: 2.0.1 - parse5: 6.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - vfile: 5.3.6 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false + '@microsoft/tsdoc': 0.15.0 + '@microsoft/tsdoc-config': 0.17.0 + '@rushstack/node-core-library': 5.9.0(@types/node@22.9.0) + transitivePeerDependencies: + - '@types/node' - /hast-util-to-html@8.0.4: - resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + '@microsoft/api-extractor@7.47.11(@types/node@22.9.0)': dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-raw: 7.2.3 - hast-util-whitespace: 2.0.1 - html-void-elements: 2.0.1 - property-information: 6.2.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.3 - zwitch: 2.0.4 - dev: false + '@microsoft/api-extractor-model': 7.29.8(@types/node@22.9.0) + '@microsoft/tsdoc': 0.15.0 + '@microsoft/tsdoc-config': 0.17.0 + '@rushstack/node-core-library': 5.9.0(@types/node@22.9.0) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.14.2(@types/node@22.9.0) + '@rushstack/ts-command-line': 4.23.0(@types/node@22.9.0) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 + transitivePeerDependencies: + - '@types/node' - /hast-util-to-parse5@7.1.0: - resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + '@microsoft/tsdoc-config@0.17.0': dependencies: - '@types/hast': 2.3.4 - comma-separated-tokens: 2.0.3 - property-information: 6.2.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false + '@microsoft/tsdoc': 0.15.0 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.8 - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: false + '@microsoft/tsdoc@0.15.0': {} - /hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + '@nodelib/fs.scandir@2.1.5': dependencies: - '@types/hast': 2.3.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 3.1.1 - property-information: 6.2.0 - space-separated-tokens: 2.0.2 - dev: false + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + '@nodelib/fs.walk@1.2.8': dependencies: - lru-cache: 6.0.0 - dev: true + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 - /html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/pluginutils@5.1.3(rollup@4.25.0)': dependencies: - whatwg-encoding: 2.0.0 - dev: true + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.25.0 - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + '@rollup/rollup-android-arm-eabi@4.25.0': + optional: true - /html-escaper@3.0.3: - resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} - dev: false + '@rollup/rollup-android-arm64@4.25.0': + optional: true - /html-void-elements@2.0.1: - resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} - dev: false + '@rollup/rollup-darwin-arm64@4.25.0': + optional: true - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true + '@rollup/rollup-darwin-x64@4.25.0': + optional: true - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true + '@rollup/rollup-freebsd-arm64@4.25.0': + optional: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + '@rollup/rollup-freebsd-x64@4.25.0': + optional: true - /human-signals@3.0.1: - resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} - engines: {node: '>=12.20.0'} + '@rollup/rollup-linux-arm-gnueabihf@4.25.0': + optional: true - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true + '@rollup/rollup-linux-arm-musleabihf@4.25.0': + optional: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true + '@rollup/rollup-linux-arm64-gnu@4.25.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.25.0': + optional: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false + '@rollup/rollup-linux-powerpc64le-gnu@4.25.0': + optional: true - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} + '@rollup/rollup-linux-riscv64-gnu@4.25.0': + optional: true - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 + '@rollup/rollup-linux-s390x-gnu@4.25.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.25.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.25.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.25.0': + optional: true - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true + '@rollup/rollup-win32-ia32-msvc@4.25.0': + optional: true - /import-meta-resolve@2.2.1: - resolution: {integrity: sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw==} - dev: false + '@rollup/rollup-win32-x64-msvc@4.25.0': + optional: true - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + '@rushstack/node-core-library@5.9.0(@types/node@22.9.0)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + optionalDependencies: + '@types/node': 22.9.0 - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + '@rushstack/rig-package@0.5.3': + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.14.2(@types/node@22.9.0)': + dependencies: + '@rushstack/node-core-library': 5.9.0(@types/node@22.9.0) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 22.9.0 - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + '@rushstack/ts-command-line@4.23.0(@types/node@22.9.0)': dependencies: - once: 1.4.0 - wrappy: 1.0.2 + '@rushstack/terminal': 0.14.2(@types/node@22.9.0) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + '@shikijs/core@1.22.2': + dependencies: + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + '@shikijs/engine-javascript@1.22.2': + dependencies: + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + oniguruma-to-js: 0.4.3 - /internal-slot@1.0.4: - resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} - engines: {node: '>= 0.4'} + '@shikijs/engine-oniguruma@1.22.2': dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - side-channel: 1.0.4 + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + '@shikijs/transformers@1.22.2': dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + shiki: 1.22.2 - /is-array-buffer@3.0.1: - resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} + '@shikijs/types@1.22.2': dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-typed-array: 1.1.10 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + '@shikijs/vscode-textmate@9.3.0': {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + '@testing-library/dom@10.4.0': dependencies: - has-bigints: 1.0.2 + '@babel/code-frame': 7.26.2 + '@babel/runtime': 7.26.0 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - binary-extensions: 2.2.0 - dev: false + '@babel/runtime': 7.26.0 + '@testing-library/dom': 10.4.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + '@testing-library/dom': 10.4.0 - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false + '@types/argparse@1.0.38': {} - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + '@types/aria-query@5.0.4': {} - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + '@types/conventional-commits-parser@5.0.0': dependencies: - has: 1.0.3 + '@types/node': 22.9.0 - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + '@types/eslint-config-prettier@6.11.3': {} + + '@types/eslint@9.6.1': dependencies: - has-tostringtag: 1.0.0 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: false + '@types/eslint__js@8.42.3': + dependencies: + '@types/eslint': 9.6.1 - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: false + '@types/estree@1.0.6': {} - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + '@types/json-schema@7.0.15': {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + '@types/linkify-it@5.0.0': {} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + '@types/mdast@4.0.4': dependencies: - is-extglob: 2.1.1 + '@types/unist': 3.0.3 - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: false + '@types/mdurl@2.0.0': {} - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + '@types/node@22.9.0': + dependencies: + undici-types: 6.19.8 - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: false + '@types/prop-types@15.7.13': {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + '@types/react-dom@18.3.1': dependencies: - has-tostringtag: 1.0.0 + '@types/react': 18.3.12 - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + '@types/react@18.3.12': + dependencies: + '@types/prop-types': 15.7.13 + csstype: 3.1.3 - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} + '@types/unist@3.0.3': {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + '@types/web-bluetooth@0.0.20': {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + '@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.13.0 + eslint: 9.14.0(jiti@1.21.6) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false + '@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.13.0 + debug: 4.3.7 + eslint: 9.14.0(jiti@1.21.6) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true + '@typescript-eslint/scope-manager@8.13.0': + dependencies: + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/visitor-keys': 8.13.0 - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + '@typescript-eslint/type-utils@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + debug: 4.3.7 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - eslint + - supports-color - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + '@typescript-eslint/types@8.13.0': {} - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + '@typescript-eslint/typescript-estree@8.13.0(typescript@5.6.3)': dependencies: - call-bind: 1.0.2 - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/visitor-keys': 8.13.0 + debug: 4.3.7 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + '@typescript-eslint/utils@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) + transitivePeerDependencies: + - supports-color + - typescript - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + '@typescript-eslint/visitor-keys@8.13.0': dependencies: - has-tostringtag: 1.0.0 + '@typescript-eslint/types': 8.13.0 + eslint-visitor-keys: 3.4.3 - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-vue@5.1.5(vite@5.4.10(@types/node@22.9.0))(vue@3.5.12(typescript@5.6.3))': dependencies: - has-symbols: 1.0.3 + vite: 5.4.10(@types/node@22.9.0) + vue: 3.5.12(typescript@5.6.3) - /is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} + '@vitest/coverage-v8@2.1.4(vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1))': dependencies: - text-extensions: 1.9.0 - dev: true + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.12 + magicast: 0.3.5 + std-env: 3.8.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) + transitivePeerDependencies: + - supports-color - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} + '@vitest/expect@2.1.4': dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 + '@vitest/spy': 2.1.4 + '@vitest/utils': 2.1.4 + chai: 5.1.2 + tinyrainbow: 1.2.0 - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: false + '@vitest/mocker@2.1.4(vite@5.4.10(@types/node@22.9.0))': + dependencies: + '@vitest/spy': 2.1.4 + estree-walker: 3.0.3 + magic-string: 0.30.12 + optionalDependencies: + vite: 5.4.10(@types/node@22.9.0) - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + '@vitest/pretty-format@2.1.4': + dependencies: + tinyrainbow: 1.2.0 - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + '@vitest/runner@2.1.4': dependencies: - call-bind: 1.0.2 - dev: false + '@vitest/utils': 2.1.4 + pathe: 1.1.2 - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + '@vitest/snapshot@2.1.4': dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + '@vitest/pretty-format': 2.1.4 + magic-string: 0.30.12 + pathe: 1.1.2 - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + '@vitest/spy@2.1.4': dependencies: - is-docker: 2.2.1 - dev: false + tinyspy: 3.0.2 - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + '@vitest/utils@2.1.4': + dependencies: + '@vitest/pretty-format': 2.1.4 + loupe: 3.1.2 + tinyrainbow: 1.2.0 - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + '@volar/language-core@2.4.10': + dependencies: + '@volar/source-map': 2.4.10 - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true + '@volar/source-map@2.4.10': {} - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} + '@volar/typescript@2.4.10': dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true + '@volar/language-core': 2.4.10 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} + '@vue/compiler-core@3.5.12': dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true + '@babel/parser': 7.26.2 + '@vue/shared': 3.5.12 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true + '@vue/compiler-dom@3.5.12': + dependencies: + '@vue/compiler-core': 3.5.12 + '@vue/shared': 3.5.12 - /js-sdsl@4.3.0: - resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} + '@vue/compiler-sfc@3.5.12': + dependencies: + '@babel/parser': 7.26.2 + '@vue/compiler-core': 3.5.12 + '@vue/compiler-dom': 3.5.12 + '@vue/compiler-ssr': 3.5.12 + '@vue/shared': 3.5.12 + estree-walker: 2.0.2 + magic-string: 0.30.12 + postcss: 8.4.48 + source-map-js: 1.2.1 - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + '@vue/compiler-ssr@3.5.12': + dependencies: + '@vue/compiler-dom': 3.5.12 + '@vue/shared': 3.5.12 - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + '@vue/compiler-vue2@2.7.16': dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: false + de-indent: 1.0.2 + he: 1.2.0 - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + '@vue/devtools-api@7.6.4': dependencies: - argparse: 2.0.1 + '@vue/devtools-kit': 7.6.4 - /jsdom@21.1.0: - resolution: {integrity: sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg==} - engines: {node: '>=14'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true + '@vue/devtools-kit@7.6.4': dependencies: - abab: 2.0.6 - acorn: 8.8.2 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.4.3 - domexception: 4.0.0 - escodegen: 2.0.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.2 - parse5: 7.1.2 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.2 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.12.0 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true + '@vue/devtools-shared': 7.6.4 + birpc: 0.2.19 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.1 - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: false + '@vue/devtools-shared@7.6.4': + dependencies: + rfdc: 1.4.1 - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + '@vue/language-core@2.1.6(typescript@5.6.3)': + dependencies: + '@volar/language-core': 2.4.10 + '@vue/compiler-dom': 3.5.12 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.12 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.6.3 - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + '@vue/reactivity@3.5.12': + dependencies: + '@vue/shared': 3.5.12 - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + '@vue/runtime-core@3.5.12': + dependencies: + '@vue/reactivity': 3.5.12 + '@vue/shared': 3.5.12 - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + '@vue/runtime-dom@3.5.12': + dependencies: + '@vue/reactivity': 3.5.12 + '@vue/runtime-core': 3.5.12 + '@vue/shared': 3.5.12 + csstype: 3.1.3 - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: false + '@vue/server-renderer@3.5.12(vue@3.5.12(typescript@5.6.3))': + dependencies: + '@vue/compiler-ssr': 3.5.12 + '@vue/shared': 3.5.12 + vue: 3.5.12(typescript@5.6.3) - /jsonc-parser@2.3.1: - resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} - dev: false + '@vue/shared@3.5.12': {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + '@vueuse/core@11.2.0(vue@3.5.12(typescript@5.6.3))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 11.2.0 + '@vueuse/shared': 11.2.0(vue@3.5.12(typescript@5.6.3)) + vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + '@vueuse/integrations@11.2.0(focus-trap@7.6.1)(vue@3.5.12(typescript@5.6.3))': + dependencies: + '@vueuse/core': 11.2.0(vue@3.5.12(typescript@5.6.3)) + '@vueuse/shared': 11.2.0(vue@3.5.12(typescript@5.6.3)) + vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) optionalDependencies: - graceful-fs: 4.2.10 - dev: true + focus-trap: 7.6.1 + transitivePeerDependencies: + - '@vue/composition-api' + - vue - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + '@vueuse/metadata@11.2.0': {} + + '@vueuse/shared@11.2.0(vue@3.5.12(typescript@5.6.3))': dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.10 - dev: true + vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 - /jsx-ast-utils@3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} - engines: {node: '>=4.0'} + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - array-includes: 3.1.6 - object.assign: 4.1.4 - dev: false + acorn: 8.14.0 - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + acorn@8.14.0: {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: false + agent-base@7.1.1: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: false + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 - /kolorist@1.7.0: - resolution: {integrity: sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==} - dev: true + ajv-formats@3.0.1(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 - /language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: false + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 - /language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + ajv@8.12.0: dependencies: - language-subtag-registry: 0.3.22 - dev: false + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 - /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + ajv@8.13.0: dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: true + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + algoliasearch@5.13.0: dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 + '@algolia/client-abtesting': 5.13.0 + '@algolia/client-analytics': 5.13.0 + '@algolia/client-common': 5.13.0 + '@algolia/client-insights': 5.13.0 + '@algolia/client-personalization': 5.13.0 + '@algolia/client-query-suggestions': 5.13.0 + '@algolia/client-search': 5.13.0 + '@algolia/ingestion': 1.13.0 + '@algolia/monitoring': 1.13.0 + '@algolia/recommend': 5.13.0 + '@algolia/requester-browser-xhr': 5.13.0 + '@algolia/requester-fetch': 5.13.0 + '@algolia/requester-node-http': 5.13.0 - /lilconfig@2.0.6: - resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} - engines: {node: '>=10'} + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + ansi-regex@5.0.1: {} - /lint-staged@13.1.0: - resolution: {integrity: sha512-pn/sR8IrcF/T0vpWLilih8jmVouMlxqXxKuAojmbiGX5n/gDnz+abdPptlj0vYnbfE0SQNl3CY/HwtM0+yfOVQ==} - engines: {node: ^14.13.1 || >=16.0.0} - hasBin: true - dependencies: - cli-truncate: 3.1.0 - colorette: 2.0.19 - commander: 9.5.0 - debug: 4.3.4 - execa: 6.1.0 - lilconfig: 2.0.6 - listr2: 5.0.7 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-inspect: 1.12.3 - pidtree: 0.6.0 - string-argv: 0.3.1 - yaml: 2.2.1 - transitivePeerDependencies: - - enquirer - - supports-color - dev: true + ansi-regex@6.1.0: {} - /listr2@5.0.7: - resolution: {integrity: sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==} - engines: {node: ^14.13.1 || >=16.0.0} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true + ansi-styles@4.3.0: dependencies: - cli-truncate: 2.1.0 - colorette: 2.0.19 - log-update: 4.0.0 - p-map: 4.0.0 - rfdc: 1.3.0 - rxjs: 7.8.0 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true + color-convert: 2.0.1 - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - dependencies: - graceful-fs: 4.2.10 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: false + ansi-styles@5.2.0: {} - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true + ansi-styles@6.2.1: {} - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + argparse@1.0.10: dependencies: - p-locate: 4.1.0 + sprintf-js: 1.0.3 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + argparse@2.0.1: {} + + aria-query@5.3.0: dependencies: - p-locate: 5.0.0 + dequal: 2.0.3 - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true + array-ify@1.0.0: {} - /lodash.castarray@4.4.0: - resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} - dev: false + assertion-error@2.0.1: {} - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true + asynckit@0.4.0: {} - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: true + balanced-match@1.0.2: {} - /lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} - dev: true + birpc@0.2.19: {} - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + braces@3.0.3: + dependencies: + fill-range: 7.1.1 - /lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - dev: true + cac@6.7.14: {} - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: true + callsites@3.1.0: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true + ccount@2.0.1: {} - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: true + chai@5.1.2: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 - /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - dev: true + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + chalk@5.3.0: {} - /log-symbols@5.1.0: - resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} - engines: {node: '>=12'} - dependencies: - chalk: 5.2.0 - is-unicode-supported: 1.3.0 - dev: false + character-entities-html4@2.1.0: {} - /log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} - dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 - dev: true + character-entities-legacy@3.0.0: {} - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: false + check-error@2.1.1: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + cli-cursor@5.0.0: dependencies: - js-tokens: 4.0.0 - dev: true + restore-cursor: 5.1.0 - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + cli-truncate@4.0.0: dependencies: - get-func-name: 2.0.0 - dev: true + slice-ansi: 5.0.0 + string-width: 7.2.0 - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + cliui@8.0.1: dependencies: - yallist: 3.1.1 - dev: false + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + color-convert@2.0.1: dependencies: - yallist: 4.0.0 + color-name: 1.1.4 - /lz-string@1.4.4: - resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} - hasBin: true - dev: true + color-name@1.1.4: {} - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 - dev: false + colorette@2.0.20: {} - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + combined-stream@1.0.8: dependencies: - semver: 6.3.0 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + delayed-stream: 1.0.0 - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + comma-separated-tokens@2.0.3: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true - - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: false - - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - dependencies: - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 - unist-util-visit: 4.1.2 - dev: false - - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - dependencies: - '@types/mdast': 3.0.10 - escape-string-regexp: 5.0.0 - unist-util-is: 5.2.0 - unist-util-visit-parents: 5.1.3 - dev: false - - /mdast-util-from-markdown@1.3.0: - resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==} - dependencies: - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.1.1 - micromark: 3.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-decode-string: 1.0.2 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: false + commander@12.1.0: {} - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + compare-func@2.0.0: dependencies: - '@types/mdast': 3.0.10 - ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.1.0 - dev: false + array-ify: 1.0.0 + dot-prop: 5.3.0 - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.0.0 - dev: false + compare-versions@6.1.1: {} + + computeds@0.0.1: {} + + concat-map@0.0.1: {} - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + confbox@0.1.8: {} + + conventional-changelog-angular@7.0.0: dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-markdown: 1.5.0 - dev: false + compare-func: 2.0.0 - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + conventional-changelog-conventionalcommits@7.0.2: dependencies: - '@types/mdast': 3.0.10 - markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.0 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: false + compare-func: 2.0.0 - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + conventional-commits-parser@5.0.0: dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-markdown: 1.5.0 - dev: false + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + copy-anything@3.0.5: dependencies: - mdast-util-from-markdown: 1.3.0 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: false + is-what: 4.1.16 - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + cosmiconfig-typescript-loader@5.1.0(@types/node@22.9.0)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3): dependencies: - '@types/mdast': 3.0.10 - unist-util-is: 5.2.0 - dev: false + '@types/node': 22.9.0 + cosmiconfig: 9.0.0(typescript@5.6.3) + jiti: 1.21.6 + typescript: 5.6.3 - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + cosmiconfig@9.0.0(typescript@5.6.3): dependencies: - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.1.0 - trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - dev: false - - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - dependencies: - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 - longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.1.1 - micromark-util-decode-string: 1.0.2 - unist-util-visit: 4.1.2 - zwitch: 2.0.4 - dev: false + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.6.3 - /mdast-util-to-string@3.1.1: - resolution: {integrity: sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==} + cross-spawn@7.0.5: dependencies: - '@types/mdast': 3.0.10 - dev: false + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + cssstyle@4.1.0: dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + rrweb-cssom: 0.7.1 - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + csstype@3.1.3: {} - /micromark-core-commonmark@1.0.6: - resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.0.0 - micromark-factory-label: 1.0.2 - micromark-factory-space: 1.0.0 - micromark-factory-title: 1.0.2 - micromark-factory-whitespace: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-html-tag-name: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-footnote@1.0.4: - resolution: {integrity: sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==} - dependencies: - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-strikethrough@1.0.4: - resolution: {integrity: sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-table@1.0.5: - resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-tagfilter@1.0.1: - resolution: {integrity: sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==} - dependencies: - micromark-util-types: 1.0.2 - dev: false - - /micromark-extension-gfm-task-list-item@1.0.3: - resolution: {integrity: sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm@2.0.1: - resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} - dependencies: - micromark-extension-gfm-autolink-literal: 1.0.3 - micromark-extension-gfm-footnote: 1.0.4 - micromark-extension-gfm-strikethrough: 1.0.4 - micromark-extension-gfm-table: 1.0.5 - micromark-extension-gfm-tagfilter: 1.0.1 - micromark-extension-gfm-task-list-item: 1.0.3 - micromark-util-combine-extensions: 1.0.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-factory-destination@1.0.0: - resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-factory-label@1.0.2: - resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-factory-space@1.0.0: - resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-factory-title@1.0.2: - resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-factory-whitespace@1.0.0: - resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-character@1.1.0: - resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} - dependencies: - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-chunked@1.0.0: - resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-classify-character@1.0.0: - resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-combine-extensions@1.0.0: - resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-decode-numeric-character-reference@1.0.0: - resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-decode-string@1.0.2: - resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-encode@1.0.1: - resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} - dev: false - - /micromark-util-html-tag-name@1.1.0: - resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} - dev: false - - /micromark-util-normalize-identifier@1.0.0: - resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-resolve-all@1.0.0: - resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} - dependencies: - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-sanitize-uri@1.1.0: - resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-encode: 1.0.1 - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-subtokenize@1.0.2: - resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-util-symbol@1.0.1: - resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} - dev: false - - /micromark-util-types@1.0.2: - resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} - dev: false - - /micromark@3.1.0: - resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} - dependencies: - '@types/debug': 4.1.7 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-combine-extensions: 1.0.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-encode: 1.0.1 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: false + dargs@8.1.0: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + data-urls@5.0.0: dependencies: - braces: 3.0.2 - picomatch: 2.3.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true + de-indent@1.0.2: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + debug@4.3.7: dependencies: - mime-db: 1.52.0 - dev: true - - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: false + ms: 2.1.3 - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + decimal.js@10.4.3: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + deep-eql@5.0.2: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + deep-is@0.1.4: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 + delayed-stream@1.0.0: {} - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true + dequal@2.0.3: {} - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + devlop@1.1.0: dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true - - /minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + dequal: 2.0.3 - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true + dom-accessibility-api@0.5.16: {} - /mlly@1.1.0: - resolution: {integrity: sha512-cwzBrBfwGC1gYJyfcy8TcZU1f+dbH/T+TuOhtYP2wLv/Fb51/uV7HJQfBPtEupZ2ORLRU1EKFS/QfS3eo9+kBQ==} + dot-prop@5.3.0: dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.1 - ufo: 1.0.1 - dev: true + is-obj: 2.0.0 - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false + eastasianwidth@0.2.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + emoji-regex@10.4.0: {} - /nanoid@3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + emoji-regex@8.0.0: {} - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: false + emoji-regex@9.2.2: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + entities@4.5.0: {} - /nlcst-to-string@3.1.1: - resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} - dependencies: - '@types/nlcst': 1.0.0 - dev: false + env-paths@2.2.1: {} - /node-releases@2.0.9: - resolution: {integrity: sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==} - dev: false + environment@1.1.0: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + error-ex@1.3.2: dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.1 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true + is-arrayish: 0.2.1 - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@1.21.6)): + dependencies: + eslint: 9.14.0(jiti@1.21.6) + + eslint-scope@8.2.0: dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.11.0 - semver: 7.3.8 - validate-npm-package-license: 3.0.4 - dev: true + esrecurse: 4.3.0 + estraverse: 5.3.0 - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + eslint-visitor-keys@3.4.3: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: false + eslint-visitor-keys@4.2.0: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + eslint@9.14.0(jiti@1.21.6): dependencies: - path-key: 3.1.1 - dev: true + '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0(jiti@1.21.6)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.7.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.14.0 + '@eslint/plugin-kit': 0.2.2 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.5 + debug: 4.3.7 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 + transitivePeerDependencies: + - supports-color - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + espree@10.3.0: dependencies: - path-key: 4.0.0 - - /nwsapi@2.2.2: - resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} - dev: true + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: false - - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} + esrecurse@4.3.0: dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 + estraverse: 5.3.0 - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + estraverse@5.3.0: {} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - has-symbols: 1.0.3 - object-keys: 1.1.1 + estree-walker@2.0.2: {} - /object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} - engines: {node: '>= 0.4'} + estree-walker@3.0.3: dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: false + '@types/estree': 1.0.6 - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: false + esutils@2.0.3: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 + eventemitter3@5.0.1: {} - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + execa@8.0.1: dependencies: - mimic-fn: 2.1.0 + cross-spawn: 7.0.5 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 + expect-type@1.1.0: {} - /open@8.4.0: - resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} - engines: {node: '>=12'} - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: false + fast-deep-equal@3.1.3: {} - /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - dev: true - - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} + fast-glob@3.3.2: dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.3 + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 - /ora@6.1.2: - resolution: {integrity: sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - bl: 5.1.0 - chalk: 5.2.0 - cli-cursor: 4.0.0 - cli-spinners: 2.7.0 - is-interactive: 2.0.0 - is-unicode-supported: 1.3.0 - log-symbols: 5.1.0 - strip-ansi: 7.0.1 - wcwidth: 1.0.1 - dev: false - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: dependencies: - p-try: 2.2.0 + reusify: 1.0.4 - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + file-entry-cache@8.0.0: dependencies: - yocto-queue: 0.1.0 + flat-cache: 4.0.1 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + fill-range@7.1.1: dependencies: - yocto-queue: 1.0.0 - dev: true + to-regex-range: 5.0.1 - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + find-up@5.0.0: dependencies: - p-limit: 2.3.0 + locate-path: 6.0.0 + path-exists: 4.0.0 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + find-up@7.0.0: dependencies: - p-limit: 3.1.0 + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + flat-cache@4.0.1: dependencies: - aggregate-error: 3.1.0 - dev: true + flatted: 3.3.1 + keyv: 4.5.4 - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + flatted@3.3.1: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + focus-trap@7.6.1: dependencies: - callsites: 3.1.0 + tabbable: 6.2.0 - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + foreground-child@3.3.0: dependencies: - '@babel/code-frame': 7.18.6 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true + cross-spawn: 7.0.5 + signal-exit: 4.1.0 - /parse-latin@5.0.1: - resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + form-data@4.0.1: dependencies: - nlcst-to-string: 3.1.1 - unist-util-modify-children: 3.1.1 - unist-util-visit-children: 2.0.2 - dev: false - - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + fs-extra@7.0.1: dependencies: - entities: 4.4.0 - dev: true + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true + fsevents@2.3.3: + optional: true - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + function-bind@1.1.2: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + get-caller-file@2.0.5: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + get-east-asian-width@1.3.0: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + get-stream@8.0.1: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + git-raw-commits@4.0.0: + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: false + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + global-directory@4.0.1: + dependencies: + ini: 4.1.1 - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + globals@14.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + globrex@0.1.2: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + graceful-fs@4.2.11: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: false + graphemer@1.4.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: false + has-flag@4.0.0: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + hasown@2.0.2: dependencies: - find-up: 4.1.0 - dev: false + function-bind: 1.1.2 - /pkg-types@1.0.1: - resolution: {integrity: sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==} + hast-util-to-html@9.0.3: dependencies: - jsonc-parser: 3.2.0 - mlly: 1.1.0 - pathe: 1.1.0 - dev: true + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 - /postcss-import@14.1.0(postcss@8.4.21): - resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.0.0 + hast-util-whitespace@3.0.0: dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.1 - dev: false + '@types/hast': 3.0.4 - /postcss-js@4.0.0(postcss@8.4.21): - resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.3.3 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.21 - dev: false + he@1.2.0: {} - /postcss-load-config@3.1.4(postcss@8.4.21)(ts-node@10.9.1): - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.0.6 - postcss: 8.4.21 - ts-node: 10.9.1(@types/node@18.11.18)(typescript@4.9.5) - yaml: 1.10.2 - dev: false + hookable@5.5.3: {} - /postcss-load-config@4.0.1(postcss@8.4.21)(ts-node@10.9.1): - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + html-encoding-sniffer@4.0.0: dependencies: - lilconfig: 2.0.6 - postcss: 8.4.21 - ts-node: 10.9.1(@types/node@18.11.18)(typescript@4.9.5) - yaml: 2.2.1 - dev: false + whatwg-encoding: 3.1.1 - /postcss-nested@6.0.0(postcss@8.4.21): - resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.21 - postcss-selector-parser: 6.0.11 - dev: false + html-escaper@2.0.2: {} - /postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} + html-void-elements@3.0.0: {} + + http-proxy-agent@7.0.2: dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: false + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color - /postcss-selector-parser@6.0.11: - resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} - engines: {node: '>=4'} + https-proxy-agent@7.0.5: dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: false + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false + human-signals@5.0.0: {} - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.4 - picocolors: 1.0.0 - source-map-js: 1.0.2 + husky@9.1.6: {} - /preferred-pm@3.0.3: - resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} - engines: {node: '>=10'} + iconv-lite@0.6.3: dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - dev: false - - /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: true + safer-buffer: 2.1.2 - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + ignore@5.3.2: {} - /prettier-plugin-astro@0.7.2: - resolution: {integrity: sha512-mmifnkG160BtC727gqoimoxnZT/dwr8ASxpoGGl6EHevhfblSOeu+pwH1LAm5Qu1MynizktztFujHHaijLCkww==} - engines: {node: ^14.15.0 || >=16.0.0, pnpm: '>=7.14.0'} + import-fresh@3.3.0: dependencies: - '@astrojs/compiler': 0.31.4 - prettier: 2.8.3 - sass-formatter: 0.7.5 - synckit: 0.8.5 - dev: false + parent-module: 1.0.1 + resolve-from: 4.0.0 - /prettier-plugin-astro@0.8.0: - resolution: {integrity: sha512-kt9wk33J7HvFGwFaHb8piwy4zbUmabC8Nu+qCw493jhe96YkpjscqGBPy4nJ9TPy9pd7+kEx1zM81rp+MIdrXg==} - engines: {node: ^14.15.0 || >=16.0.0, pnpm: '>=7.14.0'} - dependencies: - '@astrojs/compiler': 1.0.1 - prettier: 2.8.3 - sass-formatter: 0.7.5 - synckit: 0.8.5 - dev: false + import-lazy@4.0.0: {} - /prettier@2.8.3: - resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==} - engines: {node: '>=10.13.0'} - hasBin: true + import-meta-resolve@4.1.0: {} - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true + imurmurhash@0.1.4: {} - /prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - dev: false + ini@4.1.1: {} - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + is-arrayish@0.2.1: {} + + is-core-module@2.15.1: dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: false + hasown: 2.0.2 - /property-information@6.2.0: - resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} - dev: false + is-extglob@2.1.1: {} - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true + is-fullwidth-code-point@3.0.0: {} - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} + is-fullwidth-code-point@4.0.0: {} - /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.3.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true + is-number@7.0.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + is-obj@2.0.0: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + is-potential-custom-element-name@1.0.1: {} - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: false + is-stream@3.0.0: {} - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + is-text-path@2.0.0: dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: true - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true + text-extensions: 2.4.0 - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: true + is-what@4.1.16: {} - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - dependencies: - pify: 2.3.0 - dev: false + isexe@2.0.0: {} - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true + istanbul-lib-coverage@3.2.2: {} - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + istanbul-lib-report@3.0.1: dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 - /readable-stream@3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} - engines: {node: '>= 6'} + istanbul-lib-source-maps@5.0.6: dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + istanbul-reports@3.1.7: dependencies: - picomatch: 2.3.1 - dev: false + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + jackspeak@3.4.3: dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + jiti@1.21.6: {} - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - functions-have-names: 1.2.3 + jju@1.4.0: {} - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} + js-tokens@4.0.0: {} - /rehype-autolink-headings@6.1.1: - resolution: {integrity: sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA==} - dependencies: - '@types/hast': 2.3.4 - extend: 3.0.2 - hast-util-has-property: 2.0.1 - hast-util-heading-rank: 2.1.1 - hast-util-is-element: 2.1.3 - unified: 10.1.2 - unist-util-visit: 4.1.2 - dev: false - - /rehype-parse@8.0.4: - resolution: {integrity: sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==} - dependencies: - '@types/hast': 2.3.4 - hast-util-from-parse5: 7.1.1 - parse5: 6.0.1 - unified: 10.1.2 - dev: false - - /rehype-raw@6.1.1: - resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} - dependencies: - '@types/hast': 2.3.4 - hast-util-raw: 7.2.3 - unified: 10.1.2 - dev: false - - /rehype-stringify@9.0.3: - resolution: {integrity: sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==} - dependencies: - '@types/hast': 2.3.4 - hast-util-to-html: 8.0.4 - unified: 10.1.2 - dev: false - - /rehype@12.0.1: - resolution: {integrity: sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==} - dependencies: - '@types/hast': 2.3.4 - rehype-parse: 8.0.4 - rehype-stringify: 9.0.3 - unified: 10.1.2 - dev: false - - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: false + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 - /remark-parse@10.0.1: - resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} + jsdom@25.0.1: dependencies: - '@types/mdast': 3.0.10 - mdast-util-from-markdown: 1.3.0 - unified: 10.1.2 + cssstyle: 4.1.0 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.1 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.13 + parse5: 7.2.1 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 transitivePeerDependencies: + - bufferutil - supports-color - dev: false + - utf-8-validate - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - dependencies: - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 - dev: false + json-buffer@3.0.1: {} - /remark-smartypants@2.0.0: - resolution: {integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - retext: 8.1.0 - retext-smartypants: 5.2.0 - unist-util-visit: 4.1.2 - dev: false + json-parse-even-better-errors@2.3.1: {} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true + json-schema-traverse@0.4.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + json-schema-traverse@1.0.0: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + jsonparse@1.3.1: {} - /resolve-global@1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} + keyv@4.5.4: dependencies: - global-dirs: 0.1.1 - dev: true + json-buffer: 3.0.1 - /resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - dependencies: - path-parse: 1.0.7 - dev: true + kolorist@1.8.0: {} - /resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + levn@0.4.1: dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - dev: true + prelude-ls: 1.2.1 + type-check: 0.4.0 - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + lilconfig@3.1.2: {} - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true + lines-and-columns@1.2.4: {} - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lint-staged@15.2.10: dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: false + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.7 + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.5 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.5.1 + transitivePeerDependencies: + - supports-color - /retext-latin@3.1.0: - resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + listr2@8.2.5: dependencies: - '@types/nlcst': 1.0.0 - parse-latin: 5.0.1 - unherit: 3.0.1 - unified: 10.1.2 - dev: false + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 - /retext-smartypants@5.2.0: - resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + local-pkg@0.5.0: dependencies: - '@types/nlcst': 1.0.0 - nlcst-to-string: 3.1.1 - unified: 10.1.2 - unist-util-visit: 4.1.2 - dev: false + mlly: 1.7.2 + pkg-types: 1.2.1 - /retext-stringify@3.1.0: - resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + locate-path@6.0.0: dependencies: - '@types/nlcst': 1.0.0 - nlcst-to-string: 3.1.1 - unified: 10.1.2 - dev: false + p-locate: 5.0.0 - /retext@8.1.0: - resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + locate-path@7.2.0: dependencies: - '@types/nlcst': 1.0.0 - retext-latin: 3.1.0 - retext-stringify: 3.1.0 - unified: 10.1.2 - dev: false + p-locate: 6.0.0 - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + lodash.camelcase@4.3.0: {} - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true + lodash.isplainobject@4.0.6: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 + lodash.kebabcase@4.1.1: {} - /rollup@3.13.0: - resolution: {integrity: sha512-HJwQtrXAc0AmyDohTJ/2c+Bx/sWPScJLlAUJ1kuD7rAkCro8Cr2SnVB2gVYBiSLxpgD2kZ24jbyXtG++GumrYQ==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 + lodash.merge@4.6.2: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 + lodash.mergewith@4.6.2: {} - /rxjs@7.8.0: - resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} - dependencies: - tslib: 2.5.0 - dev: true + lodash.snakecase@4.1.1: {} - /s.color@0.0.15: - resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} - dev: false + lodash.startcase@4.4.0: {} - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - dependencies: - mri: 1.2.0 - dev: false + lodash.uniq@4.5.0: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + lodash.upperfirst@4.3.1: {} - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-regex: 1.1.4 - dev: false + lodash@4.17.21: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 - /sass-formatter@0.7.5: - resolution: {integrity: sha512-NKFP8ddjhUYi6A/iD1cEtzkEs91U61kzqe3lY9SVNuvX7LGc88xnEN0mmsWL7Ol//YTi2GL/ol7b9XZ2+hgXuA==} + loose-envify@1.4.0: dependencies: - suf-log: 2.5.3 - dev: false + js-tokens: 4.0.0 - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: false + loupe@3.1.2: {} - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + lru-cache@10.4.3: {} + + lru-cache@6.0.0: dependencies: - xmlchars: 2.2.0 - dev: true + yallist: 4.0.0 + + lz-string@1.5.0: {} - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + magic-string@0.30.12: dependencies: - loose-envify: 1.4.0 - dev: true + '@jridgewell/sourcemap-codec': 1.5.0 - /section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} + magicast@0.3.5: dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 - dev: false + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + source-map-js: 1.2.1 - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + make-dir@4.0.0: + dependencies: + semver: 7.6.3 - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true + mark.js@8.11.1: {} - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true + mdast-util-to-hast@13.2.0: dependencies: - lru-cache: 6.0.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 - /server-destroy@1.0.1: - resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} - dev: false + meow@12.1.1: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 + merge-stream@2.0.0: {} - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + merge2@1.4.1: {} - /shiki@0.11.1: - resolution: {integrity: sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==} + micromark-util-character@2.1.0: dependencies: - jsonc-parser: 3.2.0 - vscode-oniguruma: 1.7.0 - vscode-textmate: 6.0.0 - dev: false + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-encode@2.0.0: {} - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + micromark-util-sanitize-uri@2.0.0: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true + micromark-util-symbol@2.0.0: {} - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + micromark-util-types@2.0.0: {} - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: false + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 - /sitemap@7.1.1: - resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} - hasBin: true + mime-db@1.52.0: {} + + mime-types@2.1.35: dependencies: - '@types/node': 17.0.45 - '@types/sax': 1.2.4 - arg: 5.0.2 - sax: 1.2.4 - dev: false + mime-db: 1.52.0 - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: false + mimic-fn@4.0.0: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: false + mimic-function@5.0.1: {} - /slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} + minimatch@3.0.8: dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true + brace-expansion: 1.1.11 - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + minimatch@3.1.2: dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true + brace-expansion: 1.1.11 - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + minimatch@9.0.5: dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} + brace-expansion: 2.0.1 - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true + minimist@1.2.8: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true + minipass@7.1.2: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: false + minisearch@7.1.0: {} - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false + mitt@3.0.1: {} - /spdx-correct@3.1.1: - resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + mlly@1.7.2: dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.12 - dev: true - - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.12 - dev: true + ms@2.1.3: {} - /spdx-license-ids@3.0.12: - resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} - dev: true + muggle-string@0.4.1: {} - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - dependencies: - readable-stream: 3.6.0 - dev: true + nanoid@3.3.7: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + natural-compare@1.4.0: {} - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 - /std-env@3.3.2: - resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} - dev: true + nwsapi@2.2.13: {} - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + onetime@6.0.0: dependencies: - internal-slot: 1.0.4 - - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false + mimic-fn: 4.0.0 - /string-argv@0.3.1: - resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} - engines: {node: '>=0.6.19'} - dev: true + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + oniguruma-to-js@0.4.3: dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 + regex: 4.4.0 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + optionator@0.9.4: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.0.1 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + p-limit@3.1.0: dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: false + yocto-queue: 0.1.0 - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + p-limit@4.0.0: dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: false + yocto-queue: 1.1.1 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + p-locate@5.0.0: dependencies: - safe-buffer: 5.2.1 + p-limit: 3.1.0 - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + p-locate@6.0.0: dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: false + p-limit: 4.0.0 - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: dependencies: - ansi-regex: 5.0.1 + callsites: 3.1.0 - /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} - engines: {node: '>=12'} + parse-json@5.2.0: dependencies: - ansi-regex: 6.0.1 + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 - /strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - dev: false + parse5@7.2.1: + dependencies: + entities: 4.5.0 - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: false + path-browserify@1.0.1: {} - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: false + path-exists@4.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + path-exists@5.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + path-key@3.1.1: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true + path-key@4.0.0: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + path-parse@1.0.7: {} - /strip-literal@1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + path-scurry@1.11.1: dependencies: - acorn: 8.8.2 - dev: true + lru-cache: 10.4.3 + minipass: 7.1.2 - /suf-log@2.5.3: - resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} - dependencies: - s.color: 0.0.15 - dev: false + pathe@1.1.2: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 + pathval@2.0.0: {} - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 + perfect-debounce@1.0.0: {} - /supports-esm@1.0.0: - resolution: {integrity: sha512-96Am8CDqUaC0I2+C/swJ0yEvM8ZnGn4unoers/LSdE4umhX7mELzqyLzx3HnZAluq5PXIsGMKqa7NkqaeHMPcg==} - dependencies: - has-package-exports: 1.3.0 - dev: false + picocolors@1.1.1: {} - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + picomatch@2.3.1: {} - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true + picomatch@4.0.2: {} - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/utils': 2.3.1 - tslib: 2.5.0 - dev: false + pidtree@0.6.0: {} - /tailwindcss-radix-colors@0.3.0(tailwindcss@3.2.4): - resolution: {integrity: sha512-OTnb4PXfLYDd2Lb3JL75qPjRLktag8V9WN59stZ/6wwGbwXCifY3HTZigC+EjHOzt/xuOoom4Z3CqLMLRqVieA==} - peerDependencies: - tailwindcss: '>=3.0.0' + pkg-types@1.2.1: dependencies: - '@radix-ui/colors': 0.1.8 - tailwindcss: 3.2.4(postcss@8.4.21)(ts-node@10.9.1) - dev: false + confbox: 0.1.8 + mlly: 1.7.2 + pathe: 1.1.2 - /tailwindcss@3.2.4(postcss@8.4.21)(ts-node@10.9.1): - resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==} - engines: {node: '>=12.13.0'} - hasBin: true - peerDependencies: - postcss: ^8.0.9 + postcss@8.4.48: dependencies: - arg: 5.0.2 - chokidar: 3.5.3 - color-name: 1.1.4 - detective: 5.2.1 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.2.12 - glob-parent: 6.0.2 - is-glob: 4.0.3 - lilconfig: 2.0.6 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.21 - postcss-import: 14.1.0(postcss@8.4.21) - postcss-js: 4.0.0(postcss@8.4.21) - postcss-load-config: 3.1.4(postcss@8.4.21)(ts-node@10.9.1) - postcss-nested: 6.0.0(postcss@8.4.21) - postcss-selector-parser: 6.0.11 - postcss-value-parser: 4.2.0 - quick-lru: 5.1.1 - resolve: 1.22.1 - transitivePeerDependencies: - - ts-node - dev: false + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + preact@10.24.3: {} + + prelude-ls@1.2.1: {} + + prettier@3.3.3: {} + + pretty-format@27.5.1: dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 - /text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: true + property-information@6.5.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + punycode@2.3.1: {} - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + queue-microtask@1.2.3: {} + + react-dom@18.3.1(react@18.3.1): dependencies: - readable-stream: 3.6.0 - dev: true + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + react-is@17.0.2: {} - /tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + react@18.3.1: dependencies: - globalyzer: 0.1.0 - globrex: 0.1.2 - dev: false + loose-envify: 1.4.0 - /tinybench@2.3.1: - resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==} - dev: true + regenerator-runtime@0.14.1: {} - /tinypool@0.3.1: - resolution: {integrity: sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==} - engines: {node: '>=14.0.0'} - dev: true + regex@4.4.0: {} - /tinyspy@1.0.2: - resolution: {integrity: sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==} - engines: {node: '>=14.0.0'} - dev: true + require-directory@2.1.1: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: false + require-from-string@2.0.2: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 + resolve-from@4.0.0: {} - /tough-cookie@4.1.2: - resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} - engines: {node: '>=6'} + resolve-from@5.0.0: {} + + resolve@1.22.8: dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: true + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 - /tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} + restore-cursor@5.1.0: dependencies: - punycode: 2.3.0 - dev: true + onetime: 7.0.0 + signal-exit: 4.1.0 - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false + reusify@1.0.4: {} - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true + rfdc@1.4.1: {} + + rollup@4.25.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.25.0 + '@rollup/rollup-android-arm64': 4.25.0 + '@rollup/rollup-darwin-arm64': 4.25.0 + '@rollup/rollup-darwin-x64': 4.25.0 + '@rollup/rollup-freebsd-arm64': 4.25.0 + '@rollup/rollup-freebsd-x64': 4.25.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.25.0 + '@rollup/rollup-linux-arm-musleabihf': 4.25.0 + '@rollup/rollup-linux-arm64-gnu': 4.25.0 + '@rollup/rollup-linux-arm64-musl': 4.25.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.25.0 + '@rollup/rollup-linux-riscv64-gnu': 4.25.0 + '@rollup/rollup-linux-s390x-gnu': 4.25.0 + '@rollup/rollup-linux-x64-gnu': 4.25.0 + '@rollup/rollup-linux-x64-musl': 4.25.0 + '@rollup/rollup-win32-arm64-msvc': 4.25.0 + '@rollup/rollup-win32-ia32-msvc': 4.25.0 + '@rollup/rollup-win32-x64-msvc': 4.25.0 + fsevents: 2.3.3 + + rrweb-cssom@0.7.1: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: false + safer-buffer@2.1.2: {} - /ts-morph@17.0.1: - resolution: {integrity: sha512-10PkHyXmrtsTvZSL+cqtJLTgFXkU43Gd0JCc0Rw6GchWbqKe0Rwgt1v3ouobTZwQzF1mGhDeAlWYBMGRV7y+3g==} + saxes@6.0.0: dependencies: - '@ts-morph/common': 0.18.1 - code-block-writer: 11.0.3 - dev: true + xmlchars: 2.2.0 - /ts-node@10.9.1(@types/node@18.11.18)(typescript@4.9.5): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + scheduler@0.23.2: dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 18.11.18 - acorn: 8.8.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.9.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - /tsconfck@2.0.2(typescript@4.9.5): - resolution: {integrity: sha512-H3DWlwKpow+GpVLm/2cpmok72pwRr1YFROV3YzAmvzfGFiC1zEM/mc9b7+1XnrxuXtEbhJ7xUSIqjPFbedp7aQ==} - engines: {node: ^14.13.1 || ^16 || >=18, pnpm: ^7.18.0} - hasBin: true - peerDependencies: - typescript: ^4.3.5 - peerDependenciesMeta: - typescript: - optional: true + loose-envify: 1.4.0 + + search-insights@2.17.2: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.6.3: {} + + shebang-command@2.0.0: dependencies: - typescript: 4.9.5 - dev: true + shebang-regex: 3.0.0 - /tsconfig-resolver@3.0.1: - resolution: {integrity: sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==} + shebang-regex@3.0.0: {} + + shiki@1.22.2: dependencies: - '@types/json5': 0.0.30 - '@types/resolve': 1.20.2 - json5: 2.2.3 - resolve: 1.22.1 - strip-bom: 4.0.0 - type-fest: 0.13.1 - dev: false + '@shikijs/core': 1.22.2 + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false + siginfo@2.0.0: {} - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + signal-exit@4.1.0: {} - /tsutils@3.21.0(typescript@4.9.5): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + slice-ansi@5.0.0: dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - dev: false + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 - /turbo-darwin-64@1.7.3: - resolution: {integrity: sha512-7j9+j1CVztmdevnClT3rG/GRhULf3ukwmv+l48l8uwsXNI53zLso+UYMql6RsjZDbD6sESwh0CHeKNwGmOylFA==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 - /turbo-darwin-arm64@1.7.3: - resolution: {integrity: sha512-puS9+pqpiy4MrIvWRBTg3qfO2+JPXR7reQcXQ7qUreuyAJnSw9H9/TIHjeK6FFxUfQbmruylPtH6dNpfcML9CA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + source-map-js@1.2.1: {} - /turbo-linux-64@1.7.3: - resolution: {integrity: sha512-BnbpgcK8Wag6fhnff7tMaecswmFHN/T56VIDnjcwcJnK9H3jdwpjwZlmcDtkoslzjPj3VuqHyqLDMvSb3ejXSg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + source-map@0.6.1: {} - /turbo-linux-arm64@1.7.3: - resolution: {integrity: sha512-+epY+0dfjmAJNZHfj7rID2hENRaeM3D0Ijqkhh/M53o46fQMwPNqI5ff9erh+f9r8sWuTpVnRlZeu7TE1P/Okw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + space-separated-tokens@2.0.2: {} - /turbo-windows-64@1.7.3: - resolution: {integrity: sha512-/2Z8WB4fASlq/diO6nhmHYuDCRPm3dkdUE6yhwQarXPOm936m4zj3xGQA2eSWMpvfst4xjVxxU7P7HOIOyWChA==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + speakingurl@14.0.1: {} - /turbo-windows-arm64@1.7.3: - resolution: {integrity: sha512-UD9Uhop42xj1l1ba5LRdwqRq1Of+RgqQuv+QMd1xOAZ2FXn/91uhkfLv+H4Pkiw7XdUohOxpj/FcOvjCiiUxGw==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + split2@4.2.0: {} - /turbo@1.7.3: - resolution: {integrity: sha512-mrqo72vPQO6ykmARThaNP/KXPDuBDSqDXfkUxD8hX1ET3YSFbOWJixlHU32tPtiFIhScIKbEGShEVWBrLeM0wg==} - hasBin: true - requiresBuild: true - optionalDependencies: - turbo-darwin-64: 1.7.3 - turbo-darwin-arm64: 1.7.3 - turbo-linux-64: 1.7.3 - turbo-linux-arm64: 1.7.3 - turbo-windows-64: 1.7.3 - turbo-windows-arm64: 1.7.3 - dev: true - - /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + std-env@3.8.0: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: dependencies: - prelude-ls: 1.1.2 - dev: true + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + string-width@5.1.2: dependencies: - prelude-ls: 1.2.1 + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 - /type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: false + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + strip-final-newline@3.0.0: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + superjson@2.2.1: + dependencies: + copy-anything: 3.0.5 - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: false + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + supports-color@8.1.1: dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.10 - dev: false + has-flag: 4.0.0 - /typescript@4.8.4: - resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true + symbol-tree@3.2.4: {} - /ufo@1.0.1: - resolution: {integrity: sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==} - dev: true + tabbable@6.2.0: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + test-exclude@7.0.1: dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: false + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 - /undici@5.16.0: - resolution: {integrity: sha512-KWBOXNv6VX+oJQhchXieUznEmnJMqgXMbs0xxH2t8q/FUAWSJvOSr/rMaZKnX5RIVq7JDn0JbP4BOnKG2SGXLQ==} - engines: {node: '>=12.18'} - dependencies: - busboy: 1.6.0 - dev: false + text-extensions@2.4.0: {} - /unherit@3.0.1: - resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} - dev: false + text-table@0.2.0: {} - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.6 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.6 - dev: false + through@2.3.8: {} - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - dev: false + tinybench@2.9.0: {} - /unist-util-is@5.2.0: - resolution: {integrity: sha512-Glt17jWwZeyqrFqOK0pF1Ded5U3yzJnFr8CG1GMjCWTp9zDo2p+cmD6pWbZU8AgM5WU3IzRv6+rBwhzsGh6hBQ==} - dev: false + tinyexec@0.3.1: {} - /unist-util-modify-children@3.1.1: - resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} - dependencies: - '@types/unist': 2.0.6 - array-iterate: 2.0.1 - dev: false + tinypool@1.0.1: {} - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - dependencies: - '@types/unist': 2.0.6 - dev: false + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + tldts-core@6.1.60: {} - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + tldts@6.1.60: dependencies: - '@types/unist': 2.0.6 - dev: false + tldts-core: 6.1.60 - /unist-util-visit-children@2.0.2: - resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + to-regex-range@5.0.1: dependencies: - '@types/unist': 2.0.6 - dev: false + is-number: 7.0.0 - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + tough-cookie@5.0.0: dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.2.0 - dev: false + tldts: 6.1.60 - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + tr46@5.0.0: dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.2.0 - unist-util-visit-parents: 5.1.3 - dev: false + punycode: 2.3.1 - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true + trim-lines@3.0.1: {} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true + ts-api-utils@1.4.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true + tsconfck@3.1.4(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 - /update-browserslist-db@1.0.10(browserslist@4.21.5): - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + type-check@0.4.0: dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: false + prelude-ls: 1.2.1 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + typescript-eslint@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - punycode: 2.3.0 + '@typescript-eslint/eslint-plugin': 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - eslint + - supports-color - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true + typescript@5.4.2: {} - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + typescript@5.6.3: {} - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true + ufo@1.5.4: {} + + undici-types@6.19.8: {} + + unicorn-magic@0.1.0: {} + + unist-util-is@6.0.0: dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - dev: false + '@types/unist': 3.0.3 - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 - /v8-to-istanbul@9.0.1: - resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} - engines: {node: '>=10.12.0'} + unist-util-visit-parents@6.0.1: dependencies: - '@jridgewell/trace-mapping': 0.3.17 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + unist-util-visit@5.0.0: dependencies: - spdx-correct: 3.1.1 - spdx-expression-parse: 3.0.1 - dev: true + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 - /validator@13.9.0: - resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} - engines: {node: '>= 0.10'} - dev: true + universalify@0.1.2: {} - /vfile-location@4.0.1: - resolution: {integrity: sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==} + uri-js@4.4.1: dependencies: - '@types/unist': 2.0.6 - vfile: 5.3.6 - dev: false + punycode: 2.3.1 - /vfile-message@3.1.3: - resolution: {integrity: sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==} + vfile-message@4.0.2: dependencies: - '@types/unist': 2.0.6 - unist-util-stringify-position: 3.0.3 - dev: false + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 - /vfile@5.3.6: - resolution: {integrity: sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==} + vfile@6.0.3: dependencies: - '@types/unist': 2.0.6 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.3 - dev: false + '@types/unist': 3.0.3 + vfile-message: 4.0.2 - /vite-node@0.28.4(@types/node@18.11.18): - resolution: {integrity: sha512-KM0Q0uSG/xHHKOJvVHc5xDBabgt0l70y7/lWTR7Q0pR5/MrYxadT+y32cJOE65FfjGmJgxpVEEY+69btJgcXOQ==} - engines: {node: '>=v14.16.0'} - hasBin: true + vite-node@2.1.4(@types/node@22.9.0): dependencies: cac: 6.7.14 - debug: 4.3.4 - mlly: 1.1.0 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - source-map-support: 0.5.21 - vite: 4.1.1(@types/node@18.11.18) + debug: 4.3.7 + pathe: 1.1.2 + vite: 5.4.10(@types/node@22.9.0) transitivePeerDependencies: - '@types/node' - less + - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - dev: true - /vite-plugin-dts@1.7.2(@types/node@18.11.18)(vite@4.1.1): - resolution: {integrity: sha512-55Jwfv6n8gAlRSVGCpIY13TCqadtaKex9d2mCbaSxMFAU06suMDsFhIch1x55eptpC2RpeiresqbTjhN2HSEtQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: '>=2.9.0' - dependencies: - '@microsoft/api-extractor': 7.34.2(@types/node@18.11.18) - '@rollup/pluginutils': 5.0.2 - '@rushstack/node-core-library': 3.55.0(@types/node@18.11.18) - debug: 4.3.4 - fast-glob: 3.2.12 - fs-extra: 10.1.0 - kolorist: 1.7.0 - ts-morph: 17.0.1 - vite: 4.1.1(@types/node@18.11.18) + vite-plugin-dts@4.3.0(@types/node@22.9.0)(rollup@4.25.0)(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)): + dependencies: + '@microsoft/api-extractor': 7.47.11(@types/node@22.9.0) + '@rollup/pluginutils': 5.1.3(rollup@4.25.0) + '@volar/typescript': 2.4.10 + '@vue/language-core': 2.1.6(typescript@5.6.3) + compare-versions: 6.1.1 + debug: 4.3.7 + kolorist: 1.8.0 + local-pkg: 0.5.0 + magic-string: 0.30.12 + typescript: 5.6.3 + optionalDependencies: + vite: 5.4.10(@types/node@22.9.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - dev: true - /vite-tsconfig-paths@4.0.5(typescript@4.9.5): - resolution: {integrity: sha512-/L/eHwySFYjwxoYt1WRJniuK/jPv+WGwgRGBYx3leciR5wBeqntQpUE6Js6+TJemChc+ter7fDBKieyEWDx4yQ==} + vite-tsconfig-paths@5.1.2(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)): dependencies: - debug: 4.3.4 + debug: 4.3.7 globrex: 0.1.2 - tsconfck: 2.0.2(typescript@4.9.5) + tsconfck: 3.1.4(typescript@5.6.3) + optionalDependencies: + vite: 5.4.10(@types/node@22.9.0) transitivePeerDependencies: - supports-color - typescript - dev: true - /vite@4.1.1(@types/node@18.11.18): - resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.4.10(@types/node@22.9.0): dependencies: - '@types/node': 18.11.18 - esbuild: 0.16.17 - postcss: 8.4.21 - resolve: 1.22.1 - rollup: 3.13.0 + esbuild: 0.21.5 + postcss: 8.4.48 + rollup: 4.25.0 optionalDependencies: - fsevents: 2.3.2 - - /vitefu@0.2.4(vite@4.1.1): - resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 - peerDependenciesMeta: - vite: - optional: true - dependencies: - vite: 4.1.1(@types/node@18.11.18) - dev: false - - /vitest@0.28.4(jsdom@21.1.0): - resolution: {integrity: sha512-sfWIy0AdlbyGRhunm+TLQEJrFH9XuRPdApfubsyLcDbCRrUX717BRQKInTgzEfyl2Ipi1HWoHB84Nqtcwxogcg==} - engines: {node: '>=v14.16.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - dependencies: - '@types/chai': 4.3.4 - '@types/chai-subset': 1.3.3 - '@types/node': 18.11.18 - '@vitest/expect': 0.28.4 - '@vitest/runner': 0.28.4 - '@vitest/spy': 0.28.4 - '@vitest/utils': 0.28.4 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - debug: 4.3.4 - jsdom: 21.1.0 - local-pkg: 0.4.3 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.3.2 - strip-literal: 1.0.1 - tinybench: 2.3.1 - tinypool: 0.3.1 - tinyspy: 1.0.2 - vite: 4.1.1(@types/node@18.11.18) - vite-node: 0.28.4(@types/node@18.11.18) - why-is-node-running: 2.2.2 + '@types/node': 22.9.0 + fsevents: 2.3.3 + + vitepress@1.5.0(@algolia/client-search@5.13.0)(@types/node@22.9.0)(@types/react@18.3.12)(postcss@8.4.48)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3): + dependencies: + '@docsearch/css': 3.7.0 + '@docsearch/js': 3.7.0(@algolia/client-search@5.13.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2) + '@iconify-json/simple-icons': 1.2.11 + '@shikijs/core': 1.22.2 + '@shikijs/transformers': 1.22.2 + '@shikijs/types': 1.22.2 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 5.1.5(vite@5.4.10(@types/node@22.9.0))(vue@3.5.12(typescript@5.6.3)) + '@vue/devtools-api': 7.6.4 + '@vue/shared': 3.5.12 + '@vueuse/core': 11.2.0(vue@3.5.12(typescript@5.6.3)) + '@vueuse/integrations': 11.2.0(focus-trap@7.6.1)(vue@3.5.12(typescript@5.6.3)) + focus-trap: 7.6.1 + mark.js: 8.11.1 + minisearch: 7.1.0 + shiki: 1.22.2 + vite: 5.4.10(@types/node@22.9.0) + vue: 3.5.12(typescript@5.6.3) + optionalDependencies: + postcss: 8.4.48 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + + vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1): + dependencies: + '@vitest/expect': 2.1.4 + '@vitest/mocker': 2.1.4(vite@5.4.10(@types/node@22.9.0)) + '@vitest/pretty-format': 2.1.4 + '@vitest/runner': 2.1.4 + '@vitest/snapshot': 2.1.4 + '@vitest/spy': 2.1.4 + '@vitest/utils': 2.1.4 + chai: 5.1.2 + debug: 4.3.7 + expect-type: 1.1.0 + magic-string: 0.30.12 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.10(@types/node@22.9.0) + vite-node: 2.1.4(@types/node@22.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.9.0 + jsdom: 25.0.1 transitivePeerDependencies: - less + - lightningcss + - msw - sass + - sass-embedded - stylus - sugarss - supports-color - terser - dev: true - - /vscode-css-languageservice@6.2.3: - resolution: {integrity: sha512-EAyhyIVHpEaf+GjtI+tVe7SekdoANfG0aubnspsQwak3Qkimn/97FpAufNyXk636ngW05pjNKAR9zyTCzo6avQ==} - dependencies: - '@vscode/l10n': 0.0.11 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.2 - vscode-uri: 3.0.7 - dev: false - /vscode-html-languageservice@5.0.4: - resolution: {integrity: sha512-tvrySfpglu4B2rQgWGVO/IL+skvU7kBkQotRlxA7ocSyRXOZUd6GA13XHkxo8LPe07KWjeoBlN1aVGqdfTK4xA==} - dependencies: - '@vscode/l10n': 0.0.11 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.2 - vscode-uri: 3.0.7 - dev: false - - /vscode-jsonrpc@8.0.2: - resolution: {integrity: sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==} - engines: {node: '>=14.0.0'} - dev: false - - /vscode-languageserver-protocol@3.17.2: - resolution: {integrity: sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==} - dependencies: - vscode-jsonrpc: 8.0.2 - vscode-languageserver-types: 3.17.2 - dev: false - - /vscode-languageserver-textdocument@1.0.8: - resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} - dev: false + vscode-uri@3.0.8: {} - /vscode-languageserver-types@3.17.2: - resolution: {integrity: sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==} - dev: false - - /vscode-languageserver@8.0.2: - resolution: {integrity: sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==} - hasBin: true + vue-demi@0.14.10(vue@3.5.12(typescript@5.6.3)): dependencies: - vscode-languageserver-protocol: 3.17.2 - dev: false + vue: 3.5.12(typescript@5.6.3) - /vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: false - - /vscode-textmate@6.0.0: - resolution: {integrity: sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==} - dev: false - - /vscode-uri@2.1.2: - resolution: {integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==} - dev: false - - /vscode-uri@3.0.7: - resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} - dev: false - - /w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} + vue@3.5.12(typescript@5.6.3): dependencies: - xml-name-validator: 4.0.0 - dev: true + '@vue/compiler-dom': 3.5.12 + '@vue/compiler-sfc': 3.5.12 + '@vue/runtime-dom': 3.5.12 + '@vue/server-renderer': 3.5.12(vue@3.5.12(typescript@5.6.3)) + '@vue/shared': 3.5.12 + optionalDependencies: + typescript: 5.6.3 - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + w3c-xmlserializer@5.0.0: dependencies: - defaults: 1.0.4 - dev: false + xml-name-validator: 5.0.0 - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: false - - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true + webidl-conversions@7.0.0: {} - /whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 - dev: true - /whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - dev: true + whatwg-mimetype@4.0.0: {} - /whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} + whatwg-url@14.0.0: dependencies: - tr46: 3.0.0 + tr46: 5.0.0 webidl-conversions: 7.0.0 - dev: true - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - - /which-pm-runs@1.1.0: - resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} - engines: {node: '>=4'} - dev: false - - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - dev: false - - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - dev: false - - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true + word-wrap@1.2.5: {} - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 - strip-ansi: 7.0.1 - dev: false - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /ws@8.12.0: - resolution: {integrity: sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - dev: true - - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: false + strip-ansi: 7.1.0 - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: false + ws@8.18.0: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + xml-name-validator@5.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: false + xmlchars@2.2.0: {} - /yaml@2.2.1: - resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} - engines: {node: '>= 14'} + y18n@5.0.8: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yallist@4.0.0: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yaml@2.5.1: {} - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true + yargs-parser@21.1.1: {} - /yargs@17.6.2: - resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true - /z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.9.0 - optionalDependencies: - commander: 9.5.0 - dev: true + yocto-queue@0.1.0: {} - /zod@3.20.2: - resolution: {integrity: sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==} - dev: false + yocto-queue@1.1.1: {} - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 661bdfe..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,3 +0,0 @@ -packages: - - "packages/*" - - "docs" diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..e947bf9 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,2 @@ +/** @type {import("prettier").Config} */ +export default {}; diff --git a/scripts/generate-navigation-json.js b/scripts/generate-navigation-json.js deleted file mode 100644 index b6baf63..0000000 --- a/scripts/generate-navigation-json.js +++ /dev/null @@ -1,51 +0,0 @@ -import { readdirSync } from "fs"; - -console.log(generateNavigationJson()); - -function generateNavigationJson() { - const ignoredFiles = getIgnoredFiles(); - - const hooks = readdirSync("packages/hooks/src") - .filter((file) => !ignoredFiles.includes(file)) - .map((file) => { - const kebabName = file.replace(".ts", ""); - const camelName = kebabToCamel(kebabName); - return { - name: camelName, - href: `/${kebabName}`, - }; - }); - - const navigation = generateNavigation(hooks); - return JSON.stringify(navigation, null, 2); -} - -function getIgnoredFiles() { - return ["index.ts", "types", "use-storage.ts", "utils.ts"]; -} - -function kebabToCamel(str) { - return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase()); -} - -function generateNavigation(hooks) { - return [ - { - section: "Getting Started", - links: [ - { - name: "Introduction", - href: "/introduction", - }, - { - name: "Installation", - href: "/installation", - }, - ], - }, - { - section: "Hooks", - links: hooks, - }, - ]; -} diff --git a/packages/hooks/src/index.ts b/src/index.ts similarity index 91% rename from packages/hooks/src/index.ts rename to src/index.ts index 09ca806..b2891ee 100644 --- a/packages/hooks/src/index.ts +++ b/src/index.ts @@ -1,4 +1,3 @@ -export type { EventMap, EventType } from "./types/events"; export { useAsyncEffect, type AsyncEffectCallback } from "./use-async-effect"; export { useBoolean } from "./use-boolean"; export { useClickOutside } from "./use-click-outside"; @@ -15,9 +14,12 @@ export { type UseDebounceEffectOptions, } from "./use-debounce-effect"; export { useDocument } from "./use-document"; +export { useDocumentEventListener } from "./use-document-event-listener"; export { useElementSize } from "./use-element-size"; export { useEventListener, + type EventMap, + type EventType, type UseEventListenerOptions, } from "./use-event-listener"; export { useFocusTrap } from "./use-focus-trap"; @@ -35,11 +37,14 @@ export { useMount } from "./use-mount"; export { usePrevious } from "./use-previous"; export { useRerender } from "./use-rerender"; export { useSafeLayoutEffect } from "./use-safe-layout-effect"; -export { useSelection, type UseSelectionOptions } from "./use-selection"; export { useSessionStorage, type UseSessionStorageOptions, } from "./use-session-storage"; +export { + useTextSelection, + type UseTextSelectionOptions, +} from "./use-text-selection"; export { useTheme, type Theme, type UseThemeOptions } from "./use-theme"; export { useThrottle, type UseThrottleOptions } from "./use-throttle"; export { @@ -52,6 +57,5 @@ export { useToggle } from "./use-toggle"; export { useUnmount } from "./use-unmount"; export { useUnsafeOnceEffect } from "./use-unsafe-once-effect"; export { useUpdate } from "./use-update"; -export { useUpdateDeps } from "./use-update-deps"; export { useWindow } from "./use-window"; export { useWindowSize } from "./use-window-size"; diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..9fad9cd --- /dev/null +++ b/src/types.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Fn = (...args: any[]) => any; diff --git a/packages/hooks/src/use-async-effect.ts b/src/use-async-effect.ts similarity index 52% rename from packages/hooks/src/use-async-effect.ts rename to src/use-async-effect.ts index 7c35c8a..e8d6217 100644 --- a/packages/hooks/src/use-async-effect.ts +++ b/src/use-async-effect.ts @@ -1,21 +1,23 @@ import { useEffect, type DependencyList, type EffectCallback } from "react"; -import type { Async } from "./types/utils"; import { useLatest } from "./use-latest"; -export type AsyncEffectCallback = Async; +/** + * Same as `EffectCallback`, but can return a promise. + */ +export type AsyncEffectCallback = ( + ...args: Parameters +) => Promise>; /** - * The same as `useEffect`, but for async functions. + * Same as `useEffect`, but can accept an async function. */ export function useAsyncEffect( effect: AsyncEffectCallback, - deps?: DependencyList + deps?: DependencyList, ) { const effectRef = useLatest(effect); useEffect(() => { effectRef.current(); - - // eslint-disable-next-line react-hooks/exhaustive-deps }, deps); } diff --git a/src/use-boolean.ts b/src/use-boolean.ts new file mode 100644 index 0000000..d46b589 --- /dev/null +++ b/src/use-boolean.ts @@ -0,0 +1,15 @@ +import { useState } from "react"; + +/** + * Use a boolean value. + */ +export function useBoolean(initialValue = false) { + const [value, setValue] = useState(initialValue); + + const setTrue = () => setValue(true); + const setFalse = () => setValue(false); + const toggle = () => setValue((value) => !value); + const reset = () => setValue(initialValue); + + return { value, set: setValue, setTrue, setFalse, toggle, reset }; +} diff --git a/src/use-click-outside.ts b/src/use-click-outside.ts new file mode 100644 index 0000000..636943c --- /dev/null +++ b/src/use-click-outside.ts @@ -0,0 +1,29 @@ +import type { RefObject } from "react"; +import { useDocumentEventListener } from "./use-document-event-listener"; +import { useLatest } from "./use-latest"; + +/** + * Listen to click events outside of a node. + */ +export function useClickOutside( + ref: RefObject, + callback: (event: MouseEvent, target: Target) => void, +) { + const callbackRef = useLatest(callback); + + useDocumentEventListener("mousedown", (event) => { + const target = ref.current; + + if (!target) { + return; + } + + const isClickInside = target.contains(event.target as Node); + + if (isClickInside) { + return; + } + + callbackRef.current(event, target); + }); +} diff --git a/src/use-clipboard-text.ts b/src/use-clipboard-text.ts new file mode 100644 index 0000000..3146d96 --- /dev/null +++ b/src/use-clipboard-text.ts @@ -0,0 +1,64 @@ +import { useEffect, useState } from "react"; +import { useDocumentEventListener } from "./use-document-event-listener"; + +export type UseClipboardTextOptions = { + readOnMount?: boolean; +}; + +/** + * Use the text on user's clipboard. + */ +export function useClipboardText(options: UseClipboardTextOptions = {}) { + const { readOnMount = true } = options; + + const [text, setText] = useState(""); + + const [error, setError] = useState(null); + + const read = async () => { + try { + const text = await navigator.clipboard.readText(); + + setText(text); + setError(null); + } catch (error) { + if (error instanceof Error) { + setError(error); + return; + } + + setError(new Error("Failed to read from clipboard", { cause: error })); + } + }; + + const write = async (text: string) => { + try { + await navigator.clipboard.writeText(text); + + setText(text); + setError(null); + } catch (error) { + if (error instanceof Error) { + setError(error); + return; + } + + setError(new Error("Failed to write to clipboard", { cause: error })); + } + }; + + useEffect(() => { + if (!readOnMount) { + return; + } + + read(); + }, [readOnMount]); + + useDocumentEventListener("cut", read); + useDocumentEventListener("copy", read); + + // TODO: Visibility change event listener + + return { text, error, write }; +} diff --git a/packages/hooks/src/use-const-fn.ts b/src/use-const-fn.ts similarity index 50% rename from packages/hooks/src/use-const-fn.ts rename to src/use-const-fn.ts index 5871ad2..a9070a4 100644 --- a/packages/hooks/src/use-const-fn.ts +++ b/src/use-const-fn.ts @@ -1,10 +1,9 @@ import { useCallback } from "react"; -import type { Fn } from "./types/utils"; +import type { Fn } from "./types"; /** - * Make a function constant. + * Use an immutable function, which stays the same across re-renders. */ export function useConstFn(fn: T) { - // eslint-disable-next-line react-hooks/exhaustive-deps return useCallback(fn, []); } diff --git a/src/use-const.ts b/src/use-const.ts new file mode 100644 index 0000000..a132c3c --- /dev/null +++ b/src/use-const.ts @@ -0,0 +1,8 @@ +import { useMemo } from "react"; + +/** + * Use an immutable value, which stays the same across re-renders. + */ +export function useConst(factory: () => T) { + return useMemo(factory, []); +} diff --git a/packages/hooks/src/use-counter.ts b/src/use-counter.ts similarity index 50% rename from packages/hooks/src/use-counter.ts rename to src/use-counter.ts index 6535c87..06b3ecf 100644 --- a/packages/hooks/src/use-counter.ts +++ b/src/use-counter.ts @@ -3,14 +3,14 @@ import { useState } from "react"; /** * Use a counter. */ -export function useCounter(defaultValue = 0) { - const [count, setCount] = useState(defaultValue); +export function useCounter(initialCount = 0) { + const [count, setCount] = useState(initialCount); const increment = () => setCount((count) => count + 1); const decrement = () => setCount((count) => count - 1); - const incrementBy = (value: number) => setCount((count) => count + value); - const decrementBy = (value: number) => setCount((count) => count - value); - const reset = () => setCount(defaultValue); + const incrementBy = (delta: number) => setCount((count) => count + delta); + const decrementBy = (delta: number) => setCount((count) => count - delta); + const reset = () => setCount(initialCount); return { count, diff --git a/packages/hooks/src/use-debounce-effect.ts b/src/use-debounce-effect.ts similarity index 82% rename from packages/hooks/src/use-debounce-effect.ts rename to src/use-debounce-effect.ts index 12a7193..947351f 100644 --- a/packages/hooks/src/use-debounce-effect.ts +++ b/src/use-debounce-effect.ts @@ -17,11 +17,12 @@ export type UseDebounceEffectOptions = { export function useDebounceEffect( effect: EffectCallback, deps: DependencyList = [], - options: UseDebounceEffectOptions = {} + options: UseDebounceEffectOptions = {}, ) { const { timeout = 500, onMount = false } = options; const effectRef = useLatest(effect); + const shouldSkipRef = useRef(true); useEffect(() => { @@ -31,8 +32,7 @@ export function useDebounceEffect( } const timer = setTimeout(effectRef.current, timeout); - return () => clearTimeout(timer); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [effectRef, ...deps, timeout, onMount]); + return () => clearTimeout(timer); + }, [...deps, timeout, onMount]); } diff --git a/src/use-debounce.ts b/src/use-debounce.ts new file mode 100644 index 0000000..fdfbb1a --- /dev/null +++ b/src/use-debounce.ts @@ -0,0 +1,18 @@ +import { useState } from "react"; +import { useDebounceEffect } from "./use-debounce-effect"; + +export type UseDebounceOptions = { + timeout?: number; + onMount?: boolean; +}; + +/** + * Debounce a value. + */ +export function useDebounce(value: T, options: UseDebounceOptions = {}) { + const [debouncedValue, setDebouncedValue] = useState(value); + + useDebounceEffect(() => setDebouncedValue(value), [value], options); + + return debouncedValue; +} diff --git a/src/use-document-event-listener.ts b/src/use-document-event-listener.ts new file mode 100644 index 0000000..5a89feb --- /dev/null +++ b/src/use-document-event-listener.ts @@ -0,0 +1,18 @@ +import { useDocument } from "./use-document"; +import { + useEventListener, + type UseEventListenerOptions, +} from "./use-event-listener"; + +/** + * Listen to events on the `document` object. + */ +export function useDocumentEventListener( + type: Type, + callback: (event: DocumentEventMap[Type], document: Document) => void, + options: UseEventListenerOptions = {}, +) { + const documentRef = useDocument(); + + useEventListener(documentRef, type, callback, options); +} diff --git a/packages/hooks/src/use-document.ts b/src/use-document.ts similarity index 61% rename from packages/hooks/src/use-document.ts rename to src/use-document.ts index d321b17..e6075e6 100644 --- a/packages/hooks/src/use-document.ts +++ b/src/use-document.ts @@ -1,4 +1,5 @@ -import { useEffect, useRef } from "react"; +import { useRef } from "react"; +import { useMount } from "./use-mount"; /** * Use `document` object. @@ -6,9 +7,9 @@ import { useEffect, useRef } from "react"; export function useDocument() { const ref = useRef(null); - useEffect(() => { + useMount(() => { ref.current = document; - }, []); + }); return ref; } diff --git a/src/use-element-size.ts b/src/use-element-size.ts new file mode 100644 index 0000000..3fe54ba --- /dev/null +++ b/src/use-element-size.ts @@ -0,0 +1,35 @@ +import { useState, type RefObject } from "react"; +import { useMount } from "./use-mount"; + +/** + * Use the size of an element. + */ +export function useElementSize(ref: RefObject) { + const [width, setWidth] = useState(0); + const [height, setHeight] = useState(0); + + useMount(() => { + const target = ref.current; + + if (!target) { + return; + } + + const observer = new ResizeObserver(([entry]) => { + if (!entry) { + return; + } + + const { clientWidth, clientHeight } = entry.target; + + setWidth(clientWidth); + setHeight(clientHeight); + }); + + observer.observe(target); + + return () => observer.disconnect(); + }); + + return { width, height }; +} diff --git a/src/use-event-listener.ts b/src/use-event-listener.ts new file mode 100644 index 0000000..6042fc5 --- /dev/null +++ b/src/use-event-listener.ts @@ -0,0 +1,190 @@ +import { useEffect, type DependencyList, type RefObject } from "react"; +import { useLatest } from "./use-latest"; + +export type UseEventListenerOptions = AddEventListenerOptions & { + extraDeps?: DependencyList; +}; + +/** + * Listen to any events. + */ +export function useEventListener< + Target extends EventTarget, + Type extends EventType, +>( + ref: RefObject, + type: Type, + callback: (event: EventMap[Type], target: Target) => void, + options: UseEventListenerOptions = {}, +) { + const { + capture = false, + once = false, + passive = false, + extraDeps = [], + } = options; + + const callbackRef = useLatest(callback); + + useEffect(() => { + const target = ref.current; + + if (!target) { + return; + } + + const listener: EventListener = (event) => + callbackRef.current(event as EventMap[Type], target); + + target.addEventListener(type, listener, { capture, once, passive }); + + return () => target.removeEventListener(type, listener); + }, [type, capture, once, passive, ...extraDeps]); +} + +export type EventMap = + Target extends HTMLVideoElement // -> HTMLMediaElement -> HTMLElement -> Element -> Node -> EventTarget + ? HTMLVideoElementEventMap + : Target extends SVGSVGElement // -> SVGGraphicsElement -> SVGElement -> Element -> Node -> EventTarget + ? SVGSVGElementEventMap + : Target extends HTMLMediaElement // -> HTMLElement -> Element -> Node -> EventTarget + ? HTMLMediaElementEventMap + : Target extends HTMLBodyElement // -> HTMLElement -> Element -> Node -> EventTarget + ? HTMLBodyElementEventMap + : Target extends HTMLElement // -> Element -> Node -> EventTarget + ? HTMLElementEventMap + : Target extends MathMLElement // -> Element -> Node -> EventTarget + ? MathMLElementEventMap + : Target extends SVGElement // -> Element -> Node -> EventTarget + ? SVGElementEventMap + : Target extends ShadowRoot // -> DocumentFragment -> Node -> EventTarget + ? ShadowRootEventMap + : Target extends Document // -> Node -> EventTarget + ? DocumentEventMap + : Target extends Element // -> Node -> EventTarget + ? ElementEventMap + : Target extends IDBOpenDBRequest // -> IDBRequest -> EventTarget + ? IDBOpenDBRequestEventMap + : Target extends MIDIInput // -> MIDIPort -> EventTarget + ? MIDIInputEventMap + : Target extends OfflineAudioContext // -> AudioContext -> EventTarget + ? OfflineAudioContextEventMap + : Target extends XMLHttpRequest // -> XMLHttpRequestEventTarget -> EventTarget + ? XMLHttpRequestEventMap + : Target extends AbortSignal // -> EventTarget + ? AbortSignalEventMap + : Target extends Animation // -> EventTarget + ? AnimationEventMap + : Target extends AudioScheduledSourceNode // -> EventTarget + ? AudioScheduledSourceNodeEventMap + : Target extends AudioWorkletNode // -> EventTarget + ? AudioWorkletNodeEventMap + : Target extends BaseAudioContext // -> EventTarget + ? BaseAudioContextEventMap + : Target extends BroadcastChannel // -> EventTarget + ? BroadcastChannelEventMap + : Target extends EventSource // -> EventTarget + ? EventSourceEventMap + : Target extends FileReader // -> EventTarget + ? FileReaderEventMap + : Target extends FontFaceSet // -> EventTarget + ? FontFaceSetEventMap + : Target extends IDBDatabase // -> EventTarget + ? IDBDatabaseEventMap + : Target extends IDBRequest // -> EventTarget + ? IDBRequestEventMap + : Target extends IDBTransaction // -> EventTarget + ? IDBTransactionEventMap + : Target extends MIDIAccess // -> EventTarget + ? MIDIAccessEventMap + : Target extends MIDIPort // -> EventTarget + ? MIDIPortEventMap + : Target extends MediaDevices // -> EventTarget + ? MediaDevicesEventMap + : Target extends MediaKeySession // -> EventTarget + ? MediaKeySessionEventMap + : Target extends MediaQueryList // -> EventTarget + ? MediaQueryListEventMap + : Target extends MediaRecorder // -> EventTarget + ? MediaRecorderEventMap + : Target extends MediaSource // -> EventTarget + ? MediaSourceEventMap + : Target extends MediaStream // -> EventTarget + ? MediaStreamEventMap + : Target extends MediaStreamTrack // -> EventTarget + ? MediaStreamTrackEventMap + : Target extends MessagePort // -> EventTarget + ? MessagePortEventMap + : Target extends Notification // -> EventTarget + ? NotificationEventMap + : Target extends OffscreenCanvas // -> EventTarget + ? OffscreenCanvasEventMap + : Target extends PaymentRequest // -> EventTarget + ? PaymentRequestEventMap + : Target extends Performance // -> EventTarget + ? PerformanceEventMap + : Target extends PermissionStatus // -> EventTarget + ? PermissionStatusEventMap + : Target extends PictureInPictureWindow // -> EventTarget + ? PictureInPictureWindowEventMap + : Target extends RTCDTMFSender // -> EventTarget + ? RTCDTMFSenderEventMap + : Target extends RTCDataChannel // -> EventTarget + ? RTCDataChannelEventMap + : Target extends RTCDtlsTransport // -> EventTarget + ? RTCDtlsTransportEventMap + : Target extends RTCIceTransport // -> EventTarget + ? RTCIceTransportEventMap + : Target extends RTCPeerConnection // -> EventTarget + ? RTCPeerConnectionEventMap + : Target extends RTCSctpTransport // -> EventTarget + ? RTCSctpTransportEventMap + : Target extends RemotePlayback // -> EventTarget + ? RemotePlaybackEventMap + : Target extends ScreenOrientation // -> EventTarget + ? ScreenOrientationEventMap + : Target extends ServiceWorker // -> EventTarget + ? ServiceWorkerEventMap + : Target extends ServiceWorkerContainer // -> EventTarget + ? ServiceWorkerContainerEventMap + : Target extends ServiceWorkerRegistration // -> EventTarget + ? ServiceWorkerRegistrationEventMap + : Target extends SourceBuffer // -> EventTarget + ? SourceBufferEventMap + : Target extends SourceBufferList // -> EventTarget + ? SourceBufferListEventMap + : Target extends SpeechSynthesis // -> EventTarget + ? SpeechSynthesisEventMap + : Target extends SpeechSynthesisUtterance // -> EventTarget + ? SpeechSynthesisUtteranceEventMap + : Target extends TextTrack // -> EventTarget + ? TextTrackEventMap + : Target extends TextTrackCue // -> EventTarget + ? TextTrackCueEventMap + : Target extends TextTrackList // -> EventTarget + ? TextTrackListEventMap + : Target extends VideoDecoder // -> EventTarget + ? VideoDecoderEventMap + : Target extends VideoEncoder // -> EventTarget + ? VideoEncoderEventMap + : Target extends VisualViewport // -> EventTarget + ? VisualViewportEventMap + : Target extends WakeLockSentinel // -> EventTarget + ? WakeLockSentinelEventMap + : Target extends WebSocket // -> EventTarget + ? WebSocketEventMap + : Target extends Window // -> EventTarget + ? WindowEventMap + : Target extends Worker // -> EventTarget + ? WorkerEventMap + : Target extends XMLHttpRequestEventTarget // -> EventTarget + ? XMLHttpRequestEventTargetEventMap + : Record< + string, + Event + >; + +export type EventType = Extract< + keyof EventMap, + string +>; diff --git a/src/use-focus-trap.ts b/src/use-focus-trap.ts new file mode 100644 index 0000000..ab236de --- /dev/null +++ b/src/use-focus-trap.ts @@ -0,0 +1,44 @@ +import type { RefObject } from "react"; +import { useEventListener } from "./use-event-listener"; + +/** + * Trap tab focus between two HTML elements. + */ +export function useFocusTrap( + firstRef: RefObject, + lastRef: RefObject, +) { + useEventListener(firstRef, "keydown", (event) => { + const last = lastRef.current; + + if (!last) { + return; + } + + const isShiftTab = event.shiftKey && event.code === "Tab"; + + if (!isShiftTab) { + return; + } + + event.preventDefault(); + last.focus(); + }); + + useEventListener(lastRef, "keydown", (event) => { + const first = firstRef.current; + + if (!first) { + return; + } + + const isTab = !event.shiftKey && event.code === "Tab"; + + if (!isTab) { + return; + } + + event.preventDefault(); + first.focus(); + }); +} diff --git a/packages/hooks/src/use-hover.ts b/src/use-hover.ts similarity index 89% rename from packages/hooks/src/use-hover.ts rename to src/use-hover.ts index 30af68f..21ca759 100644 --- a/packages/hooks/src/use-hover.ts +++ b/src/use-hover.ts @@ -2,7 +2,7 @@ import { useState, type RefObject } from "react"; import { useEventListener } from "./use-event-listener"; /** - * Listen for hover events on an element. + * Listen to hover events on an HTML element. */ export function useHover(ref: RefObject) { const [isHovering, setIsHovering] = useState(false); diff --git a/src/use-interval.ts b/src/use-interval.ts new file mode 100644 index 0000000..7903b82 --- /dev/null +++ b/src/use-interval.ts @@ -0,0 +1,16 @@ +import { useEffect } from "react"; +import type { Fn } from "./types"; +import { useLatest } from "./use-latest"; + +/** + * Run a function at a regular interval. + */ +export function useInterval(fn: Fn, timeout = 500) { + const fnRef = useLatest(fn); + + useEffect(() => { + const timer = setInterval(fnRef.current, timeout); + + return () => clearInterval(timer); + }, [timeout]); +} diff --git a/src/use-is-mounted.ts b/src/use-is-mounted.ts new file mode 100644 index 0000000..012e781 --- /dev/null +++ b/src/use-is-mounted.ts @@ -0,0 +1,20 @@ +import { useRef } from "react"; +import { useMount } from "./use-mount"; +import { useUnmount } from "./use-unmount"; + +/** + * Check if the component is mounted. + */ +export function useIsMounted() { + const isMountedRef = useRef(false); + + useMount(() => { + isMountedRef.current = true; + }); + + useUnmount(() => { + isMountedRef.current = false; + }); + + return isMountedRef; +} diff --git a/src/use-keydown.ts b/src/use-keydown.ts new file mode 100644 index 0000000..05adaae --- /dev/null +++ b/src/use-keydown.ts @@ -0,0 +1,40 @@ +import { useDocumentEventListener } from "./use-document-event-listener"; +import { useLatest } from "./use-latest"; + +export type ModifierKeys = { + ctrl?: boolean; + shift?: boolean; + alt?: boolean; + meta?: boolean; +}; + +/** + * Listen to keydown events. + */ +export function useKeydown( + key: string, + callback: (event: KeyboardEvent, document: Document) => void, + modifier: ModifierKeys = {}, +) { + const { ctrl = false, shift = false, alt = false, meta = false } = modifier; + + const callbackRef = useLatest(callback); + + useDocumentEventListener( + "keydown", + (event, document) => { + if ( + event.key !== key || + event.ctrlKey !== ctrl || + event.shiftKey !== shift || + event.altKey !== alt || + event.metaKey !== meta + ) { + return; + } + + callbackRef.current(event, document); + }, + { extraDeps: [key, ctrl, shift, alt, meta] }, + ); +} diff --git a/packages/hooks/src/use-latest.ts b/src/use-latest.ts similarity index 99% rename from packages/hooks/src/use-latest.ts rename to src/use-latest.ts index baba241..edfd4f4 100644 --- a/packages/hooks/src/use-latest.ts +++ b/src/use-latest.ts @@ -5,6 +5,8 @@ import { useRef } from "react"; */ export function useLatest(value: T) { const ref = useRef(value); + ref.current = value; + return ref; } diff --git a/src/use-local-storage.ts b/src/use-local-storage.ts new file mode 100644 index 0000000..6f1d7a6 --- /dev/null +++ b/src/use-local-storage.ts @@ -0,0 +1,13 @@ +import { useStorage, type UseStorageOptions } from "./use-storage"; + +export type UseLocalStorageOptions = Omit, "type">; + +/** + * Use local storage. + */ +export function useLocalStorage( + key: string, + options: UseLocalStorageOptions = {}, +) { + return useStorage(key, { type: "local", ...options }); +} diff --git a/packages/hooks/src/use-media-query.ts b/src/use-media-query.ts similarity index 83% rename from packages/hooks/src/use-media-query.ts rename to src/use-media-query.ts index 7b24105..713e627 100644 --- a/packages/hooks/src/use-media-query.ts +++ b/src/use-media-query.ts @@ -2,23 +2,26 @@ import { useEffect, useRef, useState } from "react"; import { useEventListener } from "./use-event-listener"; /** - * Manage the result of a media query. + * Use the result of a media query. */ export function useMediaQuery(query: string) { const [isMatched, setIsMatched] = useState(false); + const mediaQueryListRef = useRef(null); useEffect(() => { const mediaQueryList = matchMedia(query); + mediaQueryListRef.current = mediaQueryList; + setIsMatched(mediaQueryList.matches); }, [query]); useEventListener( mediaQueryListRef, "change", - (e) => setIsMatched(e.matches), - { extraDeps: [query] } + (event) => setIsMatched(event.matches), + { extraDeps: [query] }, ); return isMatched; diff --git a/packages/hooks/src/use-mount.ts b/src/use-mount.ts similarity index 56% rename from packages/hooks/src/use-mount.ts rename to src/use-mount.ts index 79e8d42..cdc8d26 100644 --- a/packages/hooks/src/use-mount.ts +++ b/src/use-mount.ts @@ -1,9 +1,8 @@ import { useEffect, type EffectCallback } from "react"; /** - * Trigger effect after the component is mounted. + * Trigger an effect only after the component is mounted. */ export function useMount(effect: EffectCallback) { - // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(effect, []); } diff --git a/packages/hooks/src/use-previous.ts b/src/use-previous.ts similarity index 66% rename from packages/hooks/src/use-previous.ts rename to src/use-previous.ts index d51230a..f8adfad 100644 --- a/packages/hooks/src/use-previous.ts +++ b/src/use-previous.ts @@ -3,8 +3,12 @@ import { useRef } from "react"; /** * Use the previous value of a state. */ -export function usePrevious(value: T, equalFn = (a: T, b: T) => a === b) { - const previousRef = useRef(undefined); +export function usePrevious( + value: T, + equalFn = (old: T, now: T) => old === now, +) { + const previousRef = useRef(null); + const currentRef = useRef(value); if (!equalFn(currentRef.current, value)) { diff --git a/packages/hooks/src/use-rerender.ts b/src/use-rerender.ts similarity index 99% rename from packages/hooks/src/use-rerender.ts rename to src/use-rerender.ts index fbc017e..5f62f27 100644 --- a/packages/hooks/src/use-rerender.ts +++ b/src/use-rerender.ts @@ -5,6 +5,7 @@ import { useState } from "react"; */ export function useRerender() { const [, setState] = useState({}); + const rerender = () => setState({}); return rerender; diff --git a/packages/hooks/src/use-safe-layout-effect.ts b/src/use-safe-layout-effect.ts similarity index 100% rename from packages/hooks/src/use-safe-layout-effect.ts rename to src/use-safe-layout-effect.ts diff --git a/src/use-session-storage.ts b/src/use-session-storage.ts new file mode 100644 index 0000000..6898131 --- /dev/null +++ b/src/use-session-storage.ts @@ -0,0 +1,13 @@ +import { useStorage, type UseStorageOptions } from "./use-storage"; + +export type UseSessionStorageOptions = Omit, "type">; + +/** + * Use session storage. + */ +export function useSessionStorage( + key: string, + options: UseSessionStorageOptions = {}, +) { + return useStorage(key, { type: "session", ...options }); +} diff --git a/src/use-storage.ts b/src/use-storage.ts new file mode 100644 index 0000000..28c544b --- /dev/null +++ b/src/use-storage.ts @@ -0,0 +1,75 @@ +import { useEffect, useState } from "react"; +import { useLatest } from "./use-latest"; + +export type StorageType = "local" | "session"; + +export type UseStorageOptions = { + type: StorageType; + serializer?: (value: T) => string; + deserializer?: (value: string) => T; +}; + +/** + * Use storage. + */ +export function useStorage(key: string, options: UseStorageOptions) { + const { + type, + serializer = JSON.stringify, + deserializer = JSON.parse, + } = options; + + const [value, setValue] = useState(null); + + const deserializerRef = useLatest(deserializer); + + useEffect(() => { + try { + const storage = chooseStorage(type); + + const value = storage.getItem(key); + + if (value === null) { + setValue(null); + return; + } + + const storedValue = deserializerRef.current(value); + + setValue(storedValue); + } catch { + setValue(null); + } + }, [key, type]); + + const set: typeof setValue = (action) => { + try { + const storage = chooseStorage(type); + + const newValue = action instanceof Function ? action(value) : action; + + if (newValue === null) { + storage.removeItem(key); + } else { + storage.setItem(key, serializer(newValue)); + } + + setValue(newValue); + } catch { + return; + } + }; + + const remove = () => set(null); + + return { value, set, remove }; +} + +function chooseStorage(type: StorageType) { + switch (type) { + case "local": + return localStorage; + case "session": + return sessionStorage; + } +} diff --git a/src/use-text-selection.ts b/src/use-text-selection.ts new file mode 100644 index 0000000..22f6de1 --- /dev/null +++ b/src/use-text-selection.ts @@ -0,0 +1,36 @@ +import { useState } from "react"; +import { useDocumentEventListener } from "./use-document-event-listener"; +import { useMount } from "./use-mount"; + +export type UseTextSelectionOptions = { + sticky?: boolean; +}; + +/** + * Use user's text selection. + */ +export function useTextSelection(options: UseTextSelectionOptions = {}) { + const { sticky = false } = options; + + const [selection, setSelection] = useState(""); + + useMount(() => { + setSelection(document.getSelection()?.toString() ?? ""); + }); + + useDocumentEventListener( + "mouseup", + () => { + const selection = document.getSelection()?.toString() ?? ""; + + if (!selection && sticky) { + return; + } + + setSelection(selection); + }, + { extraDeps: [sticky] }, + ); + + return selection; +} diff --git a/src/use-theme.ts b/src/use-theme.ts new file mode 100644 index 0000000..c3e26e7 --- /dev/null +++ b/src/use-theme.ts @@ -0,0 +1,37 @@ +import { useLocalStorage } from "./use-local-storage"; +import { useMediaQuery } from "./use-media-query"; + +export type Theme = "light" | "dark"; + +export type UseThemeOptions = { + defaultTheme?: Theme; + storageKey?: string; +}; + +/** + * Use light/dark/system theme. + */ +export function useTheme(options: UseThemeOptions = {}) { + const { defaultTheme, storageKey = "theme" } = options; + + const isDarkDevice = useMediaQuery("(prefers-color-scheme: dark)"); + const deviceTheme = isDarkDevice ? "dark" : "light"; + + const { + value: storedTheme, + set: setStoredTheme, + remove: removeStoredTheme, + } = useLocalStorage(storageKey, { + serializer: (value) => value, + deserializer: (value) => value as Theme, + }); + + const theme = storedTheme ?? defaultTheme ?? deviceTheme; + + const setLight = () => setStoredTheme("light"); + const setDark = () => setStoredTheme("dark"); + const toggle = () => setStoredTheme(theme === "dark" ? "light" : "dark"); + const reset = () => removeStoredTheme(); + + return { theme, set: setStoredTheme, setLight, setDark, toggle, reset }; +} diff --git a/packages/hooks/src/use-throttle-effect.ts b/src/use-throttle-effect.ts similarity index 85% rename from packages/hooks/src/use-throttle-effect.ts rename to src/use-throttle-effect.ts index a2ac7f8..08992d2 100644 --- a/packages/hooks/src/use-throttle-effect.ts +++ b/src/use-throttle-effect.ts @@ -17,12 +17,14 @@ export type UseThrottleEffectOptions = { export function useThrottleEffect( effect: EffectCallback, deps: DependencyList = [], - options: UseThrottleEffectOptions = {} + options: UseThrottleEffectOptions = {}, ) { const { timeout = 500, onMount = false } = options; const effectRef = useLatest(effect); + const shouldSkipRef = useRef(true); + const isCoolingDownRef = useRef(false); useEffect(() => { @@ -38,10 +40,9 @@ export function useThrottleEffect( effectRef.current(); isCoolingDownRef.current = true; + setTimeout(() => { isCoolingDownRef.current = false; }, timeout); - - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [effectRef, ...deps, timeout, onMount]); + }, [...deps, timeout, onMount]); } diff --git a/src/use-throttle.ts b/src/use-throttle.ts new file mode 100644 index 0000000..e848f0f --- /dev/null +++ b/src/use-throttle.ts @@ -0,0 +1,18 @@ +import { useState } from "react"; +import { useThrottleEffect } from "./use-throttle-effect"; + +export type UseThrottleOptions = { + timeout?: number; + onMount?: boolean; +}; + +/** + * Throttle a value. + */ +export function useThrottle(value: T, options: UseThrottleOptions = {}) { + const [throttledValue, setThrottledValue] = useState(value); + + useThrottleEffect(() => setThrottledValue(value), [value], options); + + return throttledValue; +} diff --git a/src/use-timeout.ts b/src/use-timeout.ts new file mode 100644 index 0000000..d5fedea --- /dev/null +++ b/src/use-timeout.ts @@ -0,0 +1,16 @@ +import { useEffect } from "react"; +import type { Fn } from "./types"; +import { useLatest } from "./use-latest"; + +/** + * Run a function after a timeout. + */ +export function useTimeout(fn: Fn, timeout = 500) { + const fnRef = useLatest(fn); + + useEffect(() => { + const timer = setTimeout(fnRef.current, timeout); + + return () => clearTimeout(timer); + }, [timeout]); +} diff --git a/src/use-title.ts b/src/use-title.ts new file mode 100644 index 0000000..9fa8f02 --- /dev/null +++ b/src/use-title.ts @@ -0,0 +1,35 @@ +import { useState } from "react"; +import { useMount } from "./use-mount"; + +/** + * Use page title. + */ +export function useTitle() { + const [title, setTitle] = useState(""); + + useMount(() => { + setTitle(document.title); + }); + + useMount(() => { + const title = document.querySelector("title"); + + if (!title) { + return; + } + + const observer = new MutationObserver(([mutation]) => { + setTitle(mutation?.target.textContent ?? ""); + }); + + observer.observe(title, { + subtree: true, + characterData: true, + childList: true, + }); + + return () => observer.disconnect(); + }); + + return title; +} diff --git a/packages/hooks/src/use-toggle.ts b/src/use-toggle.ts similarity index 56% rename from packages/hooks/src/use-toggle.ts rename to src/use-toggle.ts index aa7caad..82ec656 100644 --- a/packages/hooks/src/use-toggle.ts +++ b/src/use-toggle.ts @@ -1,17 +1,14 @@ import { useState } from "react"; -// TODO: Add `const` modifier on `L` and `R`. -// See: https://github.com/microsoft/TypeScript/pull/51865 - /** * Use an either-or value. */ -export function useToggle(left: L, right: R) { +export function useToggle(left: L, right: R) { const [value, setValue] = useState(left); - const toggle = () => setValue((value) => (value === left ? right : left)); const setLeft = () => setValue(left); const setRight = () => setValue(right); + const toggle = () => setValue((value) => (value === left ? right : left)); - return { value, set: setValue, toggle, setLeft, setRight }; + return { value, set: setValue, setLeft, setRight, toggle }; } diff --git a/src/use-unmount.ts b/src/use-unmount.ts new file mode 100644 index 0000000..8f9f042 --- /dev/null +++ b/src/use-unmount.ts @@ -0,0 +1,8 @@ +import { useMount } from "./use-mount"; + +/** + * Trigger an effect just before the component is unmounted. + */ +export function useUnmount(cleanup: () => void) { + useMount(() => cleanup); +} diff --git a/src/use-unsafe-once-effect.ts b/src/use-unsafe-once-effect.ts new file mode 100644 index 0000000..fff932c --- /dev/null +++ b/src/use-unsafe-once-effect.ts @@ -0,0 +1,21 @@ +import { useRef, type EffectCallback } from "react"; +import { useLatest } from "./use-latest"; +import { useMount } from "./use-mount"; + +/** + * Trigger an effect exactly once. + */ +export function useUnsafeOnceEffect(effect: EffectCallback) { + const effectRef = useLatest(effect); + + const isFirstRenderRef = useRef(true); + + useMount(() => { + if (isFirstRenderRef.current) { + isFirstRenderRef.current = false; + return; + } + + return effectRef.current(); + }); +} diff --git a/packages/hooks/src/use-update-deps.ts b/src/use-update.ts similarity index 53% rename from packages/hooks/src/use-update-deps.ts rename to src/use-update.ts index 966c85c..8e98522 100644 --- a/packages/hooks/src/use-update-deps.ts +++ b/src/use-update.ts @@ -1,17 +1,17 @@ import { - useEffect, - useRef, type DependencyList, type EffectCallback, + useEffect, + useRef, } from "react"; import { useLatest } from "./use-latest"; -import { useUnmount } from "./use-unmount"; /** - * Trigger effect after given dependencies are updated. + * Trigger an effect only after component or dependency updates. */ -export function useUpdateDeps(effect: EffectCallback, deps: DependencyList) { +export function useUpdate(effect: EffectCallback, deps?: DependencyList) { const effectRef = useLatest(effect); + const shouldSkipRef = useRef(true); useEffect(() => { @@ -21,11 +21,5 @@ export function useUpdateDeps(effect: EffectCallback, deps: DependencyList) { } return effectRef.current(); - - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [effectRef, ...deps]); - - useUnmount(() => { - shouldSkipRef.current = true; - }); + }, deps); } diff --git a/packages/hooks/src/use-window-size.ts b/src/use-window-size.ts similarity index 84% rename from packages/hooks/src/use-window-size.ts rename to src/use-window-size.ts index b08e91f..3dd9a96 100644 --- a/packages/hooks/src/use-window-size.ts +++ b/src/use-window-size.ts @@ -1,5 +1,6 @@ -import { useEffect, useState } from "react"; +import { useState } from "react"; import { useEventListener } from "./use-event-listener"; +import { useMount } from "./use-mount"; import { useWindow } from "./use-window"; /** @@ -11,10 +12,10 @@ export function useWindowSize() { const windowRef = useWindow(); - useEffect(() => { + useMount(() => { setWidth(window.innerWidth); setHeight(window.innerHeight); - }, []); + }); useEventListener(windowRef, "resize", () => { setWidth(window.innerWidth); diff --git a/packages/hooks/src/use-window.ts b/src/use-window.ts similarity index 60% rename from packages/hooks/src/use-window.ts rename to src/use-window.ts index 6e8984c..61c3c7a 100644 --- a/packages/hooks/src/use-window.ts +++ b/src/use-window.ts @@ -1,4 +1,5 @@ -import { useEffect, useRef } from "react"; +import { useRef } from "react"; +import { useMount } from "./use-mount"; /** * Use `window` object. @@ -6,9 +7,9 @@ import { useEffect, useRef } from "react"; export function useWindow() { const ref = useRef(null); - useEffect(() => { + useMount(() => { ref.current = window; - }, []); + }); return ref; } diff --git a/packages/hooks/tests/use-async-effect.test.ts b/tests/use-async-effect.test.ts similarity index 73% rename from packages/hooks/tests/use-async-effect.test.ts rename to tests/use-async-effect.test.ts index a7a2676..5da9414 100644 --- a/packages/hooks/tests/use-async-effect.test.ts +++ b/tests/use-async-effect.test.ts @@ -1,41 +1,44 @@ import { renderHook } from "@testing-library/react"; import { useAsyncEffect } from "src"; -const asyncFn = async () => { - // Some async logic. -}; - it("triggers effect after every re-render by default", () => { - const effect = vi.fn(asyncFn); + const effect = vi.fn(async () => {}); const { rerender } = renderHook(() => useAsyncEffect(effect)); + expect(effect).toHaveBeenCalledTimes(1); rerender(); + expect(effect).toHaveBeenCalledTimes(2); }); -it("triggers effect only on mount with empty dependency list", () => { - const effect = vi.fn(asyncFn); +it("triggers effect only on mount if dependency list is empty", () => { + const effect = vi.fn(async () => {}); const { rerender } = renderHook(() => useAsyncEffect(effect, [])); + expect(effect).toHaveBeenCalledTimes(1); rerender(); + expect(effect).toHaveBeenCalledTimes(1); }); -it("triggers effect after every dependency updates", () => { - const effect = vi.fn(asyncFn); +it("triggers effect after every dependency update", () => { + const effect = vi.fn(async () => {}); const { rerender } = renderHook((count) => useAsyncEffect(effect, [count]), { initialProps: 0, }); + expect(effect).toHaveBeenCalledTimes(1); rerender(1); + expect(effect).toHaveBeenCalledTimes(2); rerender(1); + expect(effect).toHaveBeenCalledTimes(2); }); diff --git a/packages/hooks/tests/use-boolean.test.ts b/tests/use-boolean.test.ts similarity index 68% rename from packages/hooks/tests/use-boolean.test.ts rename to tests/use-boolean.test.ts index f303868..69801e6 100644 --- a/packages/hooks/tests/use-boolean.test.ts +++ b/tests/use-boolean.test.ts @@ -3,48 +3,82 @@ import { useBoolean } from "src"; it("defaults to false", () => { const { result } = renderHook(() => useBoolean()); + expect(result.current.value).toEqual(false); }); -it("can customize default value", () => { +it("can customize initial value", () => { const { result } = renderHook(() => useBoolean(true)); + expect(result.current.value).toEqual(true); }); it("can set value", () => { const { result } = renderHook(() => useBoolean()); + expect(result.current.value).toEqual(false); act(() => result.current.set(true)); + expect(result.current.value).toEqual(true); act(() => result.current.set(false)); + + expect(result.current.value).toEqual(false); +}); + +it("can set value to true", () => { + const { result } = renderHook(() => useBoolean()); + + expect(result.current.value).toEqual(false); + + act(() => result.current.setTrue()); + + expect(result.current.value).toEqual(true); + + act(() => result.current.setTrue()); + + expect(result.current.value).toEqual(true); +}); + +it("can set value to false", () => { + const { result } = renderHook(() => useBoolean(true)); + + expect(result.current.value).toEqual(true); + + act(() => result.current.setFalse()); + + expect(result.current.value).toEqual(false); + + act(() => result.current.setFalse()); + expect(result.current.value).toEqual(false); }); it("can toggle value", () => { const { result } = renderHook(() => useBoolean()); + expect(result.current.value).toEqual(false); act(() => result.current.toggle()); + expect(result.current.value).toEqual(true); act(() => result.current.toggle()); + expect(result.current.value).toEqual(false); }); -it("can set value to true", () => { +it("can reset value", () => { const { result } = renderHook(() => useBoolean()); + expect(result.current.value).toEqual(false); - act(() => result.current.on()); - expect(result.current.value).toEqual(true); -}); + act(() => result.current.toggle()); -it("can set value to false", () => { - const { result } = renderHook(() => useBoolean(true)); expect(result.current.value).toEqual(true); - act(() => result.current.off()); + act(() => result.current.reset()); + expect(result.current.value).toEqual(false); }); diff --git a/packages/hooks/tests/use-click-outside.test.ts b/tests/use-click-outside.test.ts similarity index 52% rename from packages/hooks/tests/use-click-outside.test.ts rename to tests/use-click-outside.test.ts index da94288..921c585 100644 --- a/packages/hooks/tests/use-click-outside.test.ts +++ b/tests/use-click-outside.test.ts @@ -1,4 +1,5 @@ -import { fireEvent, renderHook, screen } from "@testing-library/react"; +import { renderHook, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; import { useClickOutside } from "src"; beforeAll(() => { @@ -11,47 +12,57 @@ beforeAll(() => { `; }); -it("responds to clicks outside", () => { - const container = screen.getByTestId("container"); +it("listens to click events outside", async () => { + const user = userEvent.setup(); const outside = screen.getByTestId("outside"); + const container = screen.getByTestId("container"); + const inside = screen.getByTestId("inside"); const callback = vi.fn(); renderHook(() => useClickOutside({ current: container }, callback)); + expect(callback).toHaveBeenCalledTimes(0); - fireEvent.mouseDown(outside); + await user.click(outside); + expect(callback).toHaveBeenCalledTimes(1); - fireEvent.mouseDown(outside); - expect(callback).toHaveBeenCalledTimes(2); + await user.click(inside); + + expect(callback).toHaveBeenCalledTimes(1); }); -it("does not respond to clicks inside", () => { +it("responds to dynamic `ref`", async () => { + const user = userEvent.setup(); + const outside = screen.getByTestId("outside"); const container = screen.getByTestId("container"); const inside = screen.getByTestId("inside"); const callback = vi.fn(); - renderHook(() => useClickOutside({ current: container }, callback)); - expect(callback).toHaveBeenCalledTimes(0); + const { rerender } = renderHook( + (element) => useClickOutside({ current: element }, callback), + { initialProps: null as Element | null }, + ); - fireEvent.mouseDown(inside); expect(callback).toHaveBeenCalledTimes(0); - fireEvent.mouseDown(inside); + await user.click(container); + expect(callback).toHaveBeenCalledTimes(0); -}); -it("does not throw with null ref", () => { - const outside = screen.getByTestId("outside"); - const inside = screen.getByTestId("inside"); - const callback = vi.fn(); + rerender(inside); - renderHook(() => useClickOutside({ current: null }, callback)); expect(callback).toHaveBeenCalledTimes(0); - fireEvent.mouseDown(inside); - expect(callback).toHaveBeenCalledTimes(0); + await user.click(container); - fireEvent.mouseDown(outside); - expect(callback).toHaveBeenCalledTimes(0); + expect(callback).toHaveBeenCalledTimes(1); + + rerender(outside); + + expect(callback).toHaveBeenCalledTimes(1); + + await user.click(container); + + expect(callback).toHaveBeenCalledTimes(1); }); diff --git a/tests/use-clipboard-text.test.ts b/tests/use-clipboard-text.test.ts new file mode 100644 index 0000000..3ca55ba --- /dev/null +++ b/tests/use-clipboard-text.test.ts @@ -0,0 +1,155 @@ +import { act, fireEvent, renderHook, waitFor } from "@testing-library/react"; +import { useClipboardText } from "src"; + +const mockReadText = vi.fn(); +const mockWriteText = vi.fn(); + +beforeAll(() => { + vi.stubGlobal("navigator", { + clipboard: { + readText: mockReadText, + writeText: mockWriteText, + }, + }); +}); + +afterEach(() => { + vi.clearAllMocks(); +}); + +afterAll(() => { + vi.restoreAllMocks(); + vi.unstubAllGlobals(); +}); + +it("reads clipboard on mount by default", async () => { + mockReadText.mockResolvedValueOnce("hello"); + + const { result } = renderHook(() => useClipboardText()); + + await waitFor(() => expect(result.current.text).toEqual("hello")); + expect(result.current.error).toEqual(null); + expect(mockReadText).toHaveBeenCalledTimes(1); +}); + +it("can disable read on mount", async () => { + const { result } = renderHook(() => useClipboardText({ readOnMount: false })); + + expect(result.current.text).toEqual(""); + expect(result.current.error).toEqual(null); + expect(mockReadText).toHaveBeenCalledTimes(0); +}); + +it("responds to dynamic `readOnMount`", async () => { + mockReadText.mockResolvedValueOnce("hello"); + + const { result, rerender } = renderHook( + (readOnMount) => useClipboardText({ readOnMount }), + { initialProps: false }, + ); + + expect(result.current.text).toEqual(""); + expect(result.current.error).toEqual(null); + expect(mockReadText).toHaveBeenCalledTimes(0); + + rerender(true); + + await waitFor(() => expect(result.current.text).toEqual("hello")); + expect(result.current.error).toEqual(null); + expect(mockReadText).toHaveBeenCalledTimes(1); +}); + +it("provides `write` function to manually write", async () => { + mockReadText.mockResolvedValueOnce("hello"); + mockWriteText.mockResolvedValueOnce(void 0); + + const { result } = renderHook(() => useClipboardText()); + + await waitFor(() => expect(result.current.text).toEqual("hello")); + expect(result.current.error).toEqual(null); + expect(mockWriteText).toHaveBeenCalledTimes(0); + + await act(async () => await result.current.write("world")); + + await waitFor(() => expect(result.current.text).toEqual("world")); + expect(result.current.error).toEqual(null); + expect(mockWriteText).toHaveBeenCalledTimes(1); +}); + +it("returns error if `write` fails", async () => { + mockReadText.mockResolvedValueOnce("hello"); + mockWriteText.mockRejectedValueOnce(new Error("test")); + + const { result } = renderHook(() => useClipboardText()); + + await waitFor(() => expect(result.current.text).toEqual("hello")); + expect(result.current.error).toEqual(null); + expect(mockWriteText).toHaveBeenCalledTimes(0); + + await act(async () => await result.current.write("world")); + + await waitFor(() => expect(result.current.error).toEqual(new Error("test"))); + expect(result.current.text).toEqual("hello"); + expect(mockWriteText).toHaveBeenCalledTimes(1); +}); + +it("listens to cut events", async () => { + mockReadText.mockResolvedValueOnce("hello").mockResolvedValueOnce("world"); + + const { result } = renderHook(() => useClipboardText()); + + await waitFor(() => expect(result.current.text).toEqual("hello")); + expect(result.current.error).toEqual(null); + expect(mockReadText).toHaveBeenCalledTimes(1); + + fireEvent.cut(document); + + await waitFor(() => expect(result.current.text).toEqual("world")); + expect(result.current.error).toEqual(null); + expect(mockReadText).toHaveBeenCalledTimes(2); +}); + +it("listens to copy events", async () => { + mockReadText.mockResolvedValueOnce("hello").mockResolvedValueOnce("world"); + + const { result } = renderHook(() => useClipboardText()); + + await waitFor(() => expect(result.current.text).toEqual("hello")); + expect(result.current.error).toEqual(null); + expect(mockReadText).toHaveBeenCalledTimes(1); + + fireEvent.copy(document); + + await waitFor(() => expect(result.current.text).toEqual("world")); + expect(result.current.error).toEqual(null); + expect(mockReadText).toHaveBeenCalledTimes(2); +}); + +it("recovers from error after any successful read", async () => { + mockReadText + .mockRejectedValueOnce(new Error("error")) + .mockResolvedValueOnce("world"); + + const { result } = renderHook(() => useClipboardText()); + + await waitFor(() => expect(result.current.error).toEqual(new Error("error"))); + + fireEvent.copy(document); + + await waitFor(() => expect(result.current.text).toEqual("world")); + expect(result.current.error).toEqual(null); +}); + +it("recovers from error after any successful write", async () => { + mockReadText.mockRejectedValueOnce(new Error("error")); + mockWriteText.mockResolvedValueOnce(void 0); + + const { result } = renderHook(() => useClipboardText()); + + await waitFor(() => expect(result.current.error).toEqual(new Error("error"))); + + await act(async () => await result.current.write("world")); + + await waitFor(() => expect(result.current.text).toEqual("world")); + expect(result.current.error).toEqual(null); +}); diff --git a/packages/hooks/tests/use-const-fn.test.ts b/tests/use-const-fn.test.ts similarity index 59% rename from packages/hooks/tests/use-const-fn.test.ts rename to tests/use-const-fn.test.ts index 7853805..fa6f98d 100644 --- a/packages/hooks/tests/use-const-fn.test.ts +++ b/tests/use-const-fn.test.ts @@ -1,17 +1,14 @@ import { renderHook } from "@testing-library/react"; import { useConstFn } from "src"; -it("remembers the function", () => { - const { result } = renderHook(() => useConstFn(() => 1)); - expect(result.current()).toEqual(1); -}); - -it("stays the same across re-renders", () => { +it("memoizes the function across re-renders", () => { const fn = vi.fn(); const { result, rerender } = renderHook(() => useConstFn(fn)); + expect(result.current).toEqual(fn); rerender(); + expect(result.current).toEqual(fn); }); diff --git a/tests/use-const.test.ts b/tests/use-const.test.ts new file mode 100644 index 0000000..bd4cc58 --- /dev/null +++ b/tests/use-const.test.ts @@ -0,0 +1,16 @@ +import { renderHook } from "@testing-library/react"; +import { useConst } from "src"; + +it("memoizes the value across re-renders", () => { + const compute = vi.fn(() => 1); + + const { result, rerender } = renderHook(() => useConst(compute)); + + expect(result.current).toEqual(1); + expect(compute).toHaveBeenCalledTimes(1); + + rerender(); + + expect(result.current).toEqual(1); + expect(compute).toHaveBeenCalledTimes(1); +}); diff --git a/packages/hooks/tests/use-counter.test.ts b/tests/use-counter.test.ts similarity index 92% rename from packages/hooks/tests/use-counter.test.ts rename to tests/use-counter.test.ts index 1b6be35..6f45f2d 100644 --- a/packages/hooks/tests/use-counter.test.ts +++ b/tests/use-counter.test.ts @@ -3,66 +3,83 @@ import { useCounter } from "src"; it("defaults to 0", () => { const { result } = renderHook(() => useCounter()); + expect(result.current.count).toEqual(0); }); -it("can customize default value", () => { +it("can customize initial value", () => { const { result } = renderHook(() => useCounter(1)); + expect(result.current.count).toEqual(1); }); it("can set value", () => { const { result } = renderHook(() => useCounter()); + expect(result.current.count).toEqual(0); act(() => result.current.set(1)); + expect(result.current.count).toEqual(1); act(() => result.current.set(-1)); + expect(result.current.count).toEqual(-1); }); it("can increment value by 1", () => { const { result } = renderHook(() => useCounter()); + expect(result.current.count).toEqual(0); act(() => result.current.increment()); + expect(result.current.count).toEqual(1); act(() => result.current.increment()); + expect(result.current.count).toEqual(2); }); -it("can increment value by any number", () => { +it("can increment value by arbitrary number", () => { const { result } = renderHook(() => useCounter()); + expect(result.current.count).toEqual(0); act(() => result.current.incrementBy(2)); + expect(result.current.count).toEqual(2); act(() => result.current.incrementBy(2)); + expect(result.current.count).toEqual(4); }); it("can decrement value by 1", () => { const { result } = renderHook(() => useCounter()); + expect(result.current.count).toEqual(0); act(() => result.current.decrement()); + expect(result.current.count).toEqual(-1); act(() => result.current.decrement()); + expect(result.current.count).toEqual(-2); }); -it("can decrement value by any number", () => { +it("can decrement value by arbitrary number", () => { const { result } = renderHook(() => useCounter()); + expect(result.current.count).toEqual(0); act(() => result.current.decrementBy(2)); + expect(result.current.count).toEqual(-2); act(() => result.current.decrementBy(2)); + expect(result.current.count).toEqual(-4); }); diff --git a/packages/hooks/tests/use-debounce-effect.test.ts b/tests/use-debounce-effect.test.ts similarity index 58% rename from packages/hooks/tests/use-debounce-effect.test.ts rename to tests/use-debounce-effect.test.ts index f0fcaf4..3a79419 100644 --- a/packages/hooks/tests/use-debounce-effect.test.ts +++ b/tests/use-debounce-effect.test.ts @@ -4,20 +4,27 @@ import { useDebounceEffect } from "src"; beforeAll(() => { vi.useFakeTimers(); }); -afterAll(() => { - vi.useRealTimers(); -}); + afterEach(() => { vi.clearAllTimers(); }); -it("triggers effect only once after continuous updates", () => { +afterAll(() => { + vi.useRealTimers(); +}); + +it("triggers effect only once after multiple updates", () => { const effect = vi.fn(); const { rerender } = renderHook( (count) => useDebounceEffect(effect, [count]), - { initialProps: 0 } + { initialProps: 0 }, ); + + expect(effect).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(500); + expect(effect).toHaveBeenCalledTimes(0); rerender(1); @@ -26,9 +33,11 @@ it("triggers effect only once after continuous updates", () => { vi.advanceTimersByTime(499); rerender(3); vi.advanceTimersByTime(499); + expect(effect).toHaveBeenCalledTimes(0); vi.advanceTimersByTime(1); + expect(effect).toHaveBeenCalledTimes(1); }); @@ -37,8 +46,13 @@ it("can customize timeout", () => { const { rerender } = renderHook( (count) => useDebounceEffect(effect, [count], { timeout: 100 }), - { initialProps: 0 } + { initialProps: 0 }, ); + + expect(effect).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(100); + expect(effect).toHaveBeenCalledTimes(0); rerender(1); @@ -47,21 +61,56 @@ it("can customize timeout", () => { vi.advanceTimersByTime(99); rerender(3); vi.advanceTimersByTime(99); + + expect(effect).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(1); + + expect(effect).toHaveBeenCalledTimes(1); +}); + +it("responds to dynamic `timeout`", () => { + const effect = vi.fn(); + + const { rerender } = renderHook( + ({ count, timeout }) => useDebounceEffect(effect, [count], { timeout }), + { initialProps: { count: 0, timeout: 500 } }, + ); + + expect(effect).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(500); + expect(effect).toHaveBeenCalledTimes(0); + rerender({ count: 1, timeout: 500 }); + vi.advanceTimersByTime(499); + rerender({ count: 1, timeout: 100 }); vi.advanceTimersByTime(1); + + expect(effect).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(98); + + expect(effect).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(1); + expect(effect).toHaveBeenCalledTimes(1); }); -it("can start timing on mount", () => { +it("can run on mount", () => { const effect = vi.fn(); renderHook(() => useDebounceEffect(effect, [], { onMount: true })); + expect(effect).toHaveBeenCalledTimes(0); vi.advanceTimersByTime(499); + expect(effect).toHaveBeenCalledTimes(0); vi.advanceTimersByTime(1); + expect(effect).toHaveBeenCalledTimes(1); }); diff --git a/packages/hooks/tests/use-debounce.test.ts b/tests/use-debounce.test.ts similarity index 51% rename from packages/hooks/tests/use-debounce.test.ts rename to tests/use-debounce.test.ts index 3ea9666..0596c35 100644 --- a/packages/hooks/tests/use-debounce.test.ts +++ b/tests/use-debounce.test.ts @@ -4,17 +4,24 @@ import { useDebounce } from "src"; beforeAll(() => { vi.useFakeTimers(); }); -afterAll(() => { - vi.useRealTimers(); -}); + afterEach(() => { vi.clearAllTimers(); }); -it("updates value only once after continuous updates", () => { +afterAll(() => { + vi.useRealTimers(); +}); + +it("updates value only once after multiple updates", () => { const { result, rerender } = renderHook((count) => useDebounce(count), { initialProps: 0, }); + + expect(result.current).toEqual(0); + + vi.advanceTimersByTime(500); + expect(result.current).toEqual(0); rerender(1); @@ -23,19 +30,24 @@ it("updates value only once after continuous updates", () => { vi.advanceTimersByTime(499); rerender(3); vi.advanceTimersByTime(499); + expect(result.current).toEqual(0); - act(() => { - vi.advanceTimersByTime(1); - }); + act(() => vi.advanceTimersByTime(1)); + expect(result.current).toEqual(3); }); it("can customize timeout", () => { const { result, rerender } = renderHook( (count) => useDebounce(count, { timeout: 100 }), - { initialProps: 0 } + { initialProps: 0 }, ); + + expect(result.current).toEqual(0); + + vi.advanceTimersByTime(100); + expect(result.current).toEqual(0); rerender(1); @@ -44,26 +56,55 @@ it("can customize timeout", () => { vi.advanceTimersByTime(99); rerender(3); vi.advanceTimersByTime(99); + expect(result.current).toEqual(0); - act(() => { - vi.advanceTimersByTime(1); - }); + act(() => vi.advanceTimersByTime(1)); + expect(result.current).toEqual(3); }); -it("can start timing on mount", () => { +it("responds to dynamic `timeout`", () => { + const { result, rerender } = renderHook( + ({ count, timeout }) => useDebounce(count, { timeout }), + { initialProps: { count: 0, timeout: 500 } }, + ); + + expect(result.current).toEqual(0); + + vi.advanceTimersByTime(500); + + expect(result.current).toEqual(0); + + rerender({ count: 1, timeout: 500 }); + vi.advanceTimersByTime(499); + rerender({ count: 1, timeout: 100 }); + vi.advanceTimersByTime(1); + + expect(result.current).toEqual(0); + + vi.advanceTimersByTime(98); + + expect(result.current).toEqual(0); + + act(() => vi.advanceTimersByTime(1)); + + expect(result.current).toEqual(1); +}); + +it("can run on mount", () => { const { result } = renderHook( - (count) => useDebounce(count, { timeout: 100 }), - { initialProps: 0 } + (count) => useDebounce(count, { onMount: true }), + { initialProps: 0 }, ); + expect(result.current).toEqual(0); vi.advanceTimersByTime(499); + expect(result.current).toEqual(0); - act(() => { - vi.advanceTimersByTime(1); - }); + act(() => vi.advanceTimersByTime(1)); + expect(result.current).toEqual(0); }); diff --git a/packages/hooks/tests/use-document.test.ts b/tests/use-document.test.ts similarity index 99% rename from packages/hooks/tests/use-document.test.ts rename to tests/use-document.test.ts index 7a1d98d..d6e108e 100644 --- a/packages/hooks/tests/use-document.test.ts +++ b/tests/use-document.test.ts @@ -3,5 +3,6 @@ import { useDocument } from "src"; it("returns document", () => { const { result } = renderHook(() => useDocument()); + expect(result.current.current).toEqual(document); }); diff --git a/tests/use-element-size.test.ts b/tests/use-element-size.test.ts new file mode 100644 index 0000000..54a0c18 --- /dev/null +++ b/tests/use-element-size.test.ts @@ -0,0 +1,61 @@ +import { renderHook, screen } from "@testing-library/react"; +import { useElementSize } from "src"; + +const mockClientWidth = vi.spyOn( + window.Element.prototype, + "clientWidth", + "get", +); +const mockClientHeight = vi.spyOn( + window.Element.prototype, + "clientHeight", + "get", +); + +beforeAll(() => { + document.body.innerHTML = ` +
+ `; + + vi.stubGlobal( + "ResizeObserver", + class { + constructor(private callback: ResizeObserverCallback) {} + + observe(target: Element) { + this.callback([{ target } as ResizeObserverEntry], this); + } + + disconnect() {} + unobserve() {} + }, + ); +}); + +afterEach(() => { + vi.clearAllMocks(); +}); + +afterAll(() => { + vi.restoreAllMocks(); + vi.unstubAllGlobals(); +}); + +it("reads the size of element", () => { + mockClientWidth + .mockReturnValueOnce(200) + .mockReturnValueOnce(200) + .mockReturnValueOnce(200); + mockClientHeight + .mockReturnValueOnce(100) + .mockReturnValueOnce(100) + .mockReturnValueOnce(100); + const target = screen.getByTestId("target"); + + const { result } = renderHook(() => useElementSize({ current: target })); + + expect(result.current.width).toEqual(200); + expect(result.current.height).toEqual(100); +}); + +it.todo("listens to resize events", () => {}); diff --git a/tests/use-event-listener.test.ts b/tests/use-event-listener.test.ts new file mode 100644 index 0000000..dfdb8a5 --- /dev/null +++ b/tests/use-event-listener.test.ts @@ -0,0 +1,212 @@ +import { renderHook, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { useEventListener } from "src"; + +beforeAll(() => { + document.body.innerHTML = ` +
+ `; +}); + +it("listens to element events", async () => { + const user = userEvent.setup(); + const target = screen.getByTestId("target"); + const callback = vi.fn(); + + renderHook(() => useEventListener({ current: target }, "click", callback)); + + expect(callback).toHaveBeenCalledTimes(0); + + await user.click(target); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenLastCalledWith(expect.any(MouseEvent), target); + + await user.click(target); + + expect(callback).toHaveBeenCalledTimes(2); + expect(callback).toHaveBeenLastCalledWith(expect.any(MouseEvent), target); +}); + +it("listens to document events", async () => { + const user = userEvent.setup(); + const callback = vi.fn(); + + renderHook(() => useEventListener({ current: document }, "click", callback)); + + expect(callback).toHaveBeenCalledTimes(0); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenLastCalledWith(expect.any(MouseEvent), document); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(2); + expect(callback).toHaveBeenLastCalledWith(expect.any(MouseEvent), document); +}); + +it("responds to dynamic `type`", async () => { + const user = userEvent.setup(); + const callback = vi.fn(); + + const { rerender } = renderHook( + (type) => useEventListener({ current: document }, type, callback), + { initialProps: "click" as keyof DocumentEventMap }, + ); + + expect(callback).toHaveBeenCalledTimes(0); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenLastCalledWith(expect.any(MouseEvent), document); + + rerender("keydown"); + + expect(callback).toHaveBeenCalledTimes(1); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(1); + + await user.tab(); + + expect(callback).toHaveBeenCalledTimes(2); + expect(callback).toHaveBeenLastCalledWith( + expect.any(KeyboardEvent), + document, + ); +}); + +it("responds to dynamic `capture`", async () => { + const user = userEvent.setup(); + const target = screen.getByTestId("target"); + const callOrder: string[] = []; + const documentCallback = vi.fn(() => callOrder.push("document")); + const targetCallback = vi.fn(() => callOrder.push("target")); + + renderHook(() => + useEventListener({ current: target }, "click", targetCallback), + ); + const { rerender } = renderHook( + (capture) => + useEventListener({ current: document }, "click", documentCallback, { + capture, + }), + { initialProps: false }, + ); + + expect(documentCallback).toHaveBeenCalledTimes(0); + expect(targetCallback).toHaveBeenCalledTimes(0); + expect(callOrder).toEqual([]); + + await user.click(target); + + expect(documentCallback).toHaveBeenCalledTimes(1); + expect(targetCallback).toHaveBeenCalledTimes(1); + expect(callOrder).toEqual(["target", "document"]); + + rerender(true); + + expect(documentCallback).toHaveBeenCalledTimes(1); + expect(targetCallback).toHaveBeenCalledTimes(1); + expect(callOrder).toEqual(["target", "document"]); + + await user.click(target); + + expect(documentCallback).toHaveBeenCalledTimes(2); + expect(targetCallback).toHaveBeenCalledTimes(2); + expect(callOrder).toEqual(["target", "document", "document", "target"]); +}); + +it("responds to dynamic `passive`", async () => { + const user = userEvent.setup(); + const callback = vi.fn((event: MouseEvent) => event.preventDefault()); + + const { rerender } = renderHook( + (passive) => + useEventListener({ current: document }, "click", callback, { passive }), + { initialProps: false }, + ); + + expect(callback).toHaveBeenCalledTimes(0); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(1); + + rerender(true); + + expect(callback).toHaveBeenCalledTimes(1); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(2); + expect(callback).toThrow(); +}); + +it("responds to dynamic `once`", async () => { + const user = userEvent.setup(); + const callback = vi.fn(); + + const { rerender } = renderHook( + (once) => + useEventListener({ current: document }, "click", callback, { once }), + { initialProps: true }, + ); + + expect(callback).toHaveBeenCalledTimes(0); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(1); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(1); + + rerender(false); + + expect(callback).toHaveBeenCalledTimes(1); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(2); +}); + +it("responds to dynamic `extraDeps`", async () => { + const user = userEvent.setup(); + const history: number[] = []; + const callback = vi.fn((numbers: number[]) => history.push(...numbers)); + + const { rerender } = renderHook( + (extraDeps) => + useEventListener( + { current: document }, + "click", + () => callback(extraDeps), + { extraDeps }, + ), + { initialProps: [1, 2] }, + ); + + expect(callback).toHaveBeenCalledTimes(0); + expect(history).toEqual([]); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(1); + expect(history).toEqual([1, 2]); + + rerender([1, 3]); + + expect(callback).toHaveBeenCalledTimes(1); + expect(history).toEqual([1, 2]); + + await user.click(document.body); + + expect(callback).toHaveBeenCalledTimes(2); + expect(history).toEqual([1, 2, 1, 3]); +}); diff --git a/tests/use-focus-trap.test.ts b/tests/use-focus-trap.test.ts new file mode 100644 index 0000000..d7e4ac9 --- /dev/null +++ b/tests/use-focus-trap.test.ts @@ -0,0 +1,74 @@ +import { renderHook, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { useFocusTrap } from "src"; + +beforeAll(() => { + document.body.innerHTML = ` + + + + `; +}); + +it("traps the focus", async () => { + const user = userEvent.setup(); + const first = screen.getByTestId("first"); + const middle = screen.getByTestId("middle"); + const last = screen.getByTestId("last"); + first.focus(); + + renderHook(() => useFocusTrap({ current: first }, { current: last })); + + expect(document.activeElement).toEqual(first); + + await user.tab(); + + expect(document.activeElement).toEqual(middle); + + await user.tab(); + + expect(document.activeElement).toEqual(last); + + await user.tab(); + + expect(document.activeElement).toEqual(first); + + await user.tab({ shift: true }); + + expect(document.activeElement).toEqual(last); + + await user.tab({ shift: true }); + + expect(document.activeElement).toEqual(middle); + + await user.tab({ shift: true }); + + expect(document.activeElement).toEqual(first); +}); + +it("responds to dynamic `ref`", async () => { + const user = userEvent.setup(); + const first = screen.getByTestId("first"); + const middle = screen.getByTestId("middle"); + const last = screen.getByTestId("last"); + first.focus(); + + const { rerender } = renderHook( + ({ first, last }) => useFocusTrap({ current: first }, { current: last }), + { initialProps: { first, last } }, + ); + + expect(document.activeElement).toEqual(first); + + await user.tab({ shift: true }); + + expect(document.activeElement).toEqual(last); + + rerender({ first: middle, last }); + + expect(document.activeElement).toEqual(last); + + await user.tab(); + + expect(document.activeElement).toEqual(middle); +}); diff --git a/tests/use-hover.test.ts b/tests/use-hover.test.ts new file mode 100644 index 0000000..fc6656a --- /dev/null +++ b/tests/use-hover.test.ts @@ -0,0 +1,26 @@ +import { renderHook, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { useHover } from "src"; + +beforeAll(() => { + document.body.innerHTML = ` +
+ `; +}); + +it("listens to hover events", async () => { + const user = userEvent.setup(); + const target = screen.getByTestId("target"); + + const { result } = renderHook(() => useHover({ current: target })); + + expect(result.current).toEqual(false); + + await user.hover(target); + + expect(result.current).toEqual(true); + + await user.unhover(target); + + expect(result.current).toEqual(false); +}); diff --git a/tests/use-interval.test.ts b/tests/use-interval.test.ts new file mode 100644 index 0000000..9637bba --- /dev/null +++ b/tests/use-interval.test.ts @@ -0,0 +1,92 @@ +import { renderHook } from "@testing-library/react"; +import { useInterval } from "src"; + +beforeAll(() => { + vi.useFakeTimers(); +}); + +afterEach(() => { + vi.clearAllTimers(); +}); + +afterAll(() => { + vi.useRealTimers(); +}); + +it("runs function after every interval", () => { + const fn = vi.fn(); + + renderHook(() => useInterval(fn)); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(499); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(1); + + expect(fn).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(499); + + expect(fn).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(1); + + expect(fn).toHaveBeenCalledTimes(2); +}); + +it("can customize timeout", () => { + const fn = vi.fn(); + + renderHook(() => useInterval(fn, 100)); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(99); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(1); + + expect(fn).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(99); + + expect(fn).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(1); + + expect(fn).toHaveBeenCalledTimes(2); +}); + +it("responds to dynamic `timeout`", () => { + const fn = vi.fn(); + + const { rerender } = renderHook((timeout) => useInterval(fn, timeout), { + initialProps: 100, + }); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(99); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(1); + + expect(fn).toHaveBeenCalledTimes(1); + + rerender(200); + + expect(fn).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(199); + + expect(fn).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(1); + + expect(fn).toHaveBeenCalledTimes(2); +}); diff --git a/tests/use-is-mounted.test.ts b/tests/use-is-mounted.test.ts new file mode 100644 index 0000000..1cb63ea --- /dev/null +++ b/tests/use-is-mounted.test.ts @@ -0,0 +1,16 @@ +import { renderHook } from "@testing-library/react"; +import { useIsMounted } from "src"; + +it("returns mount status", () => { + const { result, rerender, unmount } = renderHook(() => useIsMounted()); + + expect(result.current.current).toEqual(true); + + rerender(); + + expect(result.current.current).toEqual(true); + + unmount(); + + expect(result.current.current).toEqual(false); +}); diff --git a/tests/use-keydown.test.ts b/tests/use-keydown.test.ts new file mode 100644 index 0000000..c2d48dc --- /dev/null +++ b/tests/use-keydown.test.ts @@ -0,0 +1,121 @@ +import { renderHook } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { useKeydown } from "src"; + +it("listens to keydown events", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + + renderHook(() => useKeydown("Enter", fn)); + + expect(fn).toHaveBeenCalledTimes(0); + + await user.keyboard("[Enter]"); + + expect(fn).toHaveBeenCalledTimes(1); + + await user.keyboard("[Tab]"); + + expect(fn).toHaveBeenCalledTimes(1); +}); + +it("can customize modifier keys", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + + renderHook(() => useKeydown("Enter", fn, { ctrl: true, shift: true })); + + expect(fn).toHaveBeenCalledTimes(0); + + await user.keyboard("[Enter]"); + + expect(fn).toHaveBeenCalledTimes(0); + + await user.keyboard("[ControlLeft>][Enter][/ControlLeft]"); + + expect(fn).toHaveBeenCalledTimes(0); + + await user.keyboard("[ShiftLeft>][Enter][/ShiftLeft]"); + + expect(fn).toHaveBeenCalledTimes(0); + + await user.keyboard( + "[ControlLeft>][ShiftLeft>][Enter][/ShiftLeft][/ControlLeft]", + ); + + expect(fn).toHaveBeenCalledTimes(1); + + await user.keyboard( + "[ControlRight>][ShiftRight>][Enter][/ShiftRight][/ControlRight]", + ); + + expect(fn).toHaveBeenCalledTimes(2); + + await user.keyboard( + "[ControlLeft>][ShiftLeft>][AltLeft>][Enter][/AltLeft][/ShiftLeft][/ControlLeft]", + ); + + expect(fn).toHaveBeenCalledTimes(2); +}); + +it("responds to dynamic `key`", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + + const { rerender } = renderHook((code) => useKeydown(code, fn), { + initialProps: "Enter", + }); + + expect(fn).toHaveBeenCalledTimes(0); + + await user.keyboard("[Enter]"); + + expect(fn).toHaveBeenCalledTimes(1); + + await user.keyboard("[Tab]"); + + expect(fn).toHaveBeenCalledTimes(1); + + rerender("Tab"); + + expect(fn).toHaveBeenCalledTimes(1); + + await user.keyboard("[Enter]"); + + expect(fn).toHaveBeenCalledTimes(1); + + await user.keyboard("[Tab]"); + + expect(fn).toHaveBeenCalledTimes(2); +}); + +it("responds to dynamic `modifierKeys`", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + + const { rerender } = renderHook((ctrl) => useKeydown("Enter", fn, { ctrl }), { + initialProps: false, + }); + + expect(fn).toHaveBeenCalledTimes(0); + + await user.keyboard("[Enter]"); + + expect(fn).toHaveBeenCalledTimes(1); + + await user.keyboard("[ControlLeft>][Enter][/ControlLeft]"); + + expect(fn).toHaveBeenCalledTimes(1); + + rerender(true); + + expect(fn).toHaveBeenCalledTimes(1); + + await user.keyboard("[Enter]"); + + expect(fn).toHaveBeenCalledTimes(1); + + await user.keyboard("[ControlLeft>][Enter][/ControlLeft]"); + + expect(fn).toHaveBeenCalledTimes(2); +}); diff --git a/packages/hooks/tests/use-latest.test.ts b/tests/use-latest.test.ts similarity index 99% rename from packages/hooks/tests/use-latest.test.ts rename to tests/use-latest.test.ts index 53de13f..37b8101 100644 --- a/packages/hooks/tests/use-latest.test.ts +++ b/tests/use-latest.test.ts @@ -5,12 +5,15 @@ it("returns latest primitive", () => { const { result, rerender } = renderHook((count) => useLatest(count), { initialProps: 0, }); + expect(result.current.current).toEqual(0); rerender(1); + expect(result.current.current).toEqual(1); rerender(2); + expect(result.current.current).toEqual(2); }); @@ -18,12 +21,15 @@ it("returns latest object", () => { const { result, rerender } = renderHook((obj) => useLatest(obj), { initialProps: { a: 1 }, }); + expect(result.current.current).toEqual({ a: 1 }); rerender({ a: 2 }); + expect(result.current.current).toEqual({ a: 2 }); rerender({ a: 3 }); + expect(result.current.current).toEqual({ a: 3 }); }); @@ -31,11 +37,14 @@ it("returns latest function", () => { const { result, rerender } = renderHook((fn) => useLatest(fn), { initialProps: () => 1 as number, }); + expect(result.current.current()).toEqual(1); rerender(() => 2); + expect(result.current.current()).toEqual(2); rerender(() => 3); + expect(result.current.current()).toEqual(3); }); diff --git a/tests/use-local-storage.test.ts b/tests/use-local-storage.test.ts new file mode 100644 index 0000000..53a0df6 --- /dev/null +++ b/tests/use-local-storage.test.ts @@ -0,0 +1,167 @@ +import { act, renderHook } from "@testing-library/react"; +import { useLocalStorage } from "src"; + +const mockGetItem = vi.spyOn(Storage.prototype, "getItem"); +const mockSetItem = vi.spyOn(Storage.prototype, "setItem"); +const mockRemoveItem = vi.spyOn(Storage.prototype, "removeItem"); + +afterEach(() => { + localStorage.clear(); + vi.clearAllMocks(); +}); + +afterAll(() => { + vi.restoreAllMocks(); +}); + +it("returns `null` if there is no stored value", () => { + const { result } = renderHook(() => useLocalStorage("test")); + + expect(result.current.value).toEqual(null); + expect(localStorage.getItem("test")).toEqual(null); +}); + +it("returns stored value if there is stored value", () => { + localStorage.setItem("test", "1"); + + const { result } = renderHook(() => useLocalStorage("test")); + + expect(result.current.value).toEqual(1); + expect(localStorage.getItem("test")).toEqual("1"); +}); + +it("responds to dynamic `key`", () => { + localStorage.setItem("test1", "1"); + + const { result, rerender } = renderHook((key) => useLocalStorage(key), { + initialProps: "test1", + }); + + expect(result.current.value).toEqual(1); + expect(localStorage.getItem("test1")).toEqual("1"); + + rerender("test2"); + + expect(result.current.value).toEqual(null); + expect(localStorage.getItem("test2")).toEqual(null); +}); + +it("can set value with a value", () => { + const { result } = renderHook(() => useLocalStorage("test")); + + expect(result.current.value).toEqual(null); + expect(localStorage.getItem("test")).toEqual(null); + + act(() => result.current.set(1)); + + expect(result.current.value).toEqual(1); + expect(localStorage.getItem("test")).toEqual("1"); + + act(() => result.current.set(2)); + + expect(result.current.value).toEqual(2); + expect(localStorage.getItem("test")).toEqual("2"); +}); + +it("can set value with a function", () => { + const { result } = renderHook(() => useLocalStorage("test")); + + expect(result.current.value).toEqual(null); + expect(localStorage.getItem("test")).toEqual(null); + + act(() => result.current.set((prev: number) => (prev ?? 0) + 1)); + + expect(result.current.value).toEqual(1); + expect(localStorage.getItem("test")).toEqual("1"); + + act(() => result.current.set((prev: number) => (prev ?? 0) + 1)); + + expect(result.current.value).toEqual(2); + expect(localStorage.getItem("test")).toEqual("2"); +}); + +it("can remove value", () => { + localStorage.setItem("test", "1"); + + const { result } = renderHook(() => useLocalStorage("test")); + + expect(result.current.value).toEqual(1); + expect(localStorage.getItem("test")).toEqual("1"); + + act(() => result.current.remove()); + + expect(result.current.value).toEqual(null); + expect(localStorage.getItem("test")).toEqual(null); + + act(() => result.current.remove()); + + expect(result.current.value).toEqual(null); + expect(localStorage.getItem("test")).toEqual(null); +}); + +it("can customize `serializer` and `deserializer`", () => { + const { result } = renderHook(() => + useLocalStorage("test", { + serializer: (value) => String(value + 1), + deserializer: (value) => Number(value) - 1, + }), + ); + + expect(result.current.value).toEqual(null); + expect(localStorage.getItem("test")).toEqual(null); + + act(() => result.current.set(1)); + + expect(result.current.value).toEqual(1); + expect(localStorage.getItem("test")).toEqual("2"); + + act(() => result.current.set(2)); + + expect(result.current.value).toEqual(2); + expect(localStorage.getItem("test")).toEqual("3"); +}); + +it("returns `null` if `localStorage.getItem` throws an error", () => { + localStorage.setItem("test", "1"); + mockGetItem.mockImplementationOnce(() => { + throw new Error("test"); + }); + + const { result } = renderHook(() => useLocalStorage("test")); + + expect(result.current.value).toEqual(null); + expect(localStorage.getItem("test")).toEqual("1"); +}); + +it("does not set value if `localStorage.setItem` throws an error", () => { + mockSetItem.mockImplementationOnce(() => { + throw new Error("test"); + }); + + const { result } = renderHook(() => useLocalStorage("test")); + + expect(result.current.value).toEqual(null); + expect(localStorage.getItem("test")).toEqual(null); + + act(() => result.current.set(1)); + + expect(result.current.value).toEqual(null); + expect(localStorage.getItem("test")).toEqual(null); +}); + +it("does not remove value if `localStorage.removeItem` throws an error", () => { + localStorage.setItem("test", "1"); + mockRemoveItem.mockImplementationOnce(() => { + throw new Error("test"); + }); + + const { result } = renderHook(() => useLocalStorage("test")); + + expect(result.current.value).toEqual(1); + expect(localStorage.getItem("test")).toEqual("1"); + + act(() => result.current.remove()); + + expect(result.current.value).toEqual(1); + expect(localStorage.getItem("test")).toEqual("1"); +}); diff --git a/tests/use-media-query.test.ts b/tests/use-media-query.test.ts new file mode 100644 index 0000000..bc68ba0 --- /dev/null +++ b/tests/use-media-query.test.ts @@ -0,0 +1,55 @@ +import { renderHook } from "@testing-library/react"; +import { useMediaQuery } from "src"; + +const mockMatchMedia = vi.fn(); + +const commonReturnValue = { + addEventListener: () => {}, + removeEventListener: () => {}, +}; + +beforeAll(() => { + window.innerWidth = 1024; + vi.stubGlobal("matchMedia", mockMatchMedia); +}); + +afterEach(() => { + vi.clearAllMocks(); +}); + +afterAll(() => { + vi.unstubAllGlobals(); + vi.restoreAllMocks(); +}); + +it("returns `true` if matched", () => { + mockMatchMedia.mockReturnValueOnce({ matches: true, ...commonReturnValue }); + + const { result } = renderHook(() => useMediaQuery("(max-width: 1280px)")); + + expect(result.current).toEqual(true); +}); + +it("returns `false` if not matched", () => { + mockMatchMedia.mockReturnValueOnce({ matches: false, ...commonReturnValue }); + + const { result } = renderHook(() => useMediaQuery("(max-width: 640px)")); + + expect(result.current).toEqual(false); +}); + +it("responds to dynamic `query`", () => { + mockMatchMedia.mockReturnValueOnce({ matches: true, ...commonReturnValue }); + + const { result, rerender } = renderHook((query) => useMediaQuery(query), { + initialProps: "max-width: 1280px", + }); + + expect(result.current).toEqual(true); + + mockMatchMedia.mockReturnValueOnce({ matches: false, ...commonReturnValue }); + + rerender("max-width: 640px"); + + expect(result.current).toEqual(false); +}); diff --git a/packages/hooks/tests/use-mount.test.ts b/tests/use-mount.test.ts similarity index 78% rename from packages/hooks/tests/use-mount.test.ts rename to tests/use-mount.test.ts index e263cae..b795cac 100644 --- a/packages/hooks/tests/use-mount.test.ts +++ b/tests/use-mount.test.ts @@ -1,19 +1,27 @@ import { renderHook } from "@testing-library/react"; import { useMount } from "src"; -it("only runs on mount", () => { +it("runs only on mount", () => { const cleanup = vi.fn(); const effect = vi.fn(() => cleanup); const { rerender, unmount } = renderHook(() => useMount(effect)); + + expect(effect).toHaveBeenCalledTimes(1); + expect(cleanup).toHaveBeenCalledTimes(0); + + rerender(); + expect(effect).toHaveBeenCalledTimes(1); expect(cleanup).toHaveBeenCalledTimes(0); rerender(); + expect(effect).toHaveBeenCalledTimes(1); expect(cleanup).toHaveBeenCalledTimes(0); unmount(); + expect(effect).toHaveBeenCalledTimes(1); expect(cleanup).toHaveBeenCalledTimes(1); }); diff --git a/packages/hooks/tests/use-previous.test.ts b/tests/use-previous.test.ts similarity index 60% rename from packages/hooks/tests/use-previous.test.ts rename to tests/use-previous.test.ts index 7fc9146..3912bbc 100644 --- a/packages/hooks/tests/use-previous.test.ts +++ b/tests/use-previous.test.ts @@ -1,29 +1,35 @@ import { renderHook } from "@testing-library/react"; import { usePrevious } from "src"; -it("stores previous state", () => { +it("returns previous state", () => { const { result, rerender } = renderHook((count) => usePrevious(count), { initialProps: 0, }); - expect(result.current).toEqual(undefined); + + expect(result.current).toEqual(null); rerender(1); + expect(result.current).toEqual(0); rerender(2); + expect(result.current).toEqual(1); }); -it("can customize equal function", () => { +it("can customize `equalFn`", () => { const { result, rerender } = renderHook( (count) => usePrevious(count, () => true), - { initialProps: 0 } + { initialProps: 0 }, ); - expect(result.current).toEqual(undefined); + + expect(result.current).toEqual(null); rerender(1); - expect(result.current).toEqual(undefined); + + expect(result.current).toEqual(null); rerender(2); - expect(result.current).toEqual(undefined); + + expect(result.current).toEqual(null); }); diff --git a/packages/hooks/tests/use-rerender.test.ts b/tests/use-rerender.test.ts similarity index 78% rename from packages/hooks/tests/use-rerender.test.ts rename to tests/use-rerender.test.ts index 35735b3..4428f20 100644 --- a/packages/hooks/tests/use-rerender.test.ts +++ b/tests/use-rerender.test.ts @@ -2,7 +2,7 @@ import { act, renderHook } from "@testing-library/react"; import { useEffect } from "react"; import { useRerender } from "src"; -it("can force a re-render", () => { +it("forces a re-render", () => { const effect = vi.fn(); const { result } = renderHook(() => { @@ -10,8 +10,14 @@ it("can force a re-render", () => { useEffect(effect); return rerender; }); + expect(effect).toHaveBeenCalledTimes(1); act(() => result.current()); + expect(effect).toHaveBeenCalledTimes(2); + + act(() => result.current()); + + expect(effect).toHaveBeenCalledTimes(3); }); diff --git a/packages/hooks/tests/use-safe-layout-effect.test.ts b/tests/use-safe-layout-effect.test.ts similarity index 78% rename from packages/hooks/tests/use-safe-layout-effect.test.ts rename to tests/use-safe-layout-effect.test.ts index 4f9576a..7c6bb5b 100644 --- a/packages/hooks/tests/use-safe-layout-effect.test.ts +++ b/tests/use-safe-layout-effect.test.ts @@ -3,17 +3,18 @@ import { useSafeLayoutEffect } from "src"; beforeAll(() => { document.body.innerHTML = ` -
+
`; }); -it("runs exactly as useLayoutEffect", () => { +it("is exactly same as `useLayoutEffect`", () => { const target = screen.getByTestId("target"); renderHook(() => useSafeLayoutEffect(() => { target.innerHTML = "foo"; - }) + }), ); + expect(target.innerHTML).toEqual("foo"); }); diff --git a/tests/use-session-storage.test.ts b/tests/use-session-storage.test.ts new file mode 100644 index 0000000..fcfd03a --- /dev/null +++ b/tests/use-session-storage.test.ts @@ -0,0 +1,167 @@ +import { act, renderHook } from "@testing-library/react"; +import { useSessionStorage } from "src"; + +const mockGetItem = vi.spyOn(Storage.prototype, "getItem"); +const mockSetItem = vi.spyOn(Storage.prototype, "setItem"); +const mockRemoveItem = vi.spyOn(Storage.prototype, "removeItem"); + +afterEach(() => { + sessionStorage.clear(); + vi.clearAllMocks(); +}); + +afterAll(() => { + vi.restoreAllMocks(); +}); + +it("returns `null` if there is no stored value", () => { + const { result } = renderHook(() => useSessionStorage("test")); + + expect(result.current.value).toEqual(null); + expect(sessionStorage.getItem("test")).toEqual(null); +}); + +it("returns stored value if there is stored value", () => { + sessionStorage.setItem("test", "1"); + + const { result } = renderHook(() => useSessionStorage("test")); + + expect(result.current.value).toEqual(1); + expect(sessionStorage.getItem("test")).toEqual("1"); +}); + +it("responds to dynamic `key`", () => { + sessionStorage.setItem("test1", "1"); + + const { result, rerender } = renderHook((key) => useSessionStorage(key), { + initialProps: "test1", + }); + + expect(result.current.value).toEqual(1); + expect(sessionStorage.getItem("test1")).toEqual("1"); + + rerender("test2"); + + expect(result.current.value).toEqual(null); + expect(sessionStorage.getItem("test2")).toEqual(null); +}); + +it("can set value with a value", () => { + const { result } = renderHook(() => useSessionStorage("test")); + + expect(result.current.value).toEqual(null); + expect(sessionStorage.getItem("test")).toEqual(null); + + act(() => result.current.set(1)); + + expect(result.current.value).toEqual(1); + expect(sessionStorage.getItem("test")).toEqual("1"); + + act(() => result.current.set(2)); + + expect(result.current.value).toEqual(2); + expect(sessionStorage.getItem("test")).toEqual("2"); +}); + +it("can set value with a function", () => { + const { result } = renderHook(() => useSessionStorage("test")); + + expect(result.current.value).toEqual(null); + expect(sessionStorage.getItem("test")).toEqual(null); + + act(() => result.current.set((prev: number) => (prev ?? 0) + 1)); + + expect(result.current.value).toEqual(1); + expect(sessionStorage.getItem("test")).toEqual("1"); + + act(() => result.current.set((prev: number) => (prev ?? 0) + 1)); + + expect(result.current.value).toEqual(2); + expect(sessionStorage.getItem("test")).toEqual("2"); +}); + +it("can remove value", () => { + sessionStorage.setItem("test", "1"); + + const { result } = renderHook(() => useSessionStorage("test")); + + expect(result.current.value).toEqual(1); + expect(sessionStorage.getItem("test")).toEqual("1"); + + act(() => result.current.remove()); + + expect(result.current.value).toEqual(null); + expect(sessionStorage.getItem("test")).toEqual(null); + + act(() => result.current.remove()); + + expect(result.current.value).toEqual(null); + expect(sessionStorage.getItem("test")).toEqual(null); +}); + +it("can customize `serializer` and `deserializer`", () => { + const { result } = renderHook(() => + useSessionStorage("test", { + serializer: (value) => String(value + 1), + deserializer: (value) => Number(value) - 1, + }), + ); + + expect(result.current.value).toEqual(null); + expect(sessionStorage.getItem("test")).toEqual(null); + + act(() => result.current.set(1)); + + expect(result.current.value).toEqual(1); + expect(sessionStorage.getItem("test")).toEqual("2"); + + act(() => result.current.set(2)); + + expect(result.current.value).toEqual(2); + expect(sessionStorage.getItem("test")).toEqual("3"); +}); + +it("returns `null` if `sessionStorage.getItem` throws an error", () => { + sessionStorage.setItem("test", "1"); + mockGetItem.mockImplementationOnce(() => { + throw new Error("test"); + }); + + const { result } = renderHook(() => useSessionStorage("test")); + + expect(result.current.value).toEqual(null); + expect(sessionStorage.getItem("test")).toEqual("1"); +}); + +it("does not set value if `sessionStorage.setItem` throws an error", () => { + mockSetItem.mockImplementationOnce(() => { + throw new Error("test"); + }); + + const { result } = renderHook(() => useSessionStorage("test")); + + expect(result.current.value).toEqual(null); + expect(sessionStorage.getItem("test")).toEqual(null); + + act(() => result.current.set(1)); + + expect(result.current.value).toEqual(null); + expect(sessionStorage.getItem("test")).toEqual(null); +}); + +it("does not remove value if `sessionStorage.removeItem` throws an error", () => { + sessionStorage.setItem("test", "1"); + mockRemoveItem.mockImplementationOnce(() => { + throw new Error("test"); + }); + + const { result } = renderHook(() => useSessionStorage("test")); + + expect(result.current.value).toEqual(1); + expect(sessionStorage.getItem("test")).toEqual("1"); + + act(() => result.current.remove()); + + expect(result.current.value).toEqual(1); + expect(sessionStorage.getItem("test")).toEqual("1"); +}); diff --git a/tests/use-text-selection.test.ts b/tests/use-text-selection.test.ts new file mode 100644 index 0000000..a7142d8 --- /dev/null +++ b/tests/use-text-selection.test.ts @@ -0,0 +1,110 @@ +import { fireEvent, renderHook, screen } from "@testing-library/react"; +import { useTextSelection } from "src"; + +beforeAll(() => { + document.body.innerHTML = ` +
hello
+ `; +}); + +afterEach(() => { + cancelSelection(); +}); + +function selectOneLetter() { + const text = screen.getByTestId("target").firstChild as Text; + document.getSelection()?.setBaseAndExtent(text, 0, text, 1); + fireEvent.mouseUp(document); +} + +function selectTwoLetters() { + const text = screen.getByTestId("target").firstChild as Text; + document.getSelection()?.setBaseAndExtent(text, 0, text, 2); + fireEvent.mouseUp(document); +} + +function cancelSelection() { + document.getSelection()?.removeAllRanges(); + fireEvent.mouseUp(document); +} + +it("returns selected text", () => { + selectOneLetter(); + + const { result } = renderHook(() => useTextSelection()); + + expect(result.current).toEqual("h"); +}); + +it("listens to selection changes", () => { + const { result } = renderHook(() => useTextSelection()); + + expect(result.current).toEqual(""); + + selectOneLetter(); + + expect(result.current).toEqual("h"); + + cancelSelection(); + + expect(result.current).toEqual(""); + + selectTwoLetters(); + + expect(result.current).toEqual("he"); + + cancelSelection(); + + expect(result.current).toEqual(""); +}); + +it("can keep selection after cancellation", () => { + const { result } = renderHook(() => useTextSelection({ sticky: true })); + + expect(result.current).toEqual(""); + + selectOneLetter(); + + expect(result.current).toEqual("h"); + + cancelSelection(); + + expect(result.current).toEqual("h"); + + selectTwoLetters(); + + expect(result.current).toEqual("he"); + + cancelSelection(); + + expect(result.current).toEqual("he"); +}); + +it("responds to dynamic `sticky`", () => { + const { result, rerender } = renderHook( + (sticky) => useTextSelection({ sticky }), + { initialProps: false }, + ); + + expect(result.current).toEqual(""); + + selectOneLetter(); + + expect(result.current).toEqual("h"); + + cancelSelection(); + + expect(result.current).toEqual(""); + + rerender(true); + + expect(result.current).toEqual(""); + + selectOneLetter(); + + expect(result.current).toEqual("h"); + + cancelSelection(); + + expect(result.current).toEqual("h"); +}); diff --git a/packages/hooks/tests/use-theme.test.ts b/tests/use-theme.test.ts similarity index 66% rename from packages/hooks/tests/use-theme.test.ts rename to tests/use-theme.test.ts index 1492999..22185aa 100644 --- a/packages/hooks/tests/use-theme.test.ts +++ b/tests/use-theme.test.ts @@ -1,117 +1,177 @@ import { act, renderHook } from "@testing-library/react"; import { useTheme, type Theme } from "src"; -import { matchMedia } from "./utils/match-media"; beforeAll(() => { - vi.stubGlobal("matchMedia", matchMedia); + vi.stubGlobal("matchMedia", () => ({ + matches: true, + addEventListener: () => {}, + removeEventListener: () => {}, + })); }); + +afterEach(() => { + localStorage.clear(); +}); + afterAll(() => { vi.unstubAllGlobals(); }); -afterEach(() => localStorage.clear()); it("defaults to device theme", () => { const { result } = renderHook(() => useTheme()); + expect(result.current.theme).toEqual("dark"); expect(localStorage.getItem("theme")).toEqual(null); }); -it("prefers default theme to OS theme", () => { +it("prefers default theme to device theme", () => { const { result } = renderHook(() => useTheme({ defaultTheme: "light" })); + expect(result.current.theme).toEqual("light"); expect(localStorage.getItem("theme")).toEqual(null); }); -it("responds to stateful default theme", () => { +it("prefers stored theme to device theme", () => { + localStorage.setItem("theme", "light"); + + const { result } = renderHook(() => useTheme()); + + expect(result.current.theme).toEqual("light"); + expect(localStorage.getItem("theme")).toEqual("light"); +}); + +it("prefers stored theme to default theme", () => { + localStorage.setItem("theme", "light"); + + const { result } = renderHook(() => useTheme({ defaultTheme: "dark" })); + + expect(result.current.theme).toEqual("light"); + expect(localStorage.getItem("theme")).toEqual("light"); +}); + +it("responds to dynamic `defaultTheme`", () => { const { result, rerender } = renderHook( (defaultTheme: Theme) => useTheme({ defaultTheme }), - { initialProps: "light" } + { initialProps: "light" }, ); + expect(result.current.theme).toEqual("light"); expect(localStorage.getItem("theme")).toEqual(null); rerender("dark"); + expect(result.current.theme).toEqual("dark"); expect(localStorage.getItem("theme")).toEqual(null); }); -it("prefers user theme to default theme", () => { - localStorage.setItem("theme", "light"); - - const { result } = renderHook(() => useTheme({ defaultTheme: "dark" })); - expect(result.current.theme).toEqual("light"); -}); - -it("can customize storage key", () => { +it("can customize `storageKey`", () => { const { result } = renderHook(() => useTheme({ storageKey: "test" })); + expect(result.current.theme).toEqual("dark"); expect(localStorage.getItem("test")).toEqual(null); act(() => result.current.toggle()); + expect(result.current.theme).toEqual("light"); expect(localStorage.getItem("test")).toEqual("light"); }); -it("responds to stateful storage key", () => { - localStorage.setItem("test", "light"); - localStorage.setItem("theme", "dark"); +it("responds to dynamic `storageKey`", () => { + localStorage.setItem("test1", "light"); + localStorage.setItem("test2", "dark"); const { result, rerender } = renderHook( (storageKey: string) => useTheme({ storageKey }), - { initialProps: "test" } + { initialProps: "test1" }, ); + expect(result.current.theme).toEqual("light"); - expect(localStorage.getItem("test")).toEqual("light"); + expect(localStorage.getItem("test1")).toEqual("light"); + + rerender("test2"); - rerender("theme"); expect(result.current.theme).toEqual("dark"); - expect(localStorage.getItem("theme")).toEqual("dark"); + expect(localStorage.getItem("test2")).toEqual("dark"); }); it("can set theme", () => { const { result } = renderHook(() => useTheme()); + expect(result.current.theme).toEqual("dark"); expect(localStorage.getItem("theme")).toEqual(null); act(() => result.current.set("light")); + expect(result.current.theme).toEqual("light"); expect(localStorage.getItem("theme")).toEqual("light"); act(() => result.current.set("dark")); + expect(result.current.theme).toEqual("dark"); expect(localStorage.getItem("theme")).toEqual("dark"); }); -it("can toggle theme", () => { - const { result } = renderHook(() => useTheme()); +it("can set theme to light", () => { + const { result } = renderHook(() => useTheme({ defaultTheme: "dark" })); + expect(result.current.theme).toEqual("dark"); expect(localStorage.getItem("theme")).toEqual(null); - act(() => result.current.toggle()); + act(() => result.current.setLight()); + expect(result.current.theme).toEqual("light"); expect(localStorage.getItem("theme")).toEqual("light"); - act(() => result.current.toggle()); + act(() => result.current.setLight()); + + expect(result.current.theme).toEqual("light"); + expect(localStorage.getItem("theme")).toEqual("light"); +}); + +it("can set theme to dark", () => { + const { result } = renderHook(() => useTheme({ defaultTheme: "light" })); + + expect(result.current.theme).toEqual("light"); + expect(localStorage.getItem("theme")).toEqual(null); + + act(() => result.current.setDark()); + + expect(result.current.theme).toEqual("dark"); + expect(localStorage.getItem("theme")).toEqual("dark"); + + act(() => result.current.setDark()); + expect(result.current.theme).toEqual("dark"); expect(localStorage.getItem("theme")).toEqual("dark"); }); -it("can set theme to light", () => { - const { result } = renderHook(() => useTheme({ defaultTheme: "dark" })); +it("can toggle theme", () => { + const { result } = renderHook(() => useTheme()); + expect(result.current.theme).toEqual("dark"); expect(localStorage.getItem("theme")).toEqual(null); - act(() => result.current.setLight()); + act(() => result.current.toggle()); + expect(result.current.theme).toEqual("light"); expect(localStorage.getItem("theme")).toEqual("light"); + + act(() => result.current.toggle()); + + expect(result.current.theme).toEqual("dark"); + expect(localStorage.getItem("theme")).toEqual("dark"); }); -it("can set theme to dark", () => { - const { result } = renderHook(() => useTheme({ defaultTheme: "light" })); +it("can reset theme", () => { + localStorage.setItem("theme", "light"); + + const { result } = renderHook(() => useTheme()); + expect(result.current.theme).toEqual("light"); - expect(localStorage.getItem("theme")).toEqual(null); + expect(localStorage.getItem("theme")).toEqual("light"); + + act(() => result.current.reset()); - act(() => result.current.setDark()); expect(result.current.theme).toEqual("dark"); - expect(localStorage.getItem("theme")).toEqual("dark"); + expect(localStorage.getItem("theme")).toEqual(null); }); diff --git a/packages/hooks/tests/use-throttle-effect.test.ts b/tests/use-throttle-effect.test.ts similarity index 63% rename from packages/hooks/tests/use-throttle-effect.test.ts rename to tests/use-throttle-effect.test.ts index 3f61e73..98e58f7 100644 --- a/packages/hooks/tests/use-throttle-effect.test.ts +++ b/tests/use-throttle-effect.test.ts @@ -4,78 +4,119 @@ import { useThrottleEffect } from "src"; beforeAll(() => { vi.useFakeTimers(); }); -afterAll(() => { - vi.useRealTimers(); -}); + afterEach(() => { vi.clearAllTimers(); }); -it("triggers effect only once in a period", () => { +afterAll(() => { + vi.useRealTimers(); +}); + +it("triggers effect only once in a while", () => { const effect = vi.fn(); const { rerender } = renderHook( (count) => useThrottleEffect(effect, [count]), - { initialProps: 0 } + { initialProps: 0 }, ); + expect(effect).toHaveBeenCalledTimes(0); rerender(1); + expect(effect).toHaveBeenCalledTimes(1); vi.advanceTimersByTime(499); rerender(2); rerender(3); rerender(4); + expect(effect).toHaveBeenCalledTimes(1); vi.advanceTimersByTime(1); rerender(5); + expect(effect).toHaveBeenCalledTimes(2); }); -it("can customize timeout", () => { +it("can customize `timeout`", () => { const effect = vi.fn(); const { rerender } = renderHook( (count) => useThrottleEffect(effect, [count], { timeout: 100 }), - { initialProps: 0 } + { initialProps: 0 }, ); + expect(effect).toHaveBeenCalledTimes(0); rerender(1); + expect(effect).toHaveBeenCalledTimes(1); vi.advanceTimersByTime(99); rerender(2); rerender(3); rerender(4); + expect(effect).toHaveBeenCalledTimes(1); vi.advanceTimersByTime(1); rerender(5); + + expect(effect).toHaveBeenCalledTimes(2); +}); + +it("responds to dynamic `timeout`", () => { + const effect = vi.fn(); + + const { rerender } = renderHook( + ({ count, timeout }) => useThrottleEffect(effect, [count], { timeout }), + { initialProps: { count: 0, timeout: 100 } }, + ); + + expect(effect).toHaveBeenCalledTimes(0); + + rerender({ count: 1, timeout: 200 }); + + expect(effect).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(199); + rerender({ count: 2, timeout: 200 }); + rerender({ count: 3, timeout: 200 }); + rerender({ count: 4, timeout: 200 }); + + expect(effect).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(1); + rerender({ count: 5, timeout: 200 }); + expect(effect).toHaveBeenCalledTimes(2); }); -it("can start timing on mount", () => { +it("can run on mount", () => { const effect = vi.fn(); const { rerender } = renderHook( (count) => useThrottleEffect(effect, [count], { onMount: true }), - { initialProps: 0 } + { initialProps: 0 }, ); + expect(effect).toHaveBeenCalledTimes(1); rerender(1); + expect(effect).toHaveBeenCalledTimes(1); vi.advanceTimersByTime(499); rerender(2); rerender(3); rerender(4); + expect(effect).toHaveBeenCalledTimes(1); vi.advanceTimersByTime(1); rerender(5); + expect(effect).toHaveBeenCalledTimes(2); }); diff --git a/packages/hooks/tests/use-throttle.test.ts b/tests/use-throttle.test.ts similarity index 63% rename from packages/hooks/tests/use-throttle.test.ts rename to tests/use-throttle.test.ts index 47a464b..304ee1e 100644 --- a/packages/hooks/tests/use-throttle.test.ts +++ b/tests/use-throttle.test.ts @@ -4,71 +4,110 @@ import { useThrottle } from "src"; beforeAll(() => { vi.useFakeTimers(); }); -afterAll(() => { - vi.useRealTimers(); -}); + afterEach(() => { vi.clearAllTimers(); }); -it("updates value only once in a period", () => { +afterAll(() => { + vi.useRealTimers(); +}); + +it("updates value only once in a while", () => { const { result, rerender } = renderHook((count) => useThrottle(count), { initialProps: 0, }); + expect(result.current).toEqual(0); rerender(1); + expect(result.current).toEqual(1); vi.advanceTimersByTime(499); rerender(2); rerender(3); rerender(4); + expect(result.current).toEqual(1); vi.advanceTimersByTime(1); rerender(5); + expect(result.current).toEqual(5); }); -it("can customize timeout", () => { +it("can customize `timeout`", () => { const { result, rerender } = renderHook( (count) => useThrottle(count, { timeout: 100 }), - { initialProps: 0 } + { initialProps: 0 }, ); + expect(result.current).toEqual(0); rerender(1); + expect(result.current).toEqual(1); vi.advanceTimersByTime(99); rerender(2); rerender(3); rerender(4); + expect(result.current).toEqual(1); vi.advanceTimersByTime(1); rerender(5); + + expect(result.current).toEqual(5); +}); + +it("responds to dynamic `timeout`", () => { + const { result, rerender } = renderHook( + ({ count, timeout }) => useThrottle(count, { timeout }), + { initialProps: { count: 0, timeout: 100 } }, + ); + + expect(result.current).toEqual(0); + + rerender({ count: 1, timeout: 200 }); + + expect(result.current).toEqual(1); + + vi.advanceTimersByTime(199); + rerender({ count: 2, timeout: 200 }); + rerender({ count: 3, timeout: 200 }); + rerender({ count: 4, timeout: 200 }); + + expect(result.current).toEqual(1); + + vi.advanceTimersByTime(1); + rerender({ count: 5, timeout: 200 }); + expect(result.current).toEqual(5); }); -it("can start timing on mount", () => { +it("can run on mount", () => { const { result, rerender } = renderHook( (count) => useThrottle(count, { onMount: true }), - { initialProps: 0 } + { initialProps: 0 }, ); + expect(result.current).toEqual(0); rerender(1); + expect(result.current).toEqual(0); vi.advanceTimersByTime(499); rerender(2); rerender(3); rerender(4); + expect(result.current).toEqual(0); vi.advanceTimersByTime(1); rerender(5); + expect(result.current).toEqual(5); }); diff --git a/tests/use-timeout.test.ts b/tests/use-timeout.test.ts new file mode 100644 index 0000000..f50deee --- /dev/null +++ b/tests/use-timeout.test.ts @@ -0,0 +1,74 @@ +import { renderHook } from "@testing-library/react"; +import { useTimeout } from "src"; + +beforeAll(() => { + vi.useFakeTimers(); +}); + +afterEach(() => { + vi.clearAllTimers(); +}); + +afterAll(() => { + vi.useRealTimers(); +}); + +it("runs function after timeout", () => { + const fn = vi.fn(); + + renderHook(() => useTimeout(fn)); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(499); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(1); + + expect(fn).toHaveBeenCalledTimes(1); +}); + +it("can customize `timeout`", () => { + const fn = vi.fn(); + + renderHook(() => useTimeout(fn, 100)); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(99); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(1); + + expect(fn).toHaveBeenCalledTimes(1); +}); + +it("responds to dynamic `timeout`", () => { + const fn = vi.fn(); + + const { rerender } = renderHook((timeout) => useTimeout(fn, timeout), { + initialProps: 100, + }); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(99); + + expect(fn).toHaveBeenCalledTimes(0); + + vi.advanceTimersByTime(1); + + expect(fn).toHaveBeenCalledTimes(1); + + rerender(200); + + vi.advanceTimersByTime(199); + + expect(fn).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(1); + + expect(fn).toHaveBeenCalledTimes(2); +}); diff --git a/tests/use-title.test.ts b/tests/use-title.test.ts new file mode 100644 index 0000000..c592f8d --- /dev/null +++ b/tests/use-title.test.ts @@ -0,0 +1,14 @@ +import { act, renderHook } from "@testing-library/react"; +import { useTitle } from "src"; + +it("returns title", async () => { + await act(async () => (document.title = "hello")); + + const { result } = renderHook(() => useTitle()); + + expect(result.current).toEqual("hello"); + + await act(async () => (document.title = "world")); + + expect(result.current).toEqual("world"); +}); diff --git a/packages/hooks/tests/use-toggle.test.ts b/tests/use-toggle.test.ts similarity index 81% rename from packages/hooks/tests/use-toggle.test.ts rename to tests/use-toggle.test.ts index 353ef78..c30de82 100644 --- a/packages/hooks/tests/use-toggle.test.ts +++ b/tests/use-toggle.test.ts @@ -1,48 +1,68 @@ import { act, renderHook } from "@testing-library/react"; import { useToggle } from "src"; -it("defaults to left-side value", () => { +it("defaults to left-hand value", () => { const { result } = renderHook(() => useToggle("hello", "world")); + expect(result.current.value).toEqual("hello"); }); it("can set value", () => { const { result } = renderHook(() => useToggle("hello", "world")); + expect(result.current.value).toEqual("hello"); act(() => result.current.set("world")); + expect(result.current.value).toEqual("world"); act(() => result.current.set("hello")); + expect(result.current.value).toEqual("hello"); }); -it("can toggle value", () => { +it("can set value to left-hand", () => { const { result } = renderHook(() => useToggle("hello", "world")); + expect(result.current.value).toEqual("hello"); - act(() => result.current.toggle()); + act(() => result.current.setRight()); + expect(result.current.value).toEqual("world"); - act(() => result.current.toggle()); + act(() => result.current.setLeft()); + + expect(result.current.value).toEqual("hello"); + + act(() => result.current.setLeft()); + expect(result.current.value).toEqual("hello"); }); -it("can set value to left-side", () => { +it("can set value to right-hand", () => { const { result } = renderHook(() => useToggle("hello", "world")); + expect(result.current.value).toEqual("hello"); act(() => result.current.setRight()); + expect(result.current.value).toEqual("world"); - act(() => result.current.setLeft()); - expect(result.current.value).toEqual("hello"); + act(() => result.current.setRight()); + + expect(result.current.value).toEqual("world"); }); -it("can set value to right-side", () => { +it("can toggle value", () => { const { result } = renderHook(() => useToggle("hello", "world")); + expect(result.current.value).toEqual("hello"); - act(() => result.current.setRight()); + act(() => result.current.toggle()); + expect(result.current.value).toEqual("world"); + + act(() => result.current.toggle()); + + expect(result.current.value).toEqual("hello"); }); diff --git a/packages/hooks/tests/use-unmount.test.ts b/tests/use-unmount.test.ts similarity index 78% rename from packages/hooks/tests/use-unmount.test.ts rename to tests/use-unmount.test.ts index 72d8b3f..a30aa60 100644 --- a/packages/hooks/tests/use-unmount.test.ts +++ b/tests/use-unmount.test.ts @@ -1,15 +1,22 @@ import { renderHook } from "@testing-library/react"; import { useUnmount } from "src"; -it("only runs on unmount", () => { +it("runs only on unmount", () => { const cleanup = vi.fn(); const { rerender, unmount } = renderHook(() => useUnmount(cleanup)); + expect(cleanup).toHaveBeenCalledTimes(0); rerender(); + + expect(cleanup).toHaveBeenCalledTimes(0); + + rerender(); + expect(cleanup).toHaveBeenCalledTimes(0); unmount(); + expect(cleanup).toHaveBeenCalledTimes(1); }); diff --git a/packages/hooks/tests/use-unsafe-once-effect.test.ts b/tests/use-unsafe-once-effect.test.ts similarity index 71% rename from packages/hooks/tests/use-unsafe-once-effect.test.ts rename to tests/use-unsafe-once-effect.test.ts index 956867c..1795a52 100644 --- a/packages/hooks/tests/use-unsafe-once-effect.test.ts +++ b/tests/use-unsafe-once-effect.test.ts @@ -1,19 +1,29 @@ -import { renderHook } from "@testing-library/react"; +import { configure, renderHook } from "@testing-library/react"; import { useUnsafeOnceEffect } from "src"; +configure({ reactStrictMode: true }); + it("runs exactly once", () => { const cleanup = vi.fn(); const effect = vi.fn(() => cleanup); const { rerender, unmount } = renderHook(() => useUnsafeOnceEffect(effect)); + expect(effect).toHaveBeenCalledTimes(1); expect(cleanup).toHaveBeenCalledTimes(0); rerender(); + + expect(effect).toHaveBeenCalledTimes(1); + expect(cleanup).toHaveBeenCalledTimes(0); + + rerender(); + expect(effect).toHaveBeenCalledTimes(1); expect(cleanup).toHaveBeenCalledTimes(0); unmount(); + expect(effect).toHaveBeenCalledTimes(1); expect(cleanup).toHaveBeenCalledTimes(1); }); diff --git a/packages/hooks/tests/use-update-deps.test.ts b/tests/use-update.test.ts similarity index 64% rename from packages/hooks/tests/use-update-deps.test.ts rename to tests/use-update.test.ts index a7b1b34..24b68da 100644 --- a/packages/hooks/tests/use-update-deps.test.ts +++ b/tests/use-update.test.ts @@ -1,80 +1,85 @@ import { renderHook } from "@testing-library/react"; -import { useUpdateDeps } from "src"; +import { useUpdate } from "src"; -it("runs on dependency update", () => { +it("runs only on component updates", () => { const cleanup = vi.fn(); const effect = vi.fn(() => cleanup); - const { rerender, unmount } = renderHook( - (count) => useUpdateDeps(effect, [count]), - { initialProps: 0 } - ); + const { rerender, unmount } = renderHook(() => useUpdate(effect)); + expect(effect).toHaveBeenCalledTimes(0); expect(cleanup).toHaveBeenCalledTimes(0); - rerender(1); + rerender(); + expect(effect).toHaveBeenCalledTimes(1); expect(cleanup).toHaveBeenCalledTimes(0); - rerender(2); + rerender(); + expect(effect).toHaveBeenCalledTimes(2); expect(cleanup).toHaveBeenCalledTimes(1); unmount(); + expect(effect).toHaveBeenCalledTimes(2); expect(cleanup).toHaveBeenCalledTimes(2); }); -it("does not run when dependency stays the same", () => { +it("never runs if dependency list is empty", () => { const cleanup = vi.fn(); - const effect = vi.fn(); + const effect = vi.fn(() => cleanup); + + const { rerender, unmount } = renderHook(() => useUpdate(effect, [])); - const { rerender, unmount } = renderHook( - (count) => - useUpdateDeps(() => { - effect(); - return cleanup; - }, [count]), - { initialProps: 0 } - ); expect(effect).toHaveBeenCalledTimes(0); expect(cleanup).toHaveBeenCalledTimes(0); - rerender(0); + rerender(); + expect(effect).toHaveBeenCalledTimes(0); expect(cleanup).toHaveBeenCalledTimes(0); - rerender(0); + rerender(); + expect(effect).toHaveBeenCalledTimes(0); expect(cleanup).toHaveBeenCalledTimes(0); unmount(); + expect(effect).toHaveBeenCalledTimes(0); expect(cleanup).toHaveBeenCalledTimes(0); }); -it("never runs with empty dependency list", () => { +it("runs only on dependency updates if dependency list is not empty", () => { const cleanup = vi.fn(); - const effect = vi.fn(); + const effect = vi.fn(() => cleanup); - const { rerender, unmount } = renderHook(() => - useUpdateDeps(() => { - effect(); - return cleanup; - }, []) + const { rerender, unmount } = renderHook( + (count) => useUpdate(effect, [count]), + { initialProps: 0 }, ); + expect(effect).toHaveBeenCalledTimes(0); expect(cleanup).toHaveBeenCalledTimes(0); - rerender(); + rerender(0); + expect(effect).toHaveBeenCalledTimes(0); expect(cleanup).toHaveBeenCalledTimes(0); - rerender(); - expect(effect).toHaveBeenCalledTimes(0); + rerender(1); + + expect(effect).toHaveBeenCalledTimes(1); expect(cleanup).toHaveBeenCalledTimes(0); - unmount(); - expect(effect).toHaveBeenCalledTimes(0); + rerender(1); + + expect(effect).toHaveBeenCalledTimes(1); expect(cleanup).toHaveBeenCalledTimes(0); + + unmount(); + + expect(effect).toHaveBeenCalledTimes(1); + expect(cleanup).toHaveBeenCalledTimes(1); }); diff --git a/tests/use-window-size.test.ts b/tests/use-window-size.test.ts new file mode 100644 index 0000000..2eb2255 --- /dev/null +++ b/tests/use-window-size.test.ts @@ -0,0 +1,19 @@ +import { fireEvent, renderHook } from "@testing-library/react"; +import { useWindowSize } from "src"; + +it("returns window size", () => { + window.innerWidth = 200; + window.innerHeight = 100; + + const { result } = renderHook(() => useWindowSize()); + + expect(result.current.width).toEqual(200); + expect(result.current.height).toEqual(100); + + window.innerWidth = 400; + window.innerHeight = 300; + fireEvent.resize(window); + + expect(result.current.width).toEqual(400); + expect(result.current.height).toEqual(300); +}); diff --git a/packages/hooks/tests/use-window.test.ts b/tests/use-window.test.ts similarity index 99% rename from packages/hooks/tests/use-window.test.ts rename to tests/use-window.test.ts index a1e7eb1..cf279d5 100644 --- a/packages/hooks/tests/use-window.test.ts +++ b/tests/use-window.test.ts @@ -3,5 +3,6 @@ import { useWindow } from "src"; it("returns window", () => { const { result } = renderHook(() => useWindow()); + expect(result.current.current).toEqual(window); }); diff --git a/tsconfig.json b/tsconfig.json index 2826aaa..da88ee8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,43 @@ { - "files": [], - "references": [ - { - "path": "packages/hooks" - }, - { - "path": "docs" - } - ] + "compilerOptions": { + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "alwaysStrict": true, + "exactOptionalPropertyTypes": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noPropertyAccessFromIndexSignature": true, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "strict": true, + "strictBindCallApply": true, + // "strictBuiltinIteratorReturn": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "strictPropertyInitialization": true, + "useUnknownInCatchVariables": true, + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "Bundler", + "paths": { "@/*": ["src/*"] }, + "resolveJsonModule": true, + "types": ["vitest/globals"], + "noEmit": true, + "allowJs": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "jsx": "react-jsx", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "target": "ESNext", + "incremental": true, + "skipLibCheck": true + }, + "exclude": ["dist"] } diff --git a/turbo.json b/turbo.json deleted file mode 100644 index 6699c09..0000000 --- a/turbo.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://turborepo.org/schema.json", - "pipeline": { - "build": { - "dependsOn": ["^build"], - "outputs": ["dist/**"] - }, - "dev": { - "cache": false - }, - "test": {}, - "//#lint:script": {}, - "//#format:script": {} - } -} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..45c873b --- /dev/null +++ b/vercel.json @@ -0,0 +1,5 @@ +{ + "git": { + "deploymentEnabled": false + } +} diff --git a/packages/hooks/vite.config.ts b/vite.config.ts similarity index 69% rename from packages/hooks/vite.config.ts rename to vite.config.ts index dce52e5..6751c6d 100644 --- a/packages/hooks/vite.config.ts +++ b/vite.config.ts @@ -1,18 +1,11 @@ -/// +/// import { defineConfig } from "vite"; import dts from "vite-plugin-dts"; import tsconfigPaths from "vite-tsconfig-paths"; -import { removeRedundantDts } from "./plugins/remove-redundant-dts"; export default defineConfig({ - plugins: [ - tsconfigPaths(), - dts({ - rollupTypes: true, - afterBuild: removeRedundantDts, - }), - ], + plugins: [tsconfigPaths(), dts({ rollupTypes: true })], build: { lib: { entry: "src/index.ts", @@ -30,7 +23,14 @@ export default defineConfig({ }, }, test: { - globals: true, environment: "jsdom", + globals: true, + // isolate: false, + // sequence: { + // concurrent: true, + // }, + coverage: { + include: ["src/**/*.ts"], + }, }, });