From ef66a1bf00a0c79221f87e16631c2093c541ead7 Mon Sep 17 00:00:00 2001 From: Curtis Dulmage Date: Sat, 20 Jan 2024 18:45:13 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=A9=B1=20[Monorepo]=20Overhaul=20project?= =?UTF-8?q?=20to=20support=20monorepo=20design=20(#66)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/config.json | 4 +- .changeset/twelve-deers-allow.md | 5 + .eslintignore | 1 + .eslintrc | 2 +- .github/labeler.yml | 7 +- .github/workflows/deploy.yml | 56 + .github/workflows/labels.yml | 6 +- .github/workflows/lint.yml | 26 +- .github/workflows/release.yml | 27 +- .github/workflows/test.yml | 19 +- .gitignore | 18 +- .npmignore | 111 +- .prettierignore | 5 + .vscode/extensions.json | 6 +- .vscode/settings.json | 2 +- LICENSE | 2 +- README.md | 95 +- app/README.md | 24 + app/website/.eslintrc.cjs | 34 + app/website/LICENSE | 13 + app/website/README.md | 3 + app/website/env.d.ts | 2 + app/website/index.html | 55 + app/website/lightningcss-plugins.ts | 84 + app/website/package.json | 46 + app/website/public/android-chrome-192x192.png | Bin 0 -> 285 bytes app/website/public/android-chrome-512x512.png | Bin 0 -> 712 bytes app/website/public/apple-touch-icon.png | Bin 0 -> 300 bytes app/website/public/favicon.ico | Bin 0 -> 15406 bytes app/website/public/favicon.svg | 6 + app/website/public/site.webmanifest | 19 + app/website/src/App.vue | 10 + app/website/src/assets/audio/index.ts | 15 + app/website/src/assets/audio/track-1.webm | Bin 0 -> 103099 bytes app/website/src/assets/audio/track-2.webm | Bin 0 -> 25313 bytes app/website/src/assets/audio/track-3.webm | Bin 0 -> 31850 bytes app/website/src/assets/audio/track-4.webm | Bin 0 -> 19401 bytes app/website/src/assets/audio/track-5.webm | Bin 0 -> 17866 bytes app/website/src/assets/audio/track-6.webm | Bin 0 -> 20230 bytes app/website/src/assets/svg/icon-bolt.svg | 3 + .../src/assets/svg/icon-chevron-left.svg | 7 + .../src/assets/svg/icon-chevron-right.svg | 3 + .../src/assets/svg/icon-clone-disabled.svg | 5 + app/website/src/assets/svg/icon-clone.svg | 4 + app/website/src/assets/svg/icon-close.svg | 3 + app/website/src/assets/svg/icon-diamonds.svg | 11 + app/website/src/assets/svg/icon-forward.svg | 4 + app/website/src/assets/svg/icon-loop.svg | 4 + app/website/src/assets/svg/icon-metronome.svg | 3 + app/website/src/assets/svg/icon-muted.svg | 5 + app/website/src/assets/svg/icon-once.svg | 4 + app/website/src/assets/svg/icon-pause.svg | 4 + app/website/src/assets/svg/icon-pitch.svg | 3 + app/website/src/assets/svg/icon-play.svg | 3 + app/website/src/assets/svg/icon-reverse.svg | 4 + app/website/src/assets/svg/icon-speed.svg | 4 + app/website/src/assets/svg/icon-star.svg | 3 + app/website/src/assets/svg/icon-unmuted.svg | 7 + app/website/src/assets/svg/pattern-arrows.svg | 4 + .../src/assets/svg/pattern-checkers.svg | 4 + .../src/assets/svg/pattern-diagonal.svg | 4 + .../src/assets/svg/pattern-halftone-dense.svg | 6 + .../src/assets/svg/pattern-halftone.svg | 4 + app/website/src/components/DragHandle.vue | 56 + app/website/src/components/IconAction.vue | 193 + app/website/src/components/IndexAction.vue | 108 + app/website/src/components/LabelAction.vue | 58 + .../src/components/LogoEarwurmCombo.vue | 26 + app/website/src/components/MuteBar.vue | 50 + app/website/src/components/SpeedSlider.vue | 213 + app/website/src/components/StackLabel.vue | 44 + app/website/src/components/TeardownAction.vue | 89 + app/website/src/components/VolumeManager.vue | 203 + app/website/src/components/VolumeSound.vue | 219 + app/website/src/components/VolumeStack.vue | 198 + app/website/src/components/index.ts | 61 + app/website/src/helpers/app.ts | 19 + app/website/src/helpers/classNames.ts | 36 + app/website/src/helpers/index.ts | 5 + app/website/src/helpers/vue.ts | 20 + app/website/src/hooks/index.ts | 4 + app/website/src/hooks/useMediaQuery.ts | 42 + app/website/src/hooks/useMetronome.ts | 146 + app/website/src/hooks/useMounted.ts | 14 + app/website/src/hooks/useSupported.ts | 13 + app/website/src/main.ts | 11 + app/website/src/primitives/InputRange.vue | 41 + .../src/primitives/MotionFadeScale.vue | 34 + .../src/primitives/MotionSlideReveal.vue | 94 + app/website/src/primitives/ProgressBar.vue | 76 + app/website/src/primitives/SquareAction.vue | 88 + app/website/src/primitives/SvgIcon.vue | 37 + app/website/src/primitives/index.ts | 35 + app/website/src/sections/AppFooter.vue | 51 + app/website/src/sections/AppHeader.vue | 54 + app/website/src/sections/ManagerControls.vue | 59 + app/website/src/sections/SoundControls.vue | 151 + app/website/src/sections/StackControls.vue | 161 + app/website/src/sections/index.ts | 8 + app/website/src/store/index.ts | 6 + app/website/src/store/useBreakpointStore.ts | 12 + app/website/src/store/useEarwurmStore.ts | 102 + app/website/src/store/useSound.ts | 138 + app/website/src/store/useStack.ts | 135 + app/website/src/store/useThemeStore.ts | 17 + app/website/src/styles/design-system.css | 73 + app/website/src/styles/global.css | 116 + app/website/src/styles/keyframes.css | 19 + app/website/src/styles/mixin.css | 188 + app/website/src/styles/reset.css | 151 + app/website/src/styles/utility.css | 90 + app/website/src/types/app.ts | 19 + app/website/src/types/index.ts | 8 + app/website/src/types/vue.ts | 4 + app/website/src/views/HomeView.vue | 67 + app/website/src/views/index.ts | 3 + app/website/tsconfig.app.json | 11 + app/website/tsconfig.json | 7 + app/website/tsconfig.node.json | 10 + app/website/vite.config.ts | 46 + config/tests-setup.ts | 2 +- docs/contributing.md | 82 + docs/conversion.md | 32 + docs/examples-future.md | 139 - docs/examples.md | 217 +- docs/future/examples-future.md | 54 + docs/{ => future}/roadmap-future.md | 32 +- docs/roadmap.md | 22 +- package-lock.json | 7487 ----------------- package.json | 84 +- pkg/README.md | 29 + pkg/earwurm/package.json | 64 + {src => pkg/earwurm/src}/Earwurm.ts | 10 +- {src => pkg/earwurm/src}/Sound.ts | 14 +- {src => pkg/earwurm/src}/Stack.ts | 13 +- {src => pkg/earwurm/src}/index.ts | 0 .../earwurm/src}/tests/Abstract.test.ts | 0 .../earwurm/src}/tests/Earwurm.test.ts | 3 +- {src => pkg/earwurm/src}/tests/Sound.test.ts | 2 +- {src => pkg/earwurm/src}/tests/Stack.test.ts | 4 +- {src => pkg/earwurm/src}/tokens.ts | 0 {src => pkg/earwurm/src}/types.ts | 17 +- pkg/earwurm/vite.config.ts | 35 + {src => pkg}/helpers/fetch-audio-buffer.ts | 0 {src => pkg}/helpers/index.ts | 1 - {src => pkg}/helpers/linear-ramp.ts | 0 pkg/helpers/package.json | 14 + {src => pkg}/helpers/scratch-buffer.ts | 0 pkg/helpers/tests/fetch-audio-buffer.test.ts | 30 + pkg/helpers/tests/linear-ramp.test.ts | 42 + pkg/helpers/tests/scratch-buffer.test.ts | 17 + .../tests/unlock-audio-context.test.ts | 63 + {src => pkg}/helpers/unlock-audio-context.ts | 0 .../mock => pkg/mocks}/MockAudioBuffer.ts | 0 .../mocks}/MockAudioBufferSourceNode.ts | 0 .../mock => pkg/mocks}/MockAudioContext.ts | 0 .../mocks}/MockAudioDestinationNode.ts | 0 .../mock => pkg/mocks}/MockAudioListener.ts | 0 .../tests/mock => pkg/mocks}/MockAudioNode.ts | 0 .../mock => pkg/mocks}/MockAudioParam.ts | 2 +- .../mocks}/MockAudioScheduledSourceNode.ts | 0 .../mock => pkg/mocks}/MockAudioWorklet.ts | 0 .../mocks}/MockBaseAudioContext.ts | 0 {src/tests/mock => pkg/mocks}/MockGainNode.ts | 0 {src/tests/mock => pkg/mocks}/MockWorklet.ts | 0 {src/tests/mock => pkg/mocks}/index.ts | 0 {src/tests/mock => pkg/mocks}/mock-data.ts | 0 {src/tests/mock => pkg/mocks}/mock-utils.ts | 0 pkg/mocks/package.json | 14 + pkg/types/index.ts | 30 + pkg/types/package.json | 12 + pkg/utilities/array.ts | 29 + .../utilities/error.ts | 0 pkg/utilities/index.ts | 34 + pkg/utilities/number.ts | 62 + pkg/utilities/object.ts | 14 + pkg/utilities/package.json | 14 + pkg/utilities/random.ts | 15 + pkg/utilities/string.ts | 24 + pkg/utilities/support.ts | 8 + pkg/utilities/tests/array.test.ts | 86 + pkg/utilities/tests/error.test.ts | 35 + pkg/utilities/tests/number.test.ts | 199 + pkg/utilities/tests/object.test.ts | 31 + pkg/utilities/tests/random.test.ts | 44 + pkg/utilities/tests/string.test.ts | 40 + pkg/utilities/tests/support.test.ts | 19 + pkg/utilities/tests/time.test.ts | 19 + pkg/utilities/tests/wait.test.ts | 14 + pkg/utilities/time.ts | 71 + pkg/utilities/wait.ts | 18 + pnpm-lock.yaml | 5711 +++++++++++++ pnpm-workspace.yaml | 3 + scripts/nuke.sh | 9 + src/tests/helpers.test.ts | 174 - src/tests/utilities.test.ts | 144 - src/utilities/array.ts | 10 - src/utilities/index.ts | 3 - src/utilities/numbers.ts | 14 - src/utilities/time.ts | 9 - tsconfig.json | 7 +- vite.config.ts | 31 +- 202 files changed, 11901 insertions(+), 8305 deletions(-) create mode 100644 .changeset/twelve-deers-allow.md create mode 100644 .github/workflows/deploy.yml create mode 100644 .prettierignore create mode 100644 app/README.md create mode 100644 app/website/.eslintrc.cjs create mode 100644 app/website/LICENSE create mode 100644 app/website/README.md create mode 100644 app/website/env.d.ts create mode 100644 app/website/index.html create mode 100644 app/website/lightningcss-plugins.ts create mode 100644 app/website/package.json create mode 100644 app/website/public/android-chrome-192x192.png create mode 100644 app/website/public/android-chrome-512x512.png create mode 100644 app/website/public/apple-touch-icon.png create mode 100644 app/website/public/favicon.ico create mode 100644 app/website/public/favicon.svg create mode 100644 app/website/public/site.webmanifest create mode 100644 app/website/src/App.vue create mode 100644 app/website/src/assets/audio/index.ts create mode 100644 app/website/src/assets/audio/track-1.webm create mode 100644 app/website/src/assets/audio/track-2.webm create mode 100644 app/website/src/assets/audio/track-3.webm create mode 100644 app/website/src/assets/audio/track-4.webm create mode 100644 app/website/src/assets/audio/track-5.webm create mode 100644 app/website/src/assets/audio/track-6.webm create mode 100644 app/website/src/assets/svg/icon-bolt.svg create mode 100644 app/website/src/assets/svg/icon-chevron-left.svg create mode 100644 app/website/src/assets/svg/icon-chevron-right.svg create mode 100644 app/website/src/assets/svg/icon-clone-disabled.svg create mode 100644 app/website/src/assets/svg/icon-clone.svg create mode 100644 app/website/src/assets/svg/icon-close.svg create mode 100644 app/website/src/assets/svg/icon-diamonds.svg create mode 100644 app/website/src/assets/svg/icon-forward.svg create mode 100644 app/website/src/assets/svg/icon-loop.svg create mode 100644 app/website/src/assets/svg/icon-metronome.svg create mode 100644 app/website/src/assets/svg/icon-muted.svg create mode 100644 app/website/src/assets/svg/icon-once.svg create mode 100644 app/website/src/assets/svg/icon-pause.svg create mode 100644 app/website/src/assets/svg/icon-pitch.svg create mode 100644 app/website/src/assets/svg/icon-play.svg create mode 100644 app/website/src/assets/svg/icon-reverse.svg create mode 100644 app/website/src/assets/svg/icon-speed.svg create mode 100644 app/website/src/assets/svg/icon-star.svg create mode 100644 app/website/src/assets/svg/icon-unmuted.svg create mode 100644 app/website/src/assets/svg/pattern-arrows.svg create mode 100644 app/website/src/assets/svg/pattern-checkers.svg create mode 100644 app/website/src/assets/svg/pattern-diagonal.svg create mode 100644 app/website/src/assets/svg/pattern-halftone-dense.svg create mode 100644 app/website/src/assets/svg/pattern-halftone.svg create mode 100644 app/website/src/components/DragHandle.vue create mode 100644 app/website/src/components/IconAction.vue create mode 100644 app/website/src/components/IndexAction.vue create mode 100644 app/website/src/components/LabelAction.vue create mode 100644 app/website/src/components/LogoEarwurmCombo.vue create mode 100644 app/website/src/components/MuteBar.vue create mode 100644 app/website/src/components/SpeedSlider.vue create mode 100644 app/website/src/components/StackLabel.vue create mode 100644 app/website/src/components/TeardownAction.vue create mode 100644 app/website/src/components/VolumeManager.vue create mode 100644 app/website/src/components/VolumeSound.vue create mode 100644 app/website/src/components/VolumeStack.vue create mode 100644 app/website/src/components/index.ts create mode 100644 app/website/src/helpers/app.ts create mode 100644 app/website/src/helpers/classNames.ts create mode 100644 app/website/src/helpers/index.ts create mode 100644 app/website/src/helpers/vue.ts create mode 100644 app/website/src/hooks/index.ts create mode 100644 app/website/src/hooks/useMediaQuery.ts create mode 100644 app/website/src/hooks/useMetronome.ts create mode 100644 app/website/src/hooks/useMounted.ts create mode 100644 app/website/src/hooks/useSupported.ts create mode 100644 app/website/src/main.ts create mode 100644 app/website/src/primitives/InputRange.vue create mode 100644 app/website/src/primitives/MotionFadeScale.vue create mode 100644 app/website/src/primitives/MotionSlideReveal.vue create mode 100644 app/website/src/primitives/ProgressBar.vue create mode 100644 app/website/src/primitives/SquareAction.vue create mode 100644 app/website/src/primitives/SvgIcon.vue create mode 100644 app/website/src/primitives/index.ts create mode 100644 app/website/src/sections/AppFooter.vue create mode 100644 app/website/src/sections/AppHeader.vue create mode 100644 app/website/src/sections/ManagerControls.vue create mode 100644 app/website/src/sections/SoundControls.vue create mode 100644 app/website/src/sections/StackControls.vue create mode 100644 app/website/src/sections/index.ts create mode 100644 app/website/src/store/index.ts create mode 100644 app/website/src/store/useBreakpointStore.ts create mode 100644 app/website/src/store/useEarwurmStore.ts create mode 100644 app/website/src/store/useSound.ts create mode 100644 app/website/src/store/useStack.ts create mode 100644 app/website/src/store/useThemeStore.ts create mode 100644 app/website/src/styles/design-system.css create mode 100644 app/website/src/styles/global.css create mode 100644 app/website/src/styles/keyframes.css create mode 100644 app/website/src/styles/mixin.css create mode 100644 app/website/src/styles/reset.css create mode 100644 app/website/src/styles/utility.css create mode 100644 app/website/src/types/app.ts create mode 100644 app/website/src/types/index.ts create mode 100644 app/website/src/types/vue.ts create mode 100644 app/website/src/views/HomeView.vue create mode 100644 app/website/src/views/index.ts create mode 100644 app/website/tsconfig.app.json create mode 100644 app/website/tsconfig.json create mode 100644 app/website/tsconfig.node.json create mode 100644 app/website/vite.config.ts create mode 100644 docs/contributing.md create mode 100644 docs/conversion.md delete mode 100644 docs/examples-future.md create mode 100644 docs/future/examples-future.md rename docs/{ => future}/roadmap-future.md (68%) delete mode 100644 package-lock.json create mode 100644 pkg/README.md create mode 100644 pkg/earwurm/package.json rename {src => pkg/earwurm/src}/Earwurm.ts (97%) rename {src => pkg/earwurm/src}/Sound.ts (93%) rename {src => pkg/earwurm/src}/Stack.ts (97%) rename {src => pkg/earwurm/src}/index.ts (100%) rename {src => pkg/earwurm/src}/tests/Abstract.test.ts (100%) rename {src => pkg/earwurm/src}/tests/Earwurm.test.ts (99%) rename {src => pkg/earwurm/src}/tests/Sound.test.ts (99%) rename {src => pkg/earwurm/src}/tests/Stack.test.ts (99%) rename {src => pkg/earwurm/src}/tokens.ts (100%) rename {src => pkg/earwurm/src}/types.ts (88%) create mode 100644 pkg/earwurm/vite.config.ts rename {src => pkg}/helpers/fetch-audio-buffer.ts (100%) rename {src => pkg}/helpers/index.ts (80%) rename {src => pkg}/helpers/linear-ramp.ts (100%) create mode 100644 pkg/helpers/package.json rename {src => pkg}/helpers/scratch-buffer.ts (100%) create mode 100644 pkg/helpers/tests/fetch-audio-buffer.test.ts create mode 100644 pkg/helpers/tests/linear-ramp.test.ts create mode 100644 pkg/helpers/tests/scratch-buffer.test.ts create mode 100644 pkg/helpers/tests/unlock-audio-context.test.ts rename {src => pkg}/helpers/unlock-audio-context.ts (100%) rename {src/tests/mock => pkg/mocks}/MockAudioBuffer.ts (100%) rename {src/tests/mock => pkg/mocks}/MockAudioBufferSourceNode.ts (100%) rename {src/tests/mock => pkg/mocks}/MockAudioContext.ts (100%) rename {src/tests/mock => pkg/mocks}/MockAudioDestinationNode.ts (100%) rename {src/tests/mock => pkg/mocks}/MockAudioListener.ts (100%) rename {src/tests/mock => pkg/mocks}/MockAudioNode.ts (100%) rename {src/tests/mock => pkg/mocks}/MockAudioParam.ts (97%) rename {src/tests/mock => pkg/mocks}/MockAudioScheduledSourceNode.ts (100%) rename {src/tests/mock => pkg/mocks}/MockAudioWorklet.ts (100%) rename {src/tests/mock => pkg/mocks}/MockBaseAudioContext.ts (100%) rename {src/tests/mock => pkg/mocks}/MockGainNode.ts (100%) rename {src/tests/mock => pkg/mocks}/MockWorklet.ts (100%) rename {src/tests/mock => pkg/mocks}/index.ts (100%) rename {src/tests/mock => pkg/mocks}/mock-data.ts (100%) rename {src/tests/mock => pkg/mocks}/mock-utils.ts (100%) create mode 100644 pkg/mocks/package.json create mode 100644 pkg/types/index.ts create mode 100644 pkg/types/package.json create mode 100644 pkg/utilities/array.ts rename src/helpers/error-message.ts => pkg/utilities/error.ts (100%) create mode 100644 pkg/utilities/index.ts create mode 100644 pkg/utilities/number.ts create mode 100644 pkg/utilities/object.ts create mode 100644 pkg/utilities/package.json create mode 100644 pkg/utilities/random.ts create mode 100644 pkg/utilities/string.ts create mode 100644 pkg/utilities/support.ts create mode 100644 pkg/utilities/tests/array.test.ts create mode 100644 pkg/utilities/tests/error.test.ts create mode 100644 pkg/utilities/tests/number.test.ts create mode 100644 pkg/utilities/tests/object.test.ts create mode 100644 pkg/utilities/tests/random.test.ts create mode 100644 pkg/utilities/tests/string.test.ts create mode 100644 pkg/utilities/tests/support.test.ts create mode 100644 pkg/utilities/tests/time.test.ts create mode 100644 pkg/utilities/tests/wait.test.ts create mode 100644 pkg/utilities/time.ts create mode 100644 pkg/utilities/wait.ts create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100755 scripts/nuke.sh delete mode 100644 src/tests/helpers.test.ts delete mode 100644 src/tests/utilities.test.ts delete mode 100644 src/utilities/array.ts delete mode 100644 src/utilities/index.ts delete mode 100644 src/utilities/numbers.ts delete mode 100644 src/utilities/time.ts diff --git a/.changeset/config.json b/.changeset/config.json index cee6df8..64bf077 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,6 +1,6 @@ { - "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", - "changelog": "@changesets/cli/changelog", + "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", + "changelog": ["@changesets/changelog-github", {"repo": "beefchimi/earwurm"}], "commit": false, "fixed": [], "linked": [], diff --git a/.changeset/twelve-deers-allow.md b/.changeset/twelve-deers-allow.md new file mode 100644 index 0000000..01a8138 --- /dev/null +++ b/.changeset/twelve-deers-allow.md @@ -0,0 +1,5 @@ +--- +"earwurm": minor +--- + +Refactor codebase into a monorepo. diff --git a/.eslintignore b/.eslintignore index 6d476c9..4045061 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ +.nx/cache node_modules/ coverage/ dist/ diff --git a/.eslintrc b/.eslintrc index 6334999..90a4639 100644 --- a/.eslintrc +++ b/.eslintrc @@ -10,7 +10,7 @@ "project": "./tsconfig.json" }, "rules": { - "no-console": "warn", + "no-console": "error", "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/strict-boolean-expressions": "off" } diff --git a/.github/labeler.yml b/.github/labeler.yml index 787fc5a..f05843e 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,6 +1,6 @@ 🧰 Dependency: - changed-files: - - any-glob-to-any-file: 'package-lock.json' + - any-glob-to-any-file: 'pnpm-lock.yaml' πŸ“š Documentation: - changed-files: @@ -27,12 +27,17 @@ '.editorconfig', '.eslintignore', '.eslintrc', + '.eslintrc.cjs', '.gitignore', '.npmignore', '.nvmrc', + '.prettierignore', '.prettierrc', 'config/**', 'package.json', 'tsconfig.json', + 'tsconfig.*.json', 'vite.config.ts', + '**/*/env.d.ts', + '**/*/lightningcss-plugins.ts', ] diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..0d52759 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,56 @@ +name: πŸ§‘β€πŸš€ Deploy website + +# Adding `workflow_dispatch` allows us to run this +# workflow manually from the Actions tab. +on: + push: + branches: + - main + workflow_dispatch: + +# Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages. +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment. +concurrency: + group: 'pages' + cancel-in-progress: true + +# This workflow is adapted from: +# https://vitejs.dev/guide/static-deploy.html#github-pages +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: πŸ—³οΈ Checkout Repo + uses: actions/checkout@v4 + + - name: πŸ”§ Setup Node 20.x + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'pnpm' + + - name: πŸ“¦ Install dependencies + run: pnpm i + + - name: πŸ—οΈ Build projects + run: pnpm build + + - name: πŸ“„ Configure Pages + uses: actions/configure-pages@v4 + + - name: πŸ“ˆ Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: './app/website/dist' + + - name: πŸ“± Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml index c1a22cb..2f53d4e 100644 --- a/.github/workflows/labels.yml +++ b/.github/workflows/labels.yml @@ -1,4 +1,4 @@ -name: PR Labels +name: πŸ—ƒοΈ PR Labels on: [pull_request_target] jobs: @@ -10,10 +10,10 @@ jobs: pull-requests: write steps: - - name: Checkout repo + - name: πŸ—³οΈ Checkout repo uses: actions/checkout@v4 - - name: Apply PR labels + - name: 🍭 Apply PR labels uses: actions/labeler@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 26941cf..7b95976 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,4 +1,4 @@ -name: Lint +name: πŸ€– Lint on: [push] jobs: @@ -7,20 +7,26 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout repo + - name: πŸ—³οΈ Checkout repo uses: actions/checkout@v4 - - name: Setup Node 20.x to install with private scope + - name: 🧰 Configure PNPM + uses: pnpm/action-setup@v2 + + - name: πŸ”§ Setup Node 20.x uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' - cache: 'npm' + cache: 'pnpm' + + - name: πŸ“¦ Install dependencies + run: pnpm i - - name: Install dependencies - run: npm ci + - name: 🎨 Lint + run: pnpm lint - - name: Lint - run: npm run lint + - name: πŸ’„ Prettier + run: pnpm format - - name: Prettier - run: npm run format + - name: πŸ•΅οΈ Type check + run: pnpm type-check diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 101915a..4975120 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Release +name: πŸš€ Release on: push: @@ -7,28 +7,37 @@ on: jobs: release: - name: Release + name: Version and release monorepo packages runs-on: ubuntu-latest steps: - - name: Checkout Repo + - name: πŸ—³οΈ Checkout Repo uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Setup Node 20.x to install with private scope + - name: 🧰 Configure PNPM + uses: pnpm/action-setup@v2 + + - name: πŸ”§ Setup Node 20.x uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' - cache: 'npm' + cache: 'pnpm' + + - name: πŸ“¦ Install dependencies + run: pnpm i - - name: Install dependencies - run: npm ci + - name: πŸ—οΈ Build projects + run: pnpm build - - name: Create PR or publish to NPM + - name: πŸ“£ Create PR or publish to NPM id: changesets uses: changesets/action@v1 with: - publish: npm run release + title: 'πŸ¦‹ [Release] Version packages' + commit: 'πŸ¦‹ [Changesets] Prepare for next release' + version: pnpm release:version + publish: pnpm release:publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d0e63ce..1a95c6b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,4 +1,4 @@ -name: Test +name: πŸ§ͺ Test on: [push] jobs: @@ -7,17 +7,20 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout repo + - name: πŸ—³οΈ Checkout repo uses: actions/checkout@v4 - - name: Setup Node 20.x to install with private scope + - name: 🧰 Configure PNPM + uses: pnpm/action-setup@v2 + + - name: πŸ”§ Setup Node 20.x uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' - cache: 'npm' + cache: 'pnpm' - - name: Install dependencies - run: npm ci + - name: πŸ“¦ Install dependencies + run: pnpm i - - name: Test - run: npm run test + - name: πŸ§‘β€πŸ”¬ Test + run: pnpm test diff --git a/.gitignore b/.gitignore index 90b677f..e351a35 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,19 @@ Temporary Items .eslintcache .sass-cache *.tsbuildinfo +.nx/cache + +# Code editor +.vscode/* +!.vscode/extensions.json +!.vscode/settings.json +!.vscode/tasks.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? # Build build @@ -34,8 +47,7 @@ storybook-static # Environment .env -.env.test -.env.production +.env.* # Vite *.local @@ -77,7 +89,7 @@ pids .npm .yarn-integrity node_modules -web_modules/ +web_modules # Output of 'npm pack' *.tgz diff --git a/.npmignore b/.npmignore index a87f813..abebe65 100644 --- a/.npmignore +++ b/.npmignore @@ -1,30 +1,47 @@ +# This file is identical to `.gitignore`, with only a few lines +# commented-out that we do in fact want published. +# At the very end of this file are all unique additions. + scrap -# Root dotfiles +# OS files .DS_Store -.git -.babelrc -.editorconfig -.eslintignore +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk # Caches .cache .eslintcache .sass-cache *.tsbuildinfo +.nx/cache -# Dependencies -.lock-wscript -.node_repl_history -.npm -.npmignore -.pnp.* -.yarn -.yarn-integrity -package-lock.json -yarn.lock -node_modules -web_modules/ +# Code editor +# .vscode/* +# !.vscode/extensions.json +# !.vscode/settings.json +# !.vscode/tasks.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? # Build build @@ -34,8 +51,16 @@ storybook-static # Environment .env -.env.test -.env.production +.env.* + +# Vite +*.local + +# Secrets +secrets.json + +# Maps +# *.*.map # Coverage coverage @@ -56,9 +81,47 @@ assets-manifest.json bundle-report.html report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json -# Other -*.local -# *.*.map -# config -secrets.json +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Dependencies +.lock-wscript +.node_repl_history +.npm +.yarn-integrity +node_modules +web_modules + +# Output of 'npm pack' +*.tgz + +# Yarn common +.yarn/* +# !.yarn/patches +# !.yarn/plugins +# !.yarn/releases +# !.yarn/sdks +# !.yarn/versions + +# Yarn Zero-Installs +# !.yarn/cache + +# Yarn Non-Zero +.pnp.* + +# Unique additions + +.babelrc +.editorconfig +.eslintignore +.eslintrc +.npmignore +.git +.vscode +package-lock.json +pnpm-lock.yaml +yarn.lock tests diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..413dc8c --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +package-lock.json +pnpm-lock.yaml +tsconfig.json +tsconfig.*.json +.changeset/*.md diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 1083ab8..bd034ae 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -8,6 +8,10 @@ "aaron-bond.better-comments", "DavidAnson.vscode-markdownlint", "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode" + "esbenp.prettier-vscode", + "Vue.volar", + "Vue.vscode-typescript-vue-plugin", + "csstools.postcss", + "stylelint.vscode-stylelint" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 110faf4..f246340 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,7 +4,7 @@ }, "editor.formatOnSave": true, "editor.defaultFormatter": "esbenp.prettier-vscode", - "eslint.validate": ["javascript", "typescript"], + "eslint.validate": ["javascript", "typescript", "vue"], "stylelint.enable": true, "typescript.tsdk": "./node_modules/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true, diff --git a/LICENSE b/LICENSE index 900143b..168e85b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ # [ISC License](https://spdx.org/licenses/ISC) -Copyright (c) 2023, Curtis Dulmage +Copyright (c) 2024, Curtis Dulmage Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. diff --git a/README.md b/README.md index 6801fe9..23d856d 100644 --- a/README.md +++ b/README.md @@ -6,50 +6,51 @@ The intention of this library is to help make it easier to add sound effects in user interfaces. `Earwurm` solves for _modern use-cases only_. The scope of this library is small. If you require more capabilities than what this library offers, it is recommended to use the `Web Audio API` directly _(alternatively, another library that offers the features you require)_. -## Important +## Getting started -Before beginning, it is critical to understand the following: +Follow these steps to get up and running with `Earwurm`. -### File formats +**Installing the dependency:** -Since `webm` _should be_ the most compact and broadly-supported format for playing audio on the web, it is the _only format_ to be supported by this library. +```sh +# Using NPM +npm install earwurm -It is recommended to use the `opus` codec for any `webm` files used with `Earwurm`. However, `vorbis` _should work_ as well. +# Using Yarn +yarn add earwurm -Technically, you can still provide `mp3`, `wav`, and other audio files to `Earwurm`. Just don't expect this library to make accommodations for those formats if problems arise. +# Using PNPM +pnpm add earwurm +``` -### Converting audio +**Initializing a global instance:** -This documentation will not describe authoring audio and exporting it from any editing software. +```ts +import {Earwurm, type ManagerConfig} from 'earwurm'; -Quite simply, if you have existing audio files that are not already in `webm` format, you can convert them using a command-line tool called [`ffmpeg`](https://ffmpeg.org/). You can learn some audio-specific commands from the [`ffmpeg` documentation](https://ffmpeg.org/ffmpeg.html#Audio-Options). +// Optionally configure some global settings. +const customConfig: ManagerConfig = { + transitions: true, + request: {}, +}; -Using `ffmpeg`, you can select an audio file as an β€œinput source”, pass some options that tell `ffmpeg` how you want to transform the audio, and point to an β€œoutput source” to save the converted asset. +// Initialize the global audio manager. +const manager = new Earwurm(customConfig); +``` -**Good defaults for web audio:** +## Important context -The following command will take a `wav` asset and convert it to `webm`: +Before getting too deep into `Earwurm` development, it is critical to understand the following: -```sh -# Navigate to the directory with your audio assets: -cd to/directory/that/has/audio-assets +### File formats -# Convert a single audio file: -ffmpeg -i input-file.wav -dash 1 -map_metadata -1 -acodec libopus -ar 48000 -ac 2 -ab 96k -f webm output-file.webm -``` +Since `webm` _should be_ the most compact and broadly-supported format for playing audio on the web, it is the _only format_ to be supported by this library. -Here is a breakdown of the command: +It is recommended to use the `opus` codec for any `webm` files used with `Earwurm`. However, `vorbis` _should work_ as well. -- `ffmpeg`: Call the `ffmpeg` function. -- `-i {input-file.ext}`: Select a file as input. -- `-dash 1`: Create a WebM file conforming to WebM DASH specification _(may not be necessary for more use-cases)_. -- `-map_metadata -1`: Strip out metadata, resulting in a smaller file size. -- `-acodec libopus`: Use the `opus` codec. -- `-ar 48000`: Set the audio frequency. `48000hz` might be the minimum for `libopus` _(could throw an error at a lower value)_. -- `-ac 2`: Set the number of audio channels (mono = 1, stereo = 2). -- `-ab 96k`: Set the bitrate. `96k` for 2-channel `stereo` sound is probably good, but `128k` might be preferrable. -- `-f webm`: Specifiy the output format. -- `{output-file.ext}`: End with the file name _(including extension)_ you wish to save. +Technically, you can still provide `mp3`, `wav`, and other audio files to `Earwurm`. Just don't expect this library to make accommodations for those formats if problems arise. + +For help on how to convert your audio files, [check out the provided docs](./docs/conversion.md). ### Web Audio @@ -61,7 +62,7 @@ This library _only supports_ the `Web Audio API`. Interacting with `HTML5` audio ### Compatibility -This library was built for the web, and _cannot be used_ within a `node.js` project. +This library was built for the web, and _cannot be used_ within a `node.js` project, or _(presumably)_ on a server. ### Network requests @@ -69,42 +70,16 @@ At the moment, `Earwurm` expects your audio files to originate from the same dom Each sound asset is obtained via a `fetch` request. It is possible to pass an optional [`options` object for the `Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request/Request), but this can only be customized per-instance of `Earwurm`, and not for each individual asset. If asset’s require different `Request > options`, you may need to instantiate multiple instances of `Earwurm`. -## Getting started - -Follow these steps to get up and running with `Earwurm`. - -**Installing the dependency:** - -```sh -# Using NPM -npm install earwurm - -# Using Yarn -yarn add earwurm -``` - -**Initializing a global instance:** - -```ts -import {Earwurm} from 'earwurm'; -import type {ManagerConfig} from 'earwurm'; - -// Optionally configure some global settings. -const customConfig: ManagerConfig = { - transitions: true, - request: {}, -}; - -// Initialize the global audio controller. -const controller = new Earwurm(customConfig); -``` +If having more flexibility of network requests is a feature you would like to see... please get involved and help out! -### Documentation +## Documentation Please see the following links for more insight into using `Earwurm`: - [API](./docs/api.md) - [Design](./docs/design.md) - [Examples](./docs/examples.md) +- [Converting audio](./docs/conversion.md) +- [Contributing](./docs/contributing.md) - [Resources](./docs/resources.md) - [Roadmap](./docs/roadmap.md) diff --git a/app/README.md b/app/README.md new file mode 100644 index 0000000..6c856a2 --- /dev/null +++ b/app/README.md @@ -0,0 +1,24 @@ +# App directory + +All marketing and demo apps are located in this folder. + +## Eslint + +At the moment, we are allowing each `app` to manage their own `eslint` config. We may later decide to move this to the root level `.eslintrc`. If so, we should be able to clearly specify `Vue` config like so: + +```json +"overrides": [ + { + "files": "*.vue", + "parser": "vue-eslint-parser", + "extends": [ + "plugin:vue/vue3-essential", + "eslint:recommended", + "@vue/eslint-config-typescript", + "@vue/eslint-config-prettier/skip-formatting", + ], + "plugins": [], + "rules": {} + } +], +``` diff --git a/app/website/.eslintrc.cjs b/app/website/.eslintrc.cjs new file mode 100644 index 0000000..7f2569f --- /dev/null +++ b/app/website/.eslintrc.cjs @@ -0,0 +1,34 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution'); + +module.exports = { + root: true, + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-recommended', + '@vue/eslint-config-typescript', + '@vue/eslint-config-prettier/skip-formatting', + ], + parserOptions: { + ecmaVersion: 'latest', + }, + rules: { + 'no-console': 'warn', + // TODO: Get this import rule working. + // https://github.com/import-js/eslint-plugin-import/blob/HEAD/docs/rules/no-duplicates.md + /* + 'import/no-duplicates': [ + 'error', + {'prefer-inline': true}, + ], + */ + 'vue/multi-word-component-names': [ + 'error', + {ignores: ['Thumbnail', 'Tooltip']}, + ], + 'vue/no-undef-components': ['error'], + // TODO: Remove these rules once their feature is + // no longer experimental. + 'vue/no-setup-props-destructure': 'off', + }, +}; diff --git a/app/website/LICENSE b/app/website/LICENSE new file mode 100644 index 0000000..80ed4ec --- /dev/null +++ b/app/website/LICENSE @@ -0,0 +1,13 @@ +# Earwurm marketing and demo website license + +Copyright (c) 2024, Curtis Dulmage + +The `Earwurm` brand, along with all assets found in this repository / website, are property of Curtis Dulmage and are not permitted for use anywhere outside of this repository. + +Assets include any visual imagery, such as SVG files, as well as audio files. + +The code in this repository is provided as-is in an effort to help empower consumers and contributors with everything they need to benefit from the `Earwurm` library. + +Permission to use, copy, modify, and/or distribute any of the assets within this directory for any purpose with or without fee is NOT granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/app/website/README.md b/app/website/README.md new file mode 100644 index 0000000..e7afa02 --- /dev/null +++ b/app/website/README.md @@ -0,0 +1,3 @@ +# Earwurm app + +This repo hosts the website for the `earwurm` project. diff --git a/app/website/env.d.ts b/app/website/env.d.ts new file mode 100644 index 0000000..8149386 --- /dev/null +++ b/app/website/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/app/website/index.html b/app/website/index.html new file mode 100644 index 0000000..0b677f0 --- /dev/null +++ b/app/website/index.html @@ -0,0 +1,55 @@ + + + + + + + + + + + + + Earwurm App + + + + + + + +
+ + + + + + + + diff --git a/app/website/lightningcss-plugins.ts b/app/website/lightningcss-plugins.ts new file mode 100644 index 0000000..8b8a267 --- /dev/null +++ b/app/website/lightningcss-plugins.ts @@ -0,0 +1,84 @@ +import type { + CustomAtRules, + CustomAtRuleDefinition, + Visitor, +} from 'lightningcss'; + +type MixinCustomAtRules = { + mixin: CustomAtRuleDefinition; + apply: CustomAtRuleDefinition; +}; + +// Based on the SCSS mixin pattern: +// https://lightningcss.dev/transforms.html#custom-at-rules +export const mixinVisitorMap = new Map(); + +export const mixinAtRules: CustomAtRules = { + mixin: { + prelude: '', + body: 'style-block', + }, + apply: { + prelude: '', + }, +}; + +export const mixinVisitor: Visitor = { + Rule: { + custom: { + mixin(rule) { + mixinVisitorMap.set(rule.prelude.value, rule.body.value); + return []; + }, + apply(rule) { + return mixinVisitorMap.get(rule.prelude.value); + }, + }, + }, +}; + +// Based on a deprecated `--mixin {}` spec: +// https://github.com/parcel-bundler/lightningcss/blob/master/node/test/visitor.test.mjs#L292 +export const applyVisitorMap = new Map(); + +export const applyVisitor: Visitor = { + Rule: { + style(rule) { + for (const selector of rule.value.selectors) { + if ( + selector.length === 1 && + selector[0].type === 'type' && + selector[0].name.startsWith('--') + ) { + applyVisitorMap.set(selector[0].name, rule.value.declarations); + return {type: 'ignored', value: null}; + } + } + + rule.value.rules = rule.value.rules.filter((child) => { + if (child.type === 'unknown' && child.value.name === 'apply') { + for (const token of child.value.prelude) { + if ( + token.type === 'dashed-ident' && + applyVisitorMap.has(token.value) + ) { + const value = applyVisitorMap.get(token.value); + const declarations = rule.value.declarations; + + declarations.declarations.push(...value.declarations); + declarations.importantDeclarations.push( + ...value.importantDeclarations, + ); + } + } + + return false; + } + + return true; + }); + + return rule; + }, + }, +}; diff --git a/app/website/package.json b/app/website/package.json new file mode 100644 index 0000000..efa4522 --- /dev/null +++ b/app/website/package.json @@ -0,0 +1,46 @@ +{ + "name": "website", + "version": "0.0.1", + "description": "Marketing and test app for Earwurm library.", + "author": "Curtis Dulmage", + "license": "UNLICENSED", + "keywords": [ + "marketing", + "app", + "earwurm" + ], + "private": true, + "type": "module", + "engines": { + "node": ">=20.10.0", + "pnpm": ">=8.14.0" + }, + "scripts": { + "clean": "rm -rf dist && rm -rf *.tsbuildinfo", + "start": "vite", + "start:fresh": "vite --force", + "preview": "vite preview --host", + "build": "pnpm --parallel type-check && vite build", + "lint": "eslint . --ext .vue,.ts", + "lint:fix": "eslint . --fix --ext .vue,.ts", + "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false" + }, + "dependencies": { + "@earwurm/utilities": "workspace:*", + "earwurm": "workspace:*", + "vue": "^3.4.15" + }, + "devDependencies": { + "@earwurm/types": "workspace:*", + "@rushstack/eslint-patch": "^1.7.0", + "@tsconfig/node20": "^20.1.2", + "@vitejs/plugin-vue": "^5.0.3", + "@vue/eslint-config-prettier": "^9.0.0", + "@vue/eslint-config-typescript": "^12.0.0", + "@vue/tsconfig": "^0.5.1", + "eslint-plugin-vue": "^9.20.1", + "lightningcss": "^1.23.0", + "vite-plugin-svg-sprite": "^0.5.1", + "vue-tsc": "^1.8.27" + } +} diff --git a/app/website/public/android-chrome-192x192.png b/app/website/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..396943d6eba749be5705d92d7d8eb26f1114f8b1 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvG8AvYpRA>UEBm#UwTwlL_ot~a(JK&#p+fwHbJ6Yo zhC;tQCLs5~uSVyNGA$+_-z^($zzQ68|2SH*&u;eE` zqcFJ$HV|_v^WWFY7V4T-pWyhw0g~Lh{AKlXkd*@b0Y86itDB^9m(ibZLsOH?<8vT+ MPgg&ebxsLQ0958=2LJ#7 literal 0 HcmV?d00001 diff --git a/app/website/public/android-chrome-512x512.png b/app/website/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..b0816241075348a21675c453aa383755929c0519 GIT binary patch literal 712 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7+9Er6kFKIlR!#3z$e7@_3PI_rktEyWMt&z z$&=5XJv(XAqzxN3$jZv@3FDjr)RW=q;uuoF`1ZCVFO#8&>qRwVHnoF{Y-%NkH_bS} zDB-|#%<#g^sekG$!Vg964_EP=go^5~d@E)IT7ea`R);`0jjO|E2ZcvMU+$qPGW22Jqolic=;*Z~jjM zGA!={MJ$OxkRkhR_^-XMI-+bG3djoO-G28=Z5;lQXfIHC18O3fq@r0bFZ49oD!yrv PImk3mS3j3^P6( zjEszkh?q2K(&WjL@7%ewVZ(-n3m2xRr>`ja2GW1P)5S5Qg7NKb*M&@h5)Kdl+s@&g z#1Q*9sKInzf|CyemjL6oHy(~Ucjgvasvp?Cr>?c5<4&kmdO+k({dnUQS|%nYUo2mo zi%4GFU*c~f*0im;4G8$I>|4Xb3j}XjcCFm!anX1CQ&-`$K(!_&B{_vTTJ6(TI(yzN z*;AII*6-*H1lH5%%{CX6FlYqx)?ab%dicfp0tmQWijl7F0U4^-XKJ?LQKTBklr10S fJ32Z}$mTNaf1Q%9y`b?s&@T+0u6{1-oD!MJ~vF`lFo!z$Y%sG3O8Ru|jYBjU>%x|yXUVH7e*WTv{@kx9Zv6!&##iIX< z5I=m{_-=h;K`g{`y>)ZFo}QlQwK6?DOeSzcbY+lDSLd`CwIH8eEP?d>hq)zwjUb~aU4S5sD2mfa5c z`N7xM*V|lbYHFyrx7W9R2fw+wNhc>K#`ydDd+O}$r0(u+dVG8&*zNT6)EJMkK^qV} z*Vfije}BIbJ|`!Kz*`mA5o3|aels&OgfVavjI9?QV{&+SX!`*Cz)SY__G~}Z$3HVO z(;ip&Q9OYj__~T8A0H?9upgP4nv(wS%mdEdH7NL~M4TzMD!6(9O+_ z{GQwYwY4=u42KL24axQ&h7#JWmUIpEM-M&uwt^D87r{BZWkG%q7U_3#N9oGDJi?d#JVZ=W# zU2gS3>A$+VBCJ7v1?wi(ZpS~k{_o&ldw);*^YilwIbe|DC;xQwr=aS*^531E9V#p= zwD$nWox+l`vNC%=ulp0uWxxUZkT3;n#ogVVoEJKebSqnamDU%|NvtDU@!OKCn6NyLNup2LNM;qps_<8U#-U{0&Dva<3bE@Pjf zzBhS>UcEmiTsRng4b#^}^=w=J)~k#@a=36XI){kAu>Fl=OAdx(f1JGz4-ZSxeLL0t z2mhr|ZH2z5c8K^t?-BKJbz8GlyW!bn{(dz3W1pn13#lIeb^EJx!Ry(?7j&!%CJ6u0 z^}3Z!xac?&OvK;pJjukCVc6g8w-wZ>x)8I#&k?scmn{A&Pp{`xUcbCJtMw6o_c>(Z zb9($~Z*QmB*;!xG($bPL`H$WoPC1$R8;7rsiTLyLPu-TB@>|+pje}u6o5T`bKL?|? z5mcGOg@Xx-uig%a3kRd?4XVuHqGO7RijwwwlK#JEw;WHmmCm0NOTxlL{KNZg$Yjh+ i?2mIY_)sbea&Fz|)LP=!z`Bw!mK??LeRa literal 0 HcmV?d00001 diff --git a/app/website/public/favicon.svg b/app/website/public/favicon.svg new file mode 100644 index 0000000..b0d41ee --- /dev/null +++ b/app/website/public/favicon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/website/public/site.webmanifest b/app/website/public/site.webmanifest new file mode 100644 index 0000000..caf59c1 --- /dev/null +++ b/app/website/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "Earwurm", + "short_name": "Earwurm", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ebebeb", + "background_color": "#ebebeb", + "display": "standalone" +} diff --git a/app/website/src/App.vue b/app/website/src/App.vue new file mode 100644 index 0000000..c5ba473 --- /dev/null +++ b/app/website/src/App.vue @@ -0,0 +1,10 @@ + + + diff --git a/app/website/src/assets/audio/index.ts b/app/website/src/assets/audio/index.ts new file mode 100644 index 0000000..b9c6c2a --- /dev/null +++ b/app/website/src/assets/audio/index.ts @@ -0,0 +1,15 @@ +import track1 from '@/assets/audio/track-1.webm'; +import track2 from '@/assets/audio/track-2.webm'; +import track3 from '@/assets/audio/track-3.webm'; +import track4 from '@/assets/audio/track-4.webm'; +import track5 from '@/assets/audio/track-5.webm'; +import track6 from '@/assets/audio/track-6.webm'; + +export const audioPath = { + track1, + track2, + track3, + track4, + track5, + track6, +}; diff --git a/app/website/src/assets/audio/track-1.webm b/app/website/src/assets/audio/track-1.webm new file mode 100644 index 0000000000000000000000000000000000000000..2570e5040288e43745798ca540fc98d9ab1f486e GIT binary patch literal 103099 zcmb??V{|4@@NR5tH@0nUY}>Z&Z1g7C7#m~bH@0nC8{4*>oBjRoIrrZ0x6jOnIz6YS zp04WYs;6sk#5RH1!XW@q;m5E01^^*^3xE+04E8WHwi6Eh5`O`}zN-XSfP#EA(D+DH zxj(L>a&3_+Wx<$ICFUySfZYF)uv9B;zN96&wy3W@6pE7vH@TXVSHuu?^mHT#<=tYK;r-)@xMU#qgS7%)^!UPM7uOj$Ja z|JB{aWznQN(&YbWX)&Dle?Oh{h1}!|IVYQVQ~- zp$SY(JpV2(24+@PrvDlUp-7_}(H+$x00byB1ONdEc=M_!Sh1h81PJ-+G-riW7Qd;@ zh!S$(2`fWwR`AE1OAKKmcHWTcE!+M)*_Q-HlKn034ox#O*%mzBrefyd0$DOM_MJT5 zqNB)QwQ!JHD$$-tb`#n>Ua+F0P~hN7+!xWcHb)PD0-XS<13~r()0mZfYr(bGIkg`E@$AUD* z%B&0Dz5KH|#1#YMDBX~RNFoVXZ-mwpVs4vD8rjBCzz`C@)fQkf7nk*DU|A}xJ!n{J zn4&nN@Gm3{jt_v9Q2apSsu6Lub0j&9TUC=_CdZ+W@jtU$%_O`%jDS8nX@G0vOjwoPz`o*)CvklePc0-ZqwF1od? z8wl$@0=P3Ubg?hOY^m$wcyy~8lNN;UNWyMP{i3vD0M6it5^^5VldjH2NGn(Qk_~^dV5R4}m+#3aL&{a-Ac$&12gzX&qzfK+Fn1M!@-8C7$&>K9 z5KW*y!wGQhU1SF{7oE|50=Qgq$QIbTVZ_nRD%%H33VS*_n*%9hR*$px`n9gfHN&1~`-qauJL| zv247v(3v=D`iGICx9eMxakKn*!F5ijLKctKGpYQ*410Mg?Pp5Qy%>;01u2t7t&GV% z72;q-YkJrASfN+&I8(^y?!MuVE zWLv;YxwIxxn!M7%WGd3cfc)1+-)@yb2V_3#HD_Nvz?^4!FrZ&XKG+Y@7|7oBA z4_#-0Ik})%I7#GSvgs|L-Qk&Kl|sANpkhA1dkF(^`usQ2qzQ?qsAWOXp$^g)wk-gN z(w7mb*xdQYEL+!!C5Pj1dSGR$R8NwNlj_Ekl%3m)$4}qDaD%R7Z4R~cFsX-8;jog3 zW$#3?dkJm!t)?VqSCj;R%*l*X;3p3v!UL867=laRUf3O5(*nc+{_)aiwC!|$vN&CCC`8^3Qw)lJddKJe zb)4kyT7R=5e+`J{!#rT4Gv*cEcjc^MX7UNUK88<~sN}0V0tI&gAYK7)BKIn*FRVtU z;BtQPq}sd*zik`uqtIsjTfLpHTIyde%I_g8?(Vr~Kj3)3;r*lSxSvql(4p)FqVRl00pVV;hVT2d-N2hZ5y-u6PuY_HVEoW%D;%g^5s> zO+a9C1GZpV?t1sO3ppz9PMB~-YQLZPa197X-M)8rsC-&Z^)GFOm$q-v>b|>p9JK#A z^O--Nq_dHFfX!|qjJuOSkrLTFvZ&2hokods(zjHUc8w-qtZv>}dYaW1|D!_$1NYBEh+=PA{&73CBp-VRPN^r>J%+&pNw~(zr>VcJ$?wV1M-A zm@&Q4=Jg|u!Mstm(h~?Hw$-Ez(Wp*4)YW~e4%JrMofI|}qT^A+$oy4Ojf?C4qYzGM z88>~VZa<%~>gX=8x&NoApv0DRZ$1jt#PSejhD0Og-Q?_LpS0_o^w-9(?d_(n<72q2 z;By{2`PosQJZQ+ceqB;2Mm9!L)FA($V$FmoJDz0&7T3QIxPQtkN>5l*@batWzGKJd z)eJ=N%0cIKS_kA8mOU1nsUyMcAT18|0R@i$Ah`i=Lf5-2t|~1LL1UwV=C2G!F2(`< z+g=IxeDMe>p)Cc`%?hD}xTKXnVo!8}PDlqx#RRP6byHwWEXwc>_}3gN*!I{G-SQB* z>m78id#%+r$%4CdGiT;2?Cz63?dHBotcU5$SJH4q2>v(D3TC=Y&icP%js#@4wN zrAg#MET_D~1@PKSl(~-07}UBYPg4Yh81;t^*gRrh8jg7aND2kCgpwjRr2a}zo||(6 z1@8bL4PVwYj#0Pvxy_K@6q?Tb;mv%0T-IG9ii|ma6l(W}-b<+M?x3LL=REyE9*9Z? znTi}~bTy`%bwTdBm?m;MeA4G%_9g4=Z1!;e{{H zda>o^Ej9)KiM~yPFR?vCUxDvqK)_@GGn$2J3Qsx{8+z{d6S>>5!8>V~YFxxO^67mG z{a+@;E72*37ISS5eGv+L<23V=Nc3G9X%qgCK6ezlN5hBfKcRqvj{uO7fH!`Q_9gjd zn@@CiSx&2=dNo|QS+Y;g614eTxsa~3)NTun?oVAh>Es8oHrdAy&90d%5}I~!uTjU= zu_7Bac4GlC3r0$o#@W$|#h;UKhCNWHhXgnMt+2_`w}BTL*hX-?bnhFSA#zevf(o~x z_C}PUfgw^vGl2@bsV(bH8fJM{efG==o^W+z2oQhyBSr5@dff|hWg&vLmK8uyr@ch7 zv7XZ54IaareHhSND!Dz+hY1@ZaC0YJC-uYi?4Ct&?B)`s^#kNi5WZnsc=B4yP9fnZ zX~rFRpTgh=3#X0HA{2q**w09pSEfHH2y7X#9N|1nb;*tOg9 zS#!%;nM5cUQdst^ThE~4`!JJF3lmM;cRt~f@9W*6Au>q+dESjE7i(mRJUVELhWi_0 zNhn>V`FFS`-K~{|aLdy|cxk`%jq(TrYOHbWt_K%6o>SBF)<_Y5$1G{*;B-plfIBX3 zRC6GA#*7QOqi2R z+x80=gYz`(yFS5TRk9_3oq*_m-MbrsWTv&BVUVNDlTCQrF(zce2LAx`#J%VMy^LO# z%y5>+s=rEh1i@xX*S{xGp(0a0-!v$4ZpU&1Bo-(H1pvAJTHsgwB>`t`ohk$8aLC1f z6RMUfD&s7QfRl#+m*#XA<)W1s<{3o%U%GRezv?OcYm}eP7kK+~Uj(vA1O<07o zJ~O__6QXuPrnX0gRNb=>BPAAg?+`7T@t;C#He2`H5UsjBBa)blB~f3$qe&#lYuljh zS_WWn15Wbq_>z00PN~k&_kDpCwI)~ZN>%Y4?%vjF5xzjddjKfpzi{~6Wzk-{Uhnst zeEm*PKn^?j_3*L7Bs3-*aWLPW1V00e;>;!Jh9H zItg7<*6qu#&)2ZWYy4Vzx<*oan`iF5ref|&*s(5zY8>C$#P2DI7>p3tHhcy_8J z)KOee9{Knr2Tt|qtKD<{#%J^|Ijf-Je>gfiMmAGPr3TMnqwXphmY(69%e5-A_=v{nM{^#WFDo8B6j7cf&(qR6P?*TiP=Jxk3U!q z>x8lDMh@OYHBUhf_vJ<~QEjAK!xOFti-B`^b}xD=hAZM)FL(R%q%EivM;4?AR4Szl-vW|E%@Vn;Nx`KwV}U`!;y38MNFamKrHO83+d zg#3_>w5-2!6f5~aAvgf2&{xnc-xJct&me^et@Cb4wwavyek>!S-nj}Dh}8qK5%D8m zarE1-z{_A)sL#hi(s2yV*wCq0%7C6gkaOsOc!ukMqFZ;DEGyJ@@1JDf4$yv5p&LuJ zHN$TeC+xGU)k%}6>(v6SIWAm@B0hu7YD}6V(Ac^_k=#8^!_q5X;LH*#d)Y76R;%^k z+Nn-21B?uyno0j~hT*yQ&B3()c%gf_kx9eb2Lw5H7K&-VI6LLrYVEnOi{#bZu+bxt z^4-sBur*SI2UWs`ymw_enOFBLdiY~W_1O^^e@lkXes_Hk05$vEL|Zm7+*<2v^?Byo7bHvWqx@(ha@!W!WwF5Zn$ReE91(NWG1eHkLxP@*j;I;}z18AD~`9IE| zhEWYrtz@RLZEqDgMCf~D)9ZekVaL->ZAT`m-qvg!Q7>r?@JFzCdAX*=je7r0Ci90o zurn~k`TP7gi7fXze0x|~8vk{YQc*E|#lg%O$~_Hwqhf*eJ-cx)(Doa}=fE3=C}{vf z^yLyp5YN;fK!QFgK3N=_!1lItOo4Bm@%{m&1|5?RaTpmpE!uBiE|LAWFqKzdQl9CP zBQ1KXUYp!`M5F*cqM+N`*ajwzlfry&7sT+uKG;vwhEWG0Kg%tm0de^YLx@`Ryy15t ztuc?y2$JGh z^dA_1wy)K1wITMt^~#ZN68zR;NG^oQbOpNGBgDLFK)KVsMs$%edce~2t16&d;iM=K z&XqQ=$yJEbpj57H*Dn1kbQ;R#EKfZ+qd>|q2MSICK&=AaR1$c;A4UeKe#6(Rl6h)- z@!Pq`l=5&cP0;3X1HHkLwR(`Q7x{%t$6%+Er@hY6T1xA<33hJ0mV|?-OQvnUlWU>AXo{mr$u^Yd=H^>~V*Nz}?0<2eU%=#;E%9gY zIM>uiBc}3#j2lpj{iwH;8{lYbiVf6VJ+&El6SfDEmE!&~gIbdUl=&>ze9j+WBssMi zWhLRlCf3G7Z(7x_)GQBMel^nd6BGt@cfw#Iqx6?u#?T0NE{v>T+q#+hJK%RFsM4ELCiZmU3_!>8_eJA;qc|n}pXU}p^w%@H$&~Q0 z+|=xH7b^?O)(dFh^Jh28iX*AkCmDOF6ye22sFi4yE68TM|Q4rFyHqYa72`G(bNOmJ7bpE%EuQ z|9ES)QtZyT)Y%{TY>jG6(^&s>^1OE;#bnru3!m;|16Ra~t=VFIGHINdFH|yvzCV_Q z>e0OmQBW1{NbXK1XYh7S;M7pNE9rw~(J{lf$g^CiaD^ygd3%EWW+C*jqe?kZdVS`9 z5AhpAvoe{6{LkziQElPnqIV+NOuxi9N|TY!ZO>AdNXjMXEckr{J<-YB5E|dUEKu+m z0NU~uZ*E28XPbT7B`)NwmMk;!^~>gcXI`(rpN9%VLUR!}#{$Y@yEKk~!K@+C!Y5CT`c-=^+uSOOBRpIG21oe|ohQpJref__ ztorY`+s&3Kq}mb^pN)c6w(Et|qo)f5El}_i06OvY(J5+I8hi!xdfz(|ZR+VSoAzHo z{EE}oI{D;!Lyr=FAEW9hvk}l~7{IDpTyh+mZ6xOXS-Cn2lPw3c7gH|AOifj0QN^Xj z=$jtBlO%0>uyLZXeQJM-!iu!E_|^!YnrkZX!L+F_m&sYu?u=EJ$JM#~_dElCUl+1w z+BfjrIHoDa=Cz!%a~3KhDVA&yk?C6GxFmpg<3do%mCLqXcugL}VH+i8#KIO?RvWBmfXStUgnMEXn}2BXX(O?9sqyOa%v zu^h*UiN2^jQv$&@pCXjXzb8iqkevQ+67IiTeiyUvhVBxN)XM`VyYv#8L&Mxawdo0B zY06zxI#;rT_Nq4jiT9{j@D9PQ(`Dlq*>gk*f6m754>A4KGMSHMCfnGaL9|K`gs_X> zu%L*n%pR~%tA!|^Mt_UakJ=_wU}tp!`R^iQ?tavsB7>mK#nT^hY3U|zE&VHd(QWM7My&Gq=3J@&agq6WPJw%3189$@KaX|1rV^P}UJ>B{DH1CWz$4tTN2x#F zffl@tiScZxsUyMVGze+~|9cO@jQy@MDhu<#oUl5BRgW3u&!sbP_O#SUA9=uukj?hr z@*5)@aNi9)j7dWYO9*I#f)-ND$2k4=UJ+l6b=&>#3SCzO1(b)#_u05xb?_%bhN$5C zCo^o~=s&-$cb?qmO<)s1_jAB#PhIWtRp5=0;zGyn-T?()0AToEOn!VX*~ibWn~!BO zB!7cy+cZo;O`hpd)9C@*-IDzrbVAB5%+1@LYTcA((;{o-RWL|Vv-Jj_0=Y9H%XLS_ z$Ea4}(g`lQQ+DmQ)!)oMwHc7qv3(%&J3No^9f#_nWP4)eUh|mPYR^wLct*kxa7C&PnfwdR1JgLF(L(IH zVYwLAJ0=6Jem>UI&bUjWVcLQiUCk=bNOMP4+ogmbPq*|=j^V;EE^2}yNS}nbXCYao zAG?#}(QvC)s82kJc<`{y`QjJu<&UzPMX7MWp#DTXu2l6r`{h>J#txr6^=!k;1Ov`O zo@@%sqFG5eO+P;F;l-@;ha2~Yy6v$&jLk(2%Dg6cLwLWwoEuWus%%EiHzo88lZ#xL z$t#9=ztSx_Ouiqp1X?(4OZww+^6u6|`LdLa2DJut;cJ}Jtn9=X5xD@hwS#F#gJe%; zq*cy82jC;#9FBDs;#?wO@yHdiB0i=f*#fx$J1fb5$tRfDSMs@bD-SaJ=4ku(Ql~(d zKoOa$##|sdT$r}&t$@$2i_n)%zAa<=#U`m-+^|?PxXC}par-Y>7K6T1I7>mZ zZR{pQ!+R3hsX+(U!m4Jnisslc9HGNl9=G2(?dWaMkc&rA(6KV#$(RV9d^&Ka^)UeFvSIb`aaPiZM^cM6Msa=Q&g6j;8)5{^7&`X&nYx0z-Na*Ikn(p z8k3ueJ{>(#o%TyZ#+bpYW-e3}>u6nq1K+5IEpvKE%eWK+}1(S1<8 z44hdm0uG8tqFs4(rQrS8-(I9x8X?ZG!;wHX&Ni-hc(Dy+;-(p;-Y~GR`km152ExNC z@23lss0Up-@%4yllx3JYlV*1|CbWAuK%GKZ`w-7Q3oL9brJVqc}QtG!}RLO=TjA2Yq`SeWhs^X=q=tZ#3U!u-#4*%=YEaC`R zMS3vZSegW`uKmIJHAWiSbVDzX~&qV zjCe0+ApFqpO3^$wgEc(xw^(*A`0j>- z>?8u1jd^M1EixpB#&o{}#6!IJrQvHrB@2n4i~}9TLMeRN^ACKWPD>)^pAB&l$4IAD zf82f&@7y1Woh9&Y1X4rc)Yv4m8)~Yy%sszC=Y~9f$FJt9za@zJTd0cT>U!HtamiZr zUN-cXM*LjsjV1(iky!5r{v3DwUFsQj%S*SoPdxxla&TQ}>5m-Q=~HQ+zcY*?B_Z=S zspF))GmCgqgm_{6PBxfe(spEO(Oz2RQ~=p>M2;EO*pQ=+i-9@YcqS`eqbOx(aivfF zNO=tg8T4fvA0J;p#JIH?Q1BT5Rub^0LnqwAM9le2&JmA_U z_j|Cl1*CDf3+~HY)@g0@82H;G4~3riI=VX(DoK(>b3U4l=o2DddJP#MFKQ5Pn>B}F zg1brV2LrK&%USo(n49-QIlnyFd#fEd;0L`vC04SW)qT&sLKsFPyyy6q=kIS9VhBGQFGYo! z>VYQE1hn!19jozNSi#61cHMLxxF0D3PPbh1`8AVwRQ35UlmIxh=Nh=_rukY581^Tm zfSE~EQnfc9ppXmztRvvfzv=_-H&z{Q=$nSi>}J*YyCZ;I-0Rszi&FOzN+1P}ygCXo z?k`oa@k4gdNX-(9&@7snKeu!`Ksu;JkJQ>r`lnh)k?ji0ytt30EJjnrigI|=5hbB> z^99AJTFWd_5U6*V(rvtVV!f-p)955*EPmOd%y_Kh>^o)xA1i#fj|N(x?$K1BZI+GQ2lCb>@G38&Hug5^#=Rr~|Z?;~9 zd=u8|p0nt=x9ShqTa2tD2~i7vW*Rjq`Aidkl?@cE2Y}54yn!&E{$`Gpo$KD$&gsJ1 z%hrD*7g{*)MfW}_mCv$8q$el%L3bd1wgoD(&Yx!EC8xTAgfYD?7kN(k{MVPwPUZVf z8UteOw*OpM!O^#N(qHv_rUCmMVe33pzwOd}$$1uQI|yexEOyW-l5S!Kr+3qAq(>Dd z!qQw^B8kQH6Z9x+U`#Oxm*Tzg$JI7h@*aiFHAr*3v+_aD-S;uy^LER9`p*gM9-YNd zdqzK>OM!yL0I>b9)gMBfMWq{IwZx!VF5hcAA)>sQ7!aJvOB4sgsoicgd7pn@kjRWN zU03{M@p;AQ-Bsib3Q8XAZwX?r6B9q^I1Jt~AG?48*N;0(Kj#lgXy5iSL*_ zJ0|_7P;(EpBxpHl)YC&0 zK^Ir;sdPl55n;BPK(6&riGU1OhV>rh_gL?K?8KYJ21V0sXf*Edpw1?e+^Fmv6K-Kb z(N0V@jaGu?ccL0$0>qQAFohkSU^L?{%6EFT&tVWynIWqV@<3v-&1L*@S@*M} zRBpYN=LvS&%7E8scz0$SD3RAv)iM8s9ytUv{jKDg$;w=P z-as}w(6Gj8BrfBq_E)Ar3zveSa_oL27F-g_KBnTsp z+9~}gs0mV14@qSVlwkel$;*Hn$b4Ry$z99vryP}9@ghhv5?V?=G)$krThtPsn-P;0 zL@O~(#gs=LvIdEDJ%Z;BGJ)bp=_G#p!g@IP`c*r~4UPZrvoI}UXgjP|)h9xa<$0&G z`g02C#*U@M7oTi0z<%Ohu?`cm8I#h05;%Y4a2)PJnHC5LN3JMVz6TfEgxcAc+fM<& zrM{rRt;IP?$3sx0+*zCNm$vsz=STj8`fFJWBFl?3D$o_|$?mz&Z4*S2v{3ni6xs5f zuixA@$-I?2K2IB?LScB8{r6OO--{6&bZEuuoaO~$sIUG|SFP+Hx))WUF5fkrh9Mj| zZpTEE98jDmw2SH%sNlVg=a}qG-ID}GuAz)98ho( z0InDCHh3Qr<;;IrytyFnQyfUaH?9D&$KE++N+uU|HJ2z)35S6Oz32siD}m$i z6Qp8sd}Q$NoFEpGlHLuG0P(Z8b=q7ep>Jw!x{8BQEO8+0517UU-}>BHx3+3UVDPOi zzz_z9!qARP;5app+Lt5=#-U)a45!m1%^Elzef#`)>e4ky47`)p*u4U?-DqRm5!&~N zi)(S)m?*!k>GA84KW&+FY#n&FyiQ}MT&?Unds@Wu9+^yR-76Cn|feCyVpJrD{fpdBCRWm3$Dlj|Qocz)JYSbm>-N!Wy52q>2L&7PO2cq5_ z7gwCh3HK*P_i=d(Q6J>?!N>xAcNZm1Pwl&QwoTgxD>2Go9g#OP2B60xZKoFM3w zTi%%o38#H$vMEft6K2K%%Rkn-h}lm1Kjn{HkEP>GWP@w}m0N-T3V0)7FD1-kYSxKN zXuw#(Y^Q>%k>m9#{lo2t#6Xoh4en(Yw1=QX-zU~Il*Q~9iZSo7@oU$BPMidiR+~sl~|v-o!`~vP;A>RtK#Gm)F(S2s^Kg~f2eIK zJQRChWZ5fcZKqyno=3Of?{`Ea)$ATr{@LG{I5*$WK-hhvffbtidFaPX6t;4eEzp*b z@uE5O{U478p7!Oe&&tF4Z6Oy?OQ(Sg{HWIml~WQCI0rUa{F>50PGZ>AzjAO#=8jpx zNVC9&&><5FfAM zhO%Dv3c|-|ii2Cx9g#b##6srh=F%d4($7}Hg@GZL<$HT!I+B!5L87IlbMKvF7WSK_9(A(t z?sljNV!HL?xAk&;t*ZXh%At@WFzgOFwxt05&k&@FG=m}sIEo|>b_m1Z~ zSR{%BcJa?|{R}iV-Ns|j8)_>;e7i$>CzfK}abdN&!|rNiBKlVo1Sw=O@^aM*2D#EP_CP&#=877(FMm8_gXCcV0y(r6c;W3%A&4{s2*v+=~zQrCNMKz;M3-uPL8Yhw5+Aiv_Ny_Q)Dic4rdvHU#> z-cEF^BGTtr@<&`Qe9s@8%K{6+D8?(gD2UX_9D?AH>WP&NPQzji5=AjP)Rg zF{`wbJk_*C=`NA-TF;1pLg= z0D=0&ZpIMKW=~r)C+gs=O*~87&r7aPSr+JoF@5Z(s*LZ^$+bdP*-Qlby*EG9(z+bA z5Xqs<;&nciBt)0;0}=7b)#Xh@o{g8V`7FQL@x)V(ZIk>2jUNhLWVqppg=%0@<^s7T z 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�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 literal 0 HcmV?d00001 diff --git a/app/website/src/assets/audio/track-5.webm b/app/website/src/assets/audio/track-5.webm new file mode 100644 index 0000000000000000000000000000000000000000..d1f0d33c5c38ed85807f18d4addca480f174f71f GIT binary patch literal 17866 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 J@zIAyW&miRWV!$V literal 0 HcmV?d00001 diff --git a/app/website/src/assets/audio/track-6.webm b/app/website/src/assets/audio/track-6.webm new file mode 100644 index 0000000000000000000000000000000000000000..da82df4aa119f154b028cd5deb34c25831b2e169 GIT binary patch literal 20230 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 literal 0 HcmV?d00001 diff --git a/app/website/src/assets/svg/icon-bolt.svg b/app/website/src/assets/svg/icon-bolt.svg new file mode 100644 index 0000000..693a3ae --- /dev/null +++ b/app/website/src/assets/svg/icon-bolt.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/website/src/assets/svg/icon-chevron-left.svg b/app/website/src/assets/svg/icon-chevron-left.svg new file mode 100644 index 0000000..b9ff750 --- /dev/null +++ b/app/website/src/assets/svg/icon-chevron-left.svg @@ -0,0 +1,7 @@ + + + + diff --git a/app/website/src/assets/svg/icon-chevron-right.svg b/app/website/src/assets/svg/icon-chevron-right.svg new file mode 100644 index 0000000..37dd745 --- /dev/null +++ b/app/website/src/assets/svg/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/website/src/assets/svg/icon-clone-disabled.svg b/app/website/src/assets/svg/icon-clone-disabled.svg new file mode 100644 index 0000000..a1c2da6 --- /dev/null +++ b/app/website/src/assets/svg/icon-clone-disabled.svg @@ -0,0 +1,5 @@ + + + diff --git a/app/website/src/assets/svg/icon-clone.svg b/app/website/src/assets/svg/icon-clone.svg new file mode 100644 index 0000000..7da81a5 --- /dev/null +++ b/app/website/src/assets/svg/icon-clone.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/assets/svg/icon-close.svg b/app/website/src/assets/svg/icon-close.svg new file mode 100644 index 0000000..b77e839 --- /dev/null +++ b/app/website/src/assets/svg/icon-close.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/website/src/assets/svg/icon-diamonds.svg b/app/website/src/assets/svg/icon-diamonds.svg new file mode 100644 index 0000000..a0bf1ff --- /dev/null +++ b/app/website/src/assets/svg/icon-diamonds.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/app/website/src/assets/svg/icon-forward.svg b/app/website/src/assets/svg/icon-forward.svg new file mode 100644 index 0000000..b1e5a47 --- /dev/null +++ b/app/website/src/assets/svg/icon-forward.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/assets/svg/icon-loop.svg b/app/website/src/assets/svg/icon-loop.svg new file mode 100644 index 0000000..482619d --- /dev/null +++ b/app/website/src/assets/svg/icon-loop.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/assets/svg/icon-metronome.svg b/app/website/src/assets/svg/icon-metronome.svg new file mode 100644 index 0000000..9013b3b --- /dev/null +++ b/app/website/src/assets/svg/icon-metronome.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/website/src/assets/svg/icon-muted.svg b/app/website/src/assets/svg/icon-muted.svg new file mode 100644 index 0000000..5b69a06 --- /dev/null +++ b/app/website/src/assets/svg/icon-muted.svg @@ -0,0 +1,5 @@ + + + + diff --git a/app/website/src/assets/svg/icon-once.svg b/app/website/src/assets/svg/icon-once.svg new file mode 100644 index 0000000..d1193fb --- /dev/null +++ b/app/website/src/assets/svg/icon-once.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/assets/svg/icon-pause.svg b/app/website/src/assets/svg/icon-pause.svg new file mode 100644 index 0000000..1461e89 --- /dev/null +++ b/app/website/src/assets/svg/icon-pause.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/assets/svg/icon-pitch.svg b/app/website/src/assets/svg/icon-pitch.svg new file mode 100644 index 0000000..2238ef5 --- /dev/null +++ b/app/website/src/assets/svg/icon-pitch.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/website/src/assets/svg/icon-play.svg b/app/website/src/assets/svg/icon-play.svg new file mode 100644 index 0000000..8f6455a --- /dev/null +++ b/app/website/src/assets/svg/icon-play.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/website/src/assets/svg/icon-reverse.svg b/app/website/src/assets/svg/icon-reverse.svg new file mode 100644 index 0000000..e6ab010 --- /dev/null +++ b/app/website/src/assets/svg/icon-reverse.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/assets/svg/icon-speed.svg b/app/website/src/assets/svg/icon-speed.svg new file mode 100644 index 0000000..88046b0 --- /dev/null +++ b/app/website/src/assets/svg/icon-speed.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/assets/svg/icon-star.svg b/app/website/src/assets/svg/icon-star.svg new file mode 100644 index 0000000..e836165 --- /dev/null +++ b/app/website/src/assets/svg/icon-star.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/website/src/assets/svg/icon-unmuted.svg b/app/website/src/assets/svg/icon-unmuted.svg new file mode 100644 index 0000000..6222200 --- /dev/null +++ b/app/website/src/assets/svg/icon-unmuted.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/website/src/assets/svg/pattern-arrows.svg b/app/website/src/assets/svg/pattern-arrows.svg new file mode 100644 index 0000000..f8318d7 --- /dev/null +++ b/app/website/src/assets/svg/pattern-arrows.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/assets/svg/pattern-checkers.svg b/app/website/src/assets/svg/pattern-checkers.svg new file mode 100644 index 0000000..15e50ea --- /dev/null +++ b/app/website/src/assets/svg/pattern-checkers.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/assets/svg/pattern-diagonal.svg b/app/website/src/assets/svg/pattern-diagonal.svg new file mode 100644 index 0000000..cacb44d --- /dev/null +++ b/app/website/src/assets/svg/pattern-diagonal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/assets/svg/pattern-halftone-dense.svg b/app/website/src/assets/svg/pattern-halftone-dense.svg new file mode 100644 index 0000000..18617b9 --- /dev/null +++ b/app/website/src/assets/svg/pattern-halftone-dense.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/website/src/assets/svg/pattern-halftone.svg b/app/website/src/assets/svg/pattern-halftone.svg new file mode 100644 index 0000000..1fb1e79 --- /dev/null +++ b/app/website/src/assets/svg/pattern-halftone.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/website/src/components/DragHandle.vue b/app/website/src/components/DragHandle.vue new file mode 100644 index 0000000..aba4b57 --- /dev/null +++ b/app/website/src/components/DragHandle.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/app/website/src/components/IconAction.vue b/app/website/src/components/IconAction.vue new file mode 100644 index 0000000..bf0463e --- /dev/null +++ b/app/website/src/components/IconAction.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/app/website/src/components/IndexAction.vue b/app/website/src/components/IndexAction.vue new file mode 100644 index 0000000..73bf2f8 --- /dev/null +++ b/app/website/src/components/IndexAction.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/app/website/src/components/LabelAction.vue b/app/website/src/components/LabelAction.vue new file mode 100644 index 0000000..83a5ed3 --- /dev/null +++ b/app/website/src/components/LabelAction.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/app/website/src/components/LogoEarwurmCombo.vue b/app/website/src/components/LogoEarwurmCombo.vue new file mode 100644 index 0000000..5d5e3c9 --- /dev/null +++ b/app/website/src/components/LogoEarwurmCombo.vue @@ -0,0 +1,26 @@ + diff --git a/app/website/src/components/MuteBar.vue b/app/website/src/components/MuteBar.vue new file mode 100644 index 0000000..c86d247 --- /dev/null +++ b/app/website/src/components/MuteBar.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/app/website/src/components/SpeedSlider.vue b/app/website/src/components/SpeedSlider.vue new file mode 100644 index 0000000..d273e34 --- /dev/null +++ b/app/website/src/components/SpeedSlider.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/app/website/src/components/StackLabel.vue b/app/website/src/components/StackLabel.vue new file mode 100644 index 0000000..52052db --- /dev/null +++ b/app/website/src/components/StackLabel.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/app/website/src/components/TeardownAction.vue b/app/website/src/components/TeardownAction.vue new file mode 100644 index 0000000..b6d03dd --- /dev/null +++ b/app/website/src/components/TeardownAction.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/app/website/src/components/VolumeManager.vue b/app/website/src/components/VolumeManager.vue new file mode 100644 index 0000000..46407eb --- /dev/null +++ b/app/website/src/components/VolumeManager.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/app/website/src/components/VolumeSound.vue b/app/website/src/components/VolumeSound.vue new file mode 100644 index 0000000..e1788cc --- /dev/null +++ b/app/website/src/components/VolumeSound.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/app/website/src/components/VolumeStack.vue b/app/website/src/components/VolumeStack.vue new file mode 100644 index 0000000..d3ab280 --- /dev/null +++ b/app/website/src/components/VolumeStack.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/app/website/src/components/index.ts b/app/website/src/components/index.ts new file mode 100644 index 0000000..ec7fc68 --- /dev/null +++ b/app/website/src/components/index.ts @@ -0,0 +1,61 @@ +import DragHandle, {type DragHandleProps} from './DragHandle.vue'; + +import IconAction, { + type IconActionProps, + type IconActionEmits, +} from './IconAction.vue'; + +import IndexAction, { + type IndexActionProps, + type IndexActionEmits, +} from './IndexAction.vue'; + +import LabelAction, { + type LabelActionProps, + type LabelActionEmits, +} from './LabelAction.vue'; + +import LogoEarwurmCombo from './LogoEarwurmCombo.vue'; + +import MuteBar, {type MuteBarProps} from './MuteBar.vue'; + +import SpeedSlider, {type SpeedSliderProps} from './SpeedSlider.vue'; + +import StackLabel, {type StackLabelProps} from './StackLabel.vue'; + +import TeardownAction, {type TeardownActionProps} from './TeardownAction.vue'; + +import VolumeManager, {type VolumeManagerProps} from './VolumeManager.vue'; + +import VolumeSound, {type VolumeSoundProps} from './VolumeSound.vue'; + +import VolumeStack, {type VolumeStackProps} from './VolumeStack.vue'; + +export { + DragHandle, + IconAction, + IndexAction, + LabelAction, + LogoEarwurmCombo, + MuteBar, + SpeedSlider, + StackLabel, + TeardownAction, + VolumeManager, + VolumeSound, + VolumeStack, + type DragHandleProps, + type IconActionProps, + type IconActionEmits, + type IndexActionProps, + type IndexActionEmits, + type LabelActionProps, + type LabelActionEmits, + type MuteBarProps, + type SpeedSliderProps, + type StackLabelProps, + type TeardownActionProps, + type VolumeManagerProps, + type VolumeSoundProps, + type VolumeStackProps, +}; diff --git a/app/website/src/helpers/app.ts b/app/website/src/helpers/app.ts new file mode 100644 index 0000000..1ddf300 --- /dev/null +++ b/app/website/src/helpers/app.ts @@ -0,0 +1,19 @@ +import {type StackId} from 'earwurm'; + +import {SynthTypeValues, type SynthType} from '@/types'; + +export function assertSynthType(id = ''): id is SynthType { + const comparableArray: string[] = [...SynthTypeValues]; + return comparableArray.includes(id); +} + +export function assertSynthValues(keys: StackId[]): keys is SynthType[] { + return keys.every((key) => assertSynthType(key)); +} + +export function filterSynthValues(keys: StackId[]): SynthType[] { + // Using `filter()` does not appear to work. + // keys.filter((key) => assertSynthType(key)); + + return assertSynthValues(keys) ? keys : []; +} diff --git a/app/website/src/helpers/classNames.ts b/app/website/src/helpers/classNames.ts new file mode 100644 index 0000000..0c108d8 --- /dev/null +++ b/app/website/src/helpers/classNames.ts @@ -0,0 +1,36 @@ +interface Variants { + [key: string]: string | number | boolean | null | undefined; +} + +type ClassNameArgs = (Variants | string | undefined)[]; + +function convertVariantsToNames(variants?: Variants) { + return variants + ? Object.keys(variants).filter((key) => Boolean(variants[key])) + : []; +} + +export function classNames(baseName: string, ...args: ClassNameArgs) { + const additionalNames = args.length + ? args.flatMap((addition) => + typeof addition === 'string' + ? addition + : convertVariantsToNames(addition), + ) + : []; + + return [baseName, ...additionalNames.filter(Boolean)].join(' '); +} + +export function variationName( + prefix: string, + variant?: string, + styles?: CSSModuleClasses, +) { + if (!variant) return ''; + + const firstLetter = variant.charAt(0).toUpperCase(); + const className = `${prefix.toLowerCase()}${firstLetter}${variant.slice(1)}`; + + return styles ? styles[className] : className; +} diff --git a/app/website/src/helpers/index.ts b/app/website/src/helpers/index.ts new file mode 100644 index 0000000..c7a3fad --- /dev/null +++ b/app/website/src/helpers/index.ts @@ -0,0 +1,5 @@ +export {assertSynthType, assertSynthValues, filterSynthValues} from './app'; + +export {classNames, variationName} from './classNames'; + +export {toValue, tryOnScopeDispose} from './vue'; diff --git a/app/website/src/helpers/vue.ts b/app/website/src/helpers/vue.ts new file mode 100644 index 0000000..9921861 --- /dev/null +++ b/app/website/src/helpers/vue.ts @@ -0,0 +1,20 @@ +import {getCurrentScope, onScopeDispose, unref} from 'vue'; +import type {AnyFn, Fn} from '@earwurm/types'; +import type {MaybeRefOrGetter} from '@/types'; + +// Adapted from Vue Use: https://vueuse.org/ + +export function toValue(something: MaybeRefOrGetter): T { + return typeof something === 'function' + ? (something as AnyFn)() + : unref(something); +} + +export function tryOnScopeDispose(callback: Fn) { + if (getCurrentScope()) { + onScopeDispose(callback); + return true; + } + + return false; +} diff --git a/app/website/src/hooks/index.ts b/app/website/src/hooks/index.ts new file mode 100644 index 0000000..e1454a0 --- /dev/null +++ b/app/website/src/hooks/index.ts @@ -0,0 +1,4 @@ +export {useMediaQuery} from './useMediaQuery'; +export {useMetronome} from './useMetronome'; +export {useMounted} from './useMounted'; +export {useSupported} from './useSupported'; diff --git a/app/website/src/hooks/useMediaQuery.ts b/app/website/src/hooks/useMediaQuery.ts new file mode 100644 index 0000000..abdd3b8 --- /dev/null +++ b/app/website/src/hooks/useMediaQuery.ts @@ -0,0 +1,42 @@ +import {ref, watchEffect} from 'vue'; +import {supportMatchMedia} from '@earwurm/utilities'; + +import type {MaybeRefOrGetter} from '@/types'; +import {toValue, tryOnScopeDispose} from '@/helpers'; + +import {useSupported} from './useSupported'; + +// Adapted from Vue Use: https://vueuse.org/ +export function useMediaQuery(query: MaybeRefOrGetter) { + const isSupported = useSupported(supportMatchMedia); + + let mediaQuery: MediaQueryList | undefined; + const matches = ref(false); + + function handler(event: MediaQueryListEvent) { + matches.value = event.matches; + } + + function cleanup() { + if (!mediaQuery) return; + mediaQuery.removeEventListener('change', handler); + } + + const stopWatch = watchEffect(() => { + if (!isSupported.value) return; + + cleanup(); + + mediaQuery = window.matchMedia(toValue(query)); + mediaQuery.addEventListener('change', handler); + matches.value = mediaQuery.matches; + }); + + tryOnScopeDispose(() => { + stopWatch(); + cleanup(); + mediaQuery = undefined; + }); + + return matches; +} diff --git a/app/website/src/hooks/useMetronome.ts b/app/website/src/hooks/useMetronome.ts new file mode 100644 index 0000000..2e9fbfe --- /dev/null +++ b/app/website/src/hooks/useMetronome.ts @@ -0,0 +1,146 @@ +import {computed, ref} from 'vue'; +import {clamp} from '@earwurm/utilities'; + +// TODO: `volume` range may actually need to be `0-100`. +const INITIAL_VOLUME = 1; +const INITIAL_MUTE = false; + +const TONE_SEC = 0.2; +const MS_PER_MIN = 60 * 1000; + +// TODO: Implement options. +// bpm: min=40 prefrence=100 max=218 +// frequency: min=110 prefrence=440 max=880 +// type: sine, triangle, square, sawtooth +const DEFAULT_BPM = 100; +const DEFAULT_FREQ = 220; +const DEFAULT_TYPE: OscillatorType = 'sine'; + +const globalContext = new AudioContext(); + +// TODO: Research how to calculate the BPM interval. +// https://math.stackexchange.com/questions/2014169/relationship-between-bpm-tempo-and-setting-a-timer-interval +export function useMetronome() { + // TODO: This might need to consider the `globalContext` + // becoming `suspended`, and call `.resume()` if needed. + const initializedRef = ref(false); + const osciallatorRef = ref(); + + const volumeRef = ref(INITIAL_VOLUME); + const muteRef = ref(INITIAL_MUTE); + const playingRef = ref(false); + + const intervalRef = ref(0); + const intervalMs = computed(() => MS_PER_MIN / DEFAULT_BPM); + + const loopNode = globalContext.createGain(); + const gainNode = globalContext.createGain(); + + function initMetronome() { + if (initializedRef.value) return; + + const {destination, currentTime} = globalContext; + + loopNode.connect(gainNode); + gainNode.connect(destination); + + loopNode.gain.setValueAtTime(0, currentTime); + gainNode.gain.setValueAtTime(INITIAL_VOLUME, currentTime); + + initializedRef.value = true; + } + + function startOscillator() { + if (osciallatorRef.value) return; + + osciallatorRef.value = globalContext.createOscillator(); + + osciallatorRef.value.type = DEFAULT_TYPE; + osciallatorRef.value.frequency.value = DEFAULT_FREQ; + + osciallatorRef.value.connect(loopNode); + osciallatorRef.value.start(); + } + + function stopOscillator() { + if (!osciallatorRef.value) return; + + osciallatorRef.value.stop(); + osciallatorRef.value.disconnect(); + osciallatorRef.value = undefined; + } + + function sound() { + const {currentTime} = globalContext; + const peakTime = currentTime + TONE_SEC / 2; + const endTime = currentTime + TONE_SEC; + + loopNode.gain + .cancelScheduledValues(currentTime) + .setValueAtTime(0, currentTime) + .linearRampToValueAtTime(1, peakTime); + + loopNode.gain + .cancelScheduledValues(peakTime) + .setValueAtTime(1, peakTime) + .linearRampToValueAtTime(0, endTime); + } + + function loop() { + intervalRef.value = window.setInterval(sound, intervalMs.value); + } + + return { + volume: computed(() => volumeRef.value), + mute: computed(() => muteRef.value), + playing: computed(() => playingRef.value), + + setVolume(level: number) { + const oldVolume = volumeRef.value; + const newVolume = clamp(0, level, 1); + + if (oldVolume === newVolume) return; + volumeRef.value = newVolume; + if (muteRef.value) return; + + const {currentTime} = globalContext; + + gainNode.gain + .cancelScheduledValues(currentTime) + .setValueAtTime(oldVolume, currentTime) + .linearRampToValueAtTime(newVolume, currentTime); + }, + setMute(enabled: boolean) { + if (muteRef.value === enabled) return; + + muteRef.value = enabled; + + const fromValue = enabled ? volumeRef.value : 0; + const toValue = enabled ? 0 : volumeRef.value; + + const {currentTime} = globalContext; + + gainNode.gain + .cancelScheduledValues(currentTime) + .setValueAtTime(fromValue, currentTime) + .linearRampToValueAtTime(toValue, currentTime); + }, + + start() { + initMetronome(); + startOscillator(); + loop(); + + playingRef.value = true; + }, + stop() { + if (!playingRef.value) return; + + stopOscillator(); + window.clearInterval(intervalRef.value); + + playingRef.value = false; + intervalRef.value = 0; + }, + }; +} diff --git a/app/website/src/hooks/useMounted.ts b/app/website/src/hooks/useMounted.ts new file mode 100644 index 0000000..1623127 --- /dev/null +++ b/app/website/src/hooks/useMounted.ts @@ -0,0 +1,14 @@ +import {getCurrentInstance, onMounted, ref} from 'vue'; + +// Adapted from Vue Use: https://vueuse.org/ +export function useMounted() { + const isMounted = ref(false); + + if (getCurrentInstance()) { + onMounted(() => { + isMounted.value = true; + }); + } + + return isMounted; +} diff --git a/app/website/src/hooks/useSupported.ts b/app/website/src/hooks/useSupported.ts new file mode 100644 index 0000000..652c898 --- /dev/null +++ b/app/website/src/hooks/useSupported.ts @@ -0,0 +1,13 @@ +import {computed} from 'vue'; +import {useMounted} from './useMounted'; + +// Adapted from Vue Use: https://vueuse.org/ +export function useSupported(callback: () => unknown) { + const isMounted = useMounted(); + + return computed(() => { + // This useless expression is needed in order to trigger the ref. + isMounted.value; + return Boolean(callback()); + }); +} diff --git a/app/website/src/main.ts b/app/website/src/main.ts new file mode 100644 index 0000000..c6f0efa --- /dev/null +++ b/app/website/src/main.ts @@ -0,0 +1,11 @@ +import {createApp} from 'vue'; + +import './styles/global.css'; +import App from './App.vue'; + +// Required for `vite-plugin-svg-sprite` to have access to the asset. +const icons = import.meta.glob('./assets/svg/icon-*.svg'); +// eslint-disable-next-line @typescript-eslint/no-unused-vars +Object.entries(icons).forEach(async ([_key, icon]) => await icon()); + +createApp(App).mount('#VueApp'); diff --git a/app/website/src/primitives/InputRange.vue b/app/website/src/primitives/InputRange.vue new file mode 100644 index 0000000..8c04925 --- /dev/null +++ b/app/website/src/primitives/InputRange.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/app/website/src/primitives/MotionFadeScale.vue b/app/website/src/primitives/MotionFadeScale.vue new file mode 100644 index 0000000..dcd31f7 --- /dev/null +++ b/app/website/src/primitives/MotionFadeScale.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/app/website/src/primitives/MotionSlideReveal.vue b/app/website/src/primitives/MotionSlideReveal.vue new file mode 100644 index 0000000..e04ecb8 --- /dev/null +++ b/app/website/src/primitives/MotionSlideReveal.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/app/website/src/primitives/ProgressBar.vue b/app/website/src/primitives/ProgressBar.vue new file mode 100644 index 0000000..c4f24ec --- /dev/null +++ b/app/website/src/primitives/ProgressBar.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/app/website/src/primitives/SquareAction.vue b/app/website/src/primitives/SquareAction.vue new file mode 100644 index 0000000..b4042d8 --- /dev/null +++ b/app/website/src/primitives/SquareAction.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/app/website/src/primitives/SvgIcon.vue b/app/website/src/primitives/SvgIcon.vue new file mode 100644 index 0000000..35211bb --- /dev/null +++ b/app/website/src/primitives/SvgIcon.vue @@ -0,0 +1,37 @@ + + + diff --git a/app/website/src/primitives/index.ts b/app/website/src/primitives/index.ts new file mode 100644 index 0000000..f5eafd2 --- /dev/null +++ b/app/website/src/primitives/index.ts @@ -0,0 +1,35 @@ +import InputRange, {type InputRangeProps} from './InputRange.vue'; + +import MotionFadeScale, { + type MotionFadeScaleProps, +} from './MotionFadeScale.vue'; + +import MotionSlideReveal, { + type MotionSlideRevealProps, +} from './MotionSlideReveal.vue'; + +import ProgressBar, {type ProgressBarProps} from './ProgressBar.vue'; + +import SquareAction, { + type SquareActionProps, + type SquareActionEmits, +} from './SquareAction.vue'; + +import SvgIcon, {type SvgIconProps, type SvgIconId} from './SvgIcon.vue'; + +export { + InputRange, + MotionFadeScale, + MotionSlideReveal, + ProgressBar, + SquareAction, + SvgIcon, + type InputRangeProps, + type MotionFadeScaleProps, + type MotionSlideRevealProps, + type ProgressBarProps, + type SquareActionProps, + type SquareActionEmits, + type SvgIconProps, + type SvgIconId, +}; diff --git a/app/website/src/sections/AppFooter.vue b/app/website/src/sections/AppFooter.vue new file mode 100644 index 0000000..d0a3f44 --- /dev/null +++ b/app/website/src/sections/AppFooter.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/app/website/src/sections/AppHeader.vue b/app/website/src/sections/AppHeader.vue new file mode 100644 index 0000000..13c5d78 --- /dev/null +++ b/app/website/src/sections/AppHeader.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/app/website/src/sections/ManagerControls.vue b/app/website/src/sections/ManagerControls.vue new file mode 100644 index 0000000..74120e8 --- /dev/null +++ b/app/website/src/sections/ManagerControls.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/app/website/src/sections/SoundControls.vue b/app/website/src/sections/SoundControls.vue new file mode 100644 index 0000000..9d5a37f --- /dev/null +++ b/app/website/src/sections/SoundControls.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/app/website/src/sections/StackControls.vue b/app/website/src/sections/StackControls.vue new file mode 100644 index 0000000..695166d --- /dev/null +++ b/app/website/src/sections/StackControls.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/app/website/src/sections/index.ts b/app/website/src/sections/index.ts new file mode 100644 index 0000000..c5fc5cf --- /dev/null +++ b/app/website/src/sections/index.ts @@ -0,0 +1,8 @@ +import AppHeader from './AppHeader.vue'; +import AppFooter from './AppFooter.vue'; + +import ManagerControls from './ManagerControls.vue'; +import SoundControls from './SoundControls.vue'; +import StackControls from './StackControls.vue'; + +export {AppHeader, AppFooter, ManagerControls, SoundControls, StackControls}; diff --git a/app/website/src/store/index.ts b/app/website/src/store/index.ts new file mode 100644 index 0000000..3bd73d4 --- /dev/null +++ b/app/website/src/store/index.ts @@ -0,0 +1,6 @@ +export {useBreakpointStore} from './useBreakpointStore'; +export {useEarwurmStore} from './useEarwurmStore'; +export {useThemeStore} from './useThemeStore'; + +export {useStack} from './useStack'; +export {useSound} from './useSound'; diff --git a/app/website/src/store/useBreakpointStore.ts b/app/website/src/store/useBreakpointStore.ts new file mode 100644 index 0000000..8f27af9 --- /dev/null +++ b/app/website/src/store/useBreakpointStore.ts @@ -0,0 +1,12 @@ +import {computed} from 'vue'; +import {useMediaQuery} from '@/hooks'; + +const tablet = useMediaQuery('(min-width: 636px)'); +const desktop = useMediaQuery('(min-width: 960px)'); + +export function useBreakpointStore() { + return { + tablet: computed(() => tablet.value), + desktop: computed(() => desktop.value), + }; +} diff --git a/app/website/src/store/useEarwurmStore.ts b/app/website/src/store/useEarwurmStore.ts new file mode 100644 index 0000000..5ce26c6 --- /dev/null +++ b/app/website/src/store/useEarwurmStore.ts @@ -0,0 +1,102 @@ +import {computed, ref, watch} from 'vue'; +import {Earwurm} from 'earwurm'; + +import type {SynthType, SynthEntries} from '@/types'; +import {filterSynthValues} from '@/helpers'; +import {useMetronome} from '@/hooks'; +import {audioPath} from '@/assets/audio'; + +// Store design based off: +// https://vueschool.io/articles/vuejs-tutorials/state-management-with-composition-api/ +// https://vueschool.io/articles/vuejs-tutorials/home-rolled-store-with-the-vue-js-composition-api/ + +const audioLibrary: SynthEntries = [ + {id: 'strk', path: audioPath.track1}, + {id: 'clb1', path: audioPath.track2}, + {id: 'clb2', path: audioPath.track3}, + {id: 'hhts', path: audioPath.track4}, + {id: 'rmbl', path: audioPath.track5}, + {id: 'blck', path: audioPath.track6}, +]; + +export const manager = new Earwurm(); +const metroInstance = useMetronome(); + +const metronomeRef = ref(false); +const transitionsRef = ref(manager.transitions); +const managerVolumeRef = ref(manager.volume); +const managerMuteRef = ref(manager.mute); + +const activeStacksRef = ref(filterSynthValues(manager.keys)); + +manager.on('library', (newKeys) => { + activeStacksRef.value = filterSynthValues(newKeys); +}); + +watch(managerVolumeRef, (incomingVolume) => { + manager.volume = incomingVolume; + metroInstance.setVolume(manager.volume); +}); + +export function useEarwurmStore() { + return { + audioLibrary, + manager, + + /// + /// Computed state + + metronome: computed(() => metronomeRef.value), + transitions: computed(() => transitionsRef.value), + managerVolume: computed(() => managerVolumeRef.value), + managerMute: computed(() => managerMuteRef.value), + activeStacks: computed(() => activeStacksRef.value), + + /// + /// Getters + + getManagerVolumeRef() { + // Necessary for v-modal... ideally only exposing `readonly` props. + return managerVolumeRef; + }, + + /// + /// Setters + + toggleMetronome() { + metronomeRef.value = !metronomeRef.value; + + if (metronomeRef.value) { + metroInstance.start(); + } else { + metroInstance.stop(); + } + }, + toggleTransitions() { + transitionsRef.value = !transitionsRef.value; + manager.transitions = transitionsRef.value; + }, + setManagerVolume(level: number) { + managerVolumeRef.value = level; + manager.volume = managerVolumeRef.value; + metroInstance.setVolume(managerVolumeRef.value); + }, + toggleManagerMute() { + const newValue = !managerMuteRef.value; + + managerMuteRef.value = newValue; + manager.mute = newValue; + metroInstance.setMute(newValue); + }, + + /// + /// Mutations + + addStack(id: SynthType) { + if (manager.get(id)) return; + + const stackEntry = audioLibrary.find((entry) => entry.id === id); + if (stackEntry) manager.add(stackEntry); + }, + }; +} diff --git a/app/website/src/store/useSound.ts b/app/website/src/store/useSound.ts new file mode 100644 index 0000000..1c7ee27 --- /dev/null +++ b/app/website/src/store/useSound.ts @@ -0,0 +1,138 @@ +import {computed, ref, watch} from 'vue'; +import type {SoundId, SoundEventMap} from 'earwurm'; + +import type {SynthType} from '@/types'; +import {useEarwurmStore} from './useEarwurmStore'; + +const {manager} = useEarwurmStore(); + +export function useSound(id: SoundId, stackId: SynthType) { + const stack = manager.get(stackId); + const sound = stack?.get(id); + + // Initializing refs to default `Sound` values. + // Unable to use `sound.volume` because it might not exist yet. + const volumeRef = ref(1); + const muteRef = ref(false); + const progressRef = ref(0); + const speedRef = ref(1); + const loopRef = ref(false); + const pausedRef = ref(true); + + /// + /// Subscriptions + + const handleVolumeChange: SoundEventMap['volume'] = (level) => { + volumeRef.value = level; + }; + + const handleMuteChange: SoundEventMap['mute'] = (muted) => { + muteRef.value = muted; + }; + + const handleProgressChange: SoundEventMap['progress'] = ({percentage}) => { + progressRef.value = percentage; + }; + + const handleStateChange: SoundEventMap['state'] = (current) => { + const playing = current === 'playing'; + pausedRef.value = !playing; + }; + + /// + /// Teardown + + const indexPressedRef = ref(false); + + function toggleIndexPressed() { + indexPressedRef.value = !indexPressedRef.value; + } + + function teardown() { + sound?.stop(); + } + + /// + /// Mutations + + // Using `watch` instead of `sound.on('speed')` + // as it makes more sense with `v-model`. + watch(speedRef, (incomingSpeed) => { + if (!sound) return; + sound.speed = incomingSpeed; + }); + + function changeVolume(volume: number) { + if (!sound) return; + sound.volume = volume; + } + + function toggleMute() { + if (!sound) return; + sound.mute = !sound.mute; + } + + function toggleLoop() { + if (!sound) return; + + loopRef.value = !loopRef.value; + sound.loop = loopRef.value; + } + + function togglePause() { + if (!sound) return; + + if (sound.state === 'playing') { + sound.pause(); + } else { + sound.play(); + } + } + + /// + /// Actions + + function initSound() { + if (!sound) return; + + sound.on('volume', handleVolumeChange); + sound.on('mute', handleMuteChange); + sound.on('progress', handleProgressChange); + sound.on('state', handleStateChange); + } + + /// + /// Not implemented + + const reversedRef = ref(false); + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + function toggleReverse() { + reversedRef.value = !reversedRef.value; + } + + return { + volume: computed(() => volumeRef.value), + mute: computed(() => muteRef.value), + progress: computed(() => progressRef.value), + speed: computed(() => speedRef.value), + loop: computed(() => loopRef.value), + paused: computed(() => pausedRef.value), + + indexPressed: computed(() => indexPressedRef.value), + toggleIndexPressed, + teardown, + + changeVolume, + toggleMute, + toggleLoop, + togglePause, + + initSound, + + getSpeedRef() { + // Necessary for v-modal + watch patterns. + return speedRef; + }, + }; +} diff --git a/app/website/src/store/useStack.ts b/app/website/src/store/useStack.ts new file mode 100644 index 0000000..3055c64 --- /dev/null +++ b/app/website/src/store/useStack.ts @@ -0,0 +1,135 @@ +import {computed, ref, watch} from 'vue'; +import type {StackEventMap} from 'earwurm'; + +import type {SynthType} from '@/types'; +import {useEarwurmStore} from './useEarwurmStore'; + +const {addStack, manager} = useEarwurmStore(); + +function getStack(id: SynthType) { + // Using this simple get function, instead of alternatives like: + // const stack = reactive({instance: manager.get(id)}); + // const stack = computed(() => activeStacks.value.includes(id) ? manager.get(id) : undefined); + + return manager.get(id); +} + +export function useStack(id: SynthType) { + const hasStackRef = ref(manager.has(id)); + const stackKeysRef = ref(getStack(id)?.keys ?? []); + + const loadedRef = ref(false); + const maxReached = computed(() => stackKeysRef.value.length >= 4); + + // Initializing refs to default `Stack` values. + // Unable to use `stack.volume` because it might not exist yet. + const volumeRef = ref(1); + const muteRef = ref(false); + + /// + /// Subscriptions + + const handleQueueChange: StackEventMap['queue'] = (newKeys) => { + stackKeysRef.value = newKeys; + }; + + const handleMuteChange: StackEventMap['mute'] = (muted) => { + muteRef.value = muted; + }; + + /// + /// Teardown + + const teardownPressedRef = ref(false); + + function resetState() { + // If we ever change the design to use a different component + // for `Stack un-initialized` and `Stack initialized`... + // then we can remove all of this `reset` logic. + volumeRef.value = 1; + muteRef.value = false; + hasStackRef.value = manager.has(id); + + // TODO: Investigate why `.on('queue')` does not + // get called when we `remove > teardown`. + stackKeysRef.value = []; + teardownPressedRef.value = false; + } + + function toggleTeardownPressed() { + teardownPressedRef.value = !teardownPressedRef.value; + } + + function teardown() { + manager.remove(id); + resetState(); + } + + /// + /// Mutations + + // Using `watch` instead of `stack.on('volume')` + // as it makes more sense with `v-model`. + watch(volumeRef, (incomingVolume) => { + const stack = getStack(id); + if (!stack) return; + + stack.volume = incomingVolume; + }); + + function toggleMute() { + const stack = getStack(id); + if (!stack) return; + stack.mute = !stack.mute; + } + + /// + /// Actions + + async function addSound() { + const stack = getStack(id); + if (!stack || maxReached.value) return; + + await stack.prepare(); + + loadedRef.value = true; + stackKeysRef.value = stack.keys; + } + + function initStack() { + addStack(id); + + const stack = getStack(id); + if (!stack) return; + + hasStackRef.value = manager.has(id); + stack.on('queue', handleQueueChange); + stack.on('mute', handleMuteChange); + + addSound(); + } + + return { + hasStack: computed(() => hasStackRef.value), + stackKeys: computed(() => stackKeysRef.value), + loaded: computed(() => loadedRef.value), + maxReached, + + volume: computed(() => volumeRef.value), + mute: computed(() => muteRef.value), + + teardownPressed: computed(() => teardownPressedRef.value), + toggleTeardownPressed, + teardown, + + toggleMute, + + addSound, + initStack, + + getVolumeRef() { + // Necessary for v-modal + watch patterns. + return volumeRef; + }, + }; +} diff --git a/app/website/src/store/useThemeStore.ts b/app/website/src/store/useThemeStore.ts new file mode 100644 index 0000000..1cd01bf --- /dev/null +++ b/app/website/src/store/useThemeStore.ts @@ -0,0 +1,17 @@ +import {computed, ref} from 'vue'; + +type ThemeMode = 'light' | 'dark'; +const theme = ref('light'); + +function toggleTheme() { + const nextTheme = theme.value === 'light' ? 'dark' : 'light'; + theme.value = nextTheme; + document.documentElement.dataset.theme = nextTheme; +} + +export function useThemeStore() { + return { + theme: computed(() => theme.value), + toggleTheme, + }; +} diff --git a/app/website/src/styles/design-system.css b/app/website/src/styles/design-system.css new file mode 100644 index 0000000..79c849d --- /dev/null +++ b/app/website/src/styles/design-system.css @@ -0,0 +1,73 @@ +:root { + /* --- Colors --- */ + + --color-primary: #000; + --color-secondary: #ebebeb; + --color-interact: #2400ff; + --color-interact-light: #3d1fff; + --color-interact-dark: #1e00e0; + + /* --- Motion --- */ + + --duration-fast: 60ms; + --duration-normal: 120ms; + --duration-slow: 240ms; + --easing-cubic: cubic-bezier(0.6, 0, 0.2, 1); + + /* --- Typography --- */ + + --font-stack: 'Lexend Zetta', sans-serif; + + /* --- Breakpoints --- */ + + /* + * Media queries cannot use CSS variables, + * so most of these declarations are for reference only. + */ + --breakpoint-mobile-begin: 32rem; + --breakpoint-phablet-begin: 64rem; + --breakpoint-tablet-begin: 76.8rem; + --breakpoint-desktop-begin: 128rem; + --breakpoint-widescreen-begin: 144rem; + + /* --- Layout --- */ + + --app-spacing: 2.8rem; + + /* + --app-spacing-tight: 1.6rem; + --app-spacing-loose: 3.6rem; + */ + + --app-padding: 1.6rem; + --app-border-width: 0.2rem; + + --app-max-width: 84rem; + --app-full-width-mobile: calc( + var(--breakpoint-mobile-begin) - var(--app-padding) * 2 + ); + + /* Paired with inset border gives the appearance of 4px padding. */ + --action-padding: 0.6rem; + --icon-size: 2rem; + --row-height: 3.6rem; + + /* --- Patterns --- */ + /* Converter: https://www.svgbackgrounds.com/tools/svg-to-css/ */ + + --pattern-arrows-size-x: 1.6rem; + --pattern-arrows-size-y: 0.8rem; + --pattern-arrows-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 8'%3E%3Cpath d='M8 6 L12 4 L16 6V8 L12 6 L8 8 V6 Z'/%3E%3Cpath d='M0 2 L4 0 L8 2V4 L4 2 L0 4 V2 Z'/%3E%3C/svg%3E"); + + --pattern-checkers-size: 0.4rem; + --pattern-checkers-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath d='M0 0 H2 V2 H0 Z'/%3E%3Cpath d='M2 2 H4 V4 H2 Z'/%3E%3C/svg%3E"); + + --pattern-diagonal-size: 1rem; + --pattern-diagonal-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M5 0h3L0 8V5Zm5 5v3l-2 2H5Z'/%3E%3C/svg%3E"); + + --pattern-halftone-size: 0.6rem; + --pattern-halftone-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6'%3E%3Cpath d='M0 1.5 1.5 0 3 1.5 1.5 3Zm3 3L4.5 3 6 4.5 4.5 6Z'/%3E%3C/svg%3E"); + + --pattern-halftone-dense-size: 0.6rem; + --pattern-halftone-dense-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 6'%3E%3Cpath d='M0 1.5 L1.5 0 L3 1.5 L1.5 3 L0 1.5 Z'/%3E%3Cpath d='M3 4.5 L4.5 3 L6 4.5 L4.5 6 L3 4.5 Z'/%3E%3Cpath d='M3 1.5 L4.5 0 L6 1.5 L4.5 3 L3 1.5 Z'/%3E%3Cpath d='M0 4.5 L1.5 3 L3 4.5 L1.5 6 L0 4.5 Z'/%3E%3C/svg%3E"); +} diff --git a/app/website/src/styles/global.css b/app/website/src/styles/global.css new file mode 100644 index 0000000..5ee9692 --- /dev/null +++ b/app/website/src/styles/global.css @@ -0,0 +1,116 @@ +@import './reset.css'; +@import './design-system.css'; +@import './keyframes.css'; +@import './mixin.css'; +@import './utility.css'; + +html { + background-color: var(--color-secondary); + transition: font-size var(--duration-normal) var(--easing-cubic); + + @media (min-width: 960px) { + font-size: 15px; + } + + @media (min-width: 1440px) and (min-height: 1280px) { + font-size: 20px; + } +} + +body { + font-family: var(--font-stack); + text-transform: uppercase; + /* border: 0.4rem solid var(--color-primary); */ +} + +::selection { + color: var(--color-secondary); + background-color: var(--color-primary); +} + +#VueApp { + display: grid; + grid-template-rows: auto 1fr auto; + gap: var(--app-spacing); + margin-left: auto; + margin-right: auto; + padding: var(--app-spacing) var(--app-padding); + max-width: var(--app-max-width); + width: 100%; + min-height: 100vh; +} + +/* --- Components --- */ + +.collapsed-border-grid { + > *:nth-child(1n + 2) { + margin-top: calc(var(--app-border-width) * -1); + } +} + +.collapsed-border-row { + display: flex; + + > *:nth-child(1n + 2) { + margin-left: calc(var(--app-border-width) * -1); + } +} + +/* --- Patterns --- */ + +.pattern-arrows { + @apply pattern-arrows; +} + +.pattern-checkers { + @apply pattern-checkers; +} + +.pattern-diagonal { + @apply pattern-diagonal; +} + +.pattern-diagonal--animated { + animation: anim-svg-diagonal 1s infinite linear; +} + +.pattern-halftone { + @apply pattern-halftone; +} + +.pattern-halftone--animated { + animation: anim-svg-halftone 1s infinite linear; +} + +.pattern-halftone-dense { + @apply pattern-halftone-dense; +} + +/* --- Theme --- */ + +html { + transition: background-color var(--duration-slow) var(--easing-cubic); + + /* + Need to target the `body` because `html` cannot transition `filter`. + */ + > body { + filter: invert(0); + transition: filter var(--duration-slow) var(--easing-cubic); + } + + &[data-theme='dark'] { + background-color: #000; + + > body { + filter: invert(1); + } + } +} + +/* +html { + --color-primary: #f8f8f8; + --color-secondary: #181818; +} +*/ diff --git a/app/website/src/styles/keyframes.css b/app/website/src/styles/keyframes.css new file mode 100644 index 0000000..924279c --- /dev/null +++ b/app/website/src/styles/keyframes.css @@ -0,0 +1,19 @@ +@keyframes anim-svg-diagonal { + from { + background-position: 0 0; + } + to { + background-position: var(--pattern-diagonal-size) + var(--pattern-diagonal-size); + } +} + +@keyframes anim-svg-halftone { + from { + background-position: 0 0; + } + to { + background-position: var(--pattern-halftone-size) + var(--pattern-halftone-size); + } +} diff --git a/app/website/src/styles/mixin.css b/app/website/src/styles/mixin.css new file mode 100644 index 0000000..125e9bd --- /dev/null +++ b/app/website/src/styles/mixin.css @@ -0,0 +1,188 @@ +/* --- Resets --- */ + +@mixin reset-input-number { + -moz-appearance: textfield !important; + + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } +} + +@mixin reset-input-range { + cursor: pointer; + width: 100%; + + &::-webkit-slider-thumb { + appearance: none; + box-shadow: none; + } + + &::-moz-range-thumb { + border: none; + border-radius: 0; + box-shadow: none; + } +} + +@mixin reset-input-search { + &::-webkit-search-cancel-button, + &::-webkit-search-decoration, + &::-webkit-search-results-button, + &::-webkit-search-results-decoration { + display: none; + } +} + +/* --- Interaction --- */ + +@mixin interaction-disable { + pointer-events: none; + touch-action: none; + user-select: none; +} + +@mixin interaction-enable { + pointer-events: unset; + touch-action: unset; + user-select: unset; +} + +/* --- Layout --- */ + +@mixin flex-fix-width { + min-width: 0; + max-width: 100%; +} + +@mixin flex-fix-height { + min-height: 0; + max-height: 100%; +} + +/* --- Media --- */ + +@mixin media-cover { + margin: auto; + width: 100%; + height: 100%; + object-fit: cover; +} + +@mixin icon-wrapper { + display: grid; + place-items: center; + place-content: center; + flex: 0 0 auto; +} + +@mixin svg-base { + width: 100%; + height: 100%; + fill: currentColor; +} + +/* --- Typography --- */ + +@mixin line-clamp { + @supports (-webkit-line-clamp: 2) { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + } +} + +@mixin truncate { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +@mixin truncate-height-fix { + margin-bottom: 0; + padding-bottom: 0.14em; +} + +@mixin truncate-height-fix-nudge { + margin-bottom: -0.14em; + padding-bottom: 0.14em; +} + +@mixin text-box-trim { + /* A rough approximation of the future `text-box-trim` property. */ + &::before { + content: ''; + display: block; + height: 0; + width: 0; + margin-top: -0.14em; + } +} + +/* --- Position --- */ + +@mixin position-cover { + position: absolute; + inset: 0; + margin: auto; +} + +/* --- Visibility --- */ + +@mixin visible-show { + opacity: 1; + visibility: visible; + pointer-events: auto; +} + +@mixin visible-hide { + opacity: 0; + visibility: hidden; + pointer-events: none; +} + +@mixin visually-hidden { + clip: rect(0 0 0 0); + position: absolute; + overflow: hidden; + margin: -1px; + padding: 0; + width: 1px; + height: 1px; + border: 0; +} + +/* --- Patterns --- */ + +@mixin pattern-arrows { + background-image: var(--pattern-arrows-url); + background-repeat: repeat; + background-size: var(--pattern-arrows-size-x) var(--pattern-arrows-size-y); +} + +@mixin pattern-checkers { + background-image: var(--pattern-checkers-url); + background-repeat: repeat; + background-size: var(--pattern-checkers-size) var(--pattern-checkers-size); +} + +@mixin pattern-diagonal { + background-image: var(--pattern-diagonal-url); + background-repeat: repeat; + background-size: var(--pattern-diagonal-size) var(--pattern-diagonal-size); +} + +@mixin pattern-halftone { + background-image: var(--pattern-halftone-url); + background-repeat: repeat; + background-size: var(--pattern-halftone-size) var(--pattern-halftone-size); +} + +@mixin pattern-halftone-dense { + background-image: var(--pattern-halftone-dense-url); + background-repeat: repeat; + background-size: var(--pattern-halftone-dense-size) + var(--pattern-halftone-dense-size); +} diff --git a/app/website/src/styles/reset.css b/app/website/src/styles/reset.css new file mode 100644 index 0000000..8beeaeb --- /dev/null +++ b/app/website/src/styles/reset.css @@ -0,0 +1,151 @@ +/* + * The new CSS reset: v1.8.4 (last updated 14.2.2023) + * https://github.com/elad2412/the-new-css-reset +*/ + +*:where( + :not(html, iframe, canvas, img, svg, video, audio):not(svg *, symbol *) + ) { + all: unset; + display: revert; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +:where([hidden]) { + display: none; +} + +:where([contenteditable]:not([contenteditable='false'])) { + -moz-user-modify: read-write; + -webkit-user-modify: read-write; + overflow-wrap: break-word; + -webkit-line-break: after-white-space; + -webkit-user-select: auto; +} + +:where([draggable='true']) { + -webkit-user-drag: element; +} + +:where(dialog:modal) { + all: revert; +} + +:where(pre) { + all: revert; +} + +::placeholder { + color: unset; +} + +::marker { + content: initial; +} + +img { + max-inline-size: 100%; + max-block-size: 100%; +} + +a, +button { + cursor: pointer; +} + +ol, +ul, +menu { + list-style: none; +} + +table { + border-collapse: collapse; +} + +input, +textarea { + -webkit-user-select: auto; +} + +textarea { + white-space: revert; +} + +meter { + -webkit-appearance: revert; + appearance: revert; +} + +/* --- Custom resets --- */ + +html { + font-family: Avenir, 'Avenir Next LT Pro', Montserrat, Corbel, 'URW Gothic', + source-sans-pro, sans-serif; + font-size: 10px; + font-display: swap; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: geometricPrecision; +} + +html:focus-within { + scroll-behavior: smooth; +} + +html, +body { + min-height: 100%; +} + +code { + font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, + 'DejaVu Sans Mono', monospace; +} + +svg:not(:root) { + overflow: hidden; +} + +p, +h1, +h2, +h3, +h4, +h5, +h6 { + overflow-wrap: break-word; +} + +img, +svg, +canvas, +picture, +video { + display: block; + max-width: 100%; +} + +input, +button, +textarea, +select { + font: inherit; +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} diff --git a/app/website/src/styles/utility.css b/app/website/src/styles/utility.css new file mode 100644 index 0000000..0d148ec --- /dev/null +++ b/app/website/src/styles/utility.css @@ -0,0 +1,90 @@ +/* --- Resets --- */ + +.reset-input-number { + @apply reset-input-number; +} + +.reset-input-range { + @apply reset-input-range; +} + +.reset-input-search { + @apply reset-input-search; +} + +/* --- Interaction --- */ + +.interaction-disable { + @apply interaction-disable; +} + +.interaction-enable { + @apply interaction-enable; +} + +/* --- Layout --- */ + +.flex-fix-width { + @apply flex-fix-width; +} + +.flex-fix-height { + @apply flex-fix-height; +} + +/* --- Media --- */ + +.media-cover { + @apply media-cover; +} + +.icon-wrapper { + /* It is expected to pass `.svg-base` to the direct child. */ + @apply icon-wrapper; +} + +.svg-base { + @apply svg-base; +} + +/* --- Typography --- */ + +.line-clamp { + @apply line-clamp; +} + +.truncate { + @apply truncate; +} + +.truncate-height-fix { + @apply truncate-height-fix; +} + +.truncate-height-fix-nudge { + @apply truncate-height-fix-nudge; +} + +.text-box-trim { + @apply text-box-trim; +} + +/* --- Position --- */ + +.position-cover { + @apply position-cover; +} + +/* --- Visibility --- */ + +.visible-show { + @apply visible-show; +} + +.visible-hide { + @apply visible-hide; +} + +.visually-hidden { + @apply visually-hidden; +} diff --git a/app/website/src/types/app.ts b/app/website/src/types/app.ts new file mode 100644 index 0000000..35084da --- /dev/null +++ b/app/website/src/types/app.ts @@ -0,0 +1,19 @@ +import type {LibraryEntry} from 'earwurm'; + +export const SynthTypeValues = [ + 'strk', + 'clb1', + 'clb2', + 'hhts', + 'rmbl', + 'blck', +] as const; +export type SynthType = (typeof SynthTypeValues)[number]; + +export interface SynthEntry extends LibraryEntry { + id: SynthType; + path: string; +} + +// More precicely typed `LibraryEntry[]`. +export type SynthEntries = SynthEntry[]; diff --git a/app/website/src/types/index.ts b/app/website/src/types/index.ts new file mode 100644 index 0000000..75dc83d --- /dev/null +++ b/app/website/src/types/index.ts @@ -0,0 +1,8 @@ +export { + SynthTypeValues, + type SynthType, + type SynthEntry, + type SynthEntries, +} from './app'; + +export type {MaybeRef, MaybeRefOrGetter} from './vue'; diff --git a/app/website/src/types/vue.ts b/app/website/src/types/vue.ts new file mode 100644 index 0000000..359af30 --- /dev/null +++ b/app/website/src/types/vue.ts @@ -0,0 +1,4 @@ +import type {Ref} from 'vue'; + +export type MaybeRef = T | Ref; +export type MaybeRefOrGetter = MaybeRef | (() => T); diff --git a/app/website/src/views/HomeView.vue b/app/website/src/views/HomeView.vue new file mode 100644 index 0000000..be1c3d3 --- /dev/null +++ b/app/website/src/views/HomeView.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/app/website/src/views/index.ts b/app/website/src/views/index.ts new file mode 100644 index 0000000..d601356 --- /dev/null +++ b/app/website/src/views/index.ts @@ -0,0 +1,3 @@ +import HomeView from './HomeView.vue'; + +export {HomeView}; diff --git a/app/website/tsconfig.app.json b/app/website/tsconfig.app.json new file mode 100644 index 0000000..1a0ad1f --- /dev/null +++ b/app/website/tsconfig.app.json @@ -0,0 +1,11 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "compilerOptions": { + "composite": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/app/website/tsconfig.json b/app/website/tsconfig.json new file mode 100644 index 0000000..6241a9d --- /dev/null +++ b/app/website/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + {"path": "./tsconfig.node.json"}, + {"path": "./tsconfig.app.json"} + ] +} diff --git a/app/website/tsconfig.node.json b/app/website/tsconfig.node.json new file mode 100644 index 0000000..a7d3c50 --- /dev/null +++ b/app/website/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "extends": "@tsconfig/node20/tsconfig.json", + "include": ["lightningcss-plugins.ts", "vite.config.ts"], + "compilerOptions": { + "composite": true, + "module": "esnext", + "moduleResolution": "bundler", + "types": ["node"] + } +} diff --git a/app/website/vite.config.ts b/app/website/vite.config.ts new file mode 100644 index 0000000..bb30b9c --- /dev/null +++ b/app/website/vite.config.ts @@ -0,0 +1,46 @@ +import {fileURLToPath, URL} from 'node:url'; + +import {defineConfig} from 'vite'; +import vue from '@vitejs/plugin-vue'; +import createSvgSpritePlugin from 'vite-plugin-svg-sprite'; + +import {mixinAtRules, mixinVisitor} from './lightningcss-plugins'; + +export default defineConfig({ + base: '/earwurm/', + build: { + cssMinify: 'lightningcss', + // minify: false, + }, + css: { + transformer: 'lightningcss', + lightningcss: { + drafts: { + customMedia: true, + }, + // targets: browserslistToTargets(browserslist('>= 0.25%')), + + // @ts-ignore: No overloads + customAtRules: mixinAtRules, + visitor: mixinVisitor, + + // It would be ideal if we could tree-shake unused utility classes. + // Lightning CSS is not able to determine this by itself. + // unusedSymbols: ['foo', '--bar'] + }, + }, + plugins: [ + // TODO: These features should be removed once they are no longer "experimental". + vue({ + script: { + propsDestructure: true, + }, + }), + createSvgSpritePlugin({svgo: false}), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, +}); diff --git a/config/tests-setup.ts b/config/tests-setup.ts index 65fd092..3d48653 100644 --- a/config/tests-setup.ts +++ b/config/tests-setup.ts @@ -6,7 +6,7 @@ import { MockAudioContext, MockAudioNode, MockAudioParam, -} from '../src/tests/mock'; +} from '../pkg/mocks'; // We may need to stub more globals as we encounter // errors during testing. diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 0000000..6ea80de --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,82 @@ +# Contributing + +> Come one, come all! Your help is needed in making `Earwurm` better than it has any right to be! + +First of all, thank you. Second of all, [issues can be found here](https://github.com/beefchimi/earwurm/issues). + +## Getting started + +1. Clone repo. +2. Install dependencies _(must use `pnpm`)_. +3. Get coding! + +**Cloning the repo:** + +```sh +# Over HTTPS +git clone https://github.com/beefchimi/earwurm.git + +# Over SSH +git clone git@github.com:beefchimi/earwurm.git + +# Using the CLI +gh repo clone beefchimi/earwurm + +# Once cloned, change into the directory +cd earwurm +``` + +**Installing project dependencies:** + +```sh +# PNPM is our package manager of choice and must be used! +pnpm i +``` + +**Get coding:** + +```sh +# Simply run the `start` command from the project root +pnpm start +``` + +For a list of all the available commands, please see the root `package.json`. Overall, commands are kept simple, so there shouldn't be any surprises. Typically, the commands you are going to use are: + +- `build` will build all packages and apps. +- `start` will build and watch any relevant `pkg` folders, and build and fire up development servers for all `app` folders. + - All `localhost` addresses for running apps will be printed to your terminal when you run `start`. +- `lint` checks the codebase for `eslint` errors, but does not fix them. +- `lint:fix` automatically fixes any `eslint` errors that can be programatically resolved. +- `format` checks the codebase for `prettier` errors, but does not fix them. +- `format:fix` automatically fixes any `prettier` errors that can be programatically resolved. +- `type-check` checks the codebase for any TypeScript errors, but does not fix them. +- `test` fires up the `vitest` server and runs all `*.test.ts` files. +- `clean` will delete any `dist` and `coverage` folders. +- `nuke` will run `clean` along with blowing away all `node_modules` and pruning unused `pnpm` packages. + +If you want to run commands from specific apps/packages, you can use `pnpm --filter app-or-package-name command-name`... but honestly, you should be able to do everything you need to from the root using only the commands found in the root `package.json`. + +## Earwurm + +The primary package produced by this monorepo is `earwurm`, located within the `~/pkg/earwurm` directory. + +### Pull requests + +Once you have submitted a PR and it is ready for review: + +1. Run the `pnpm report` command and respond to the prompts. + - Declare the β€œchange impact” _(is this a major/minor/patch change)_. + - Provide a `CHANGELOG` message. +2. Once finished, add the generated `*.md` file and commit it / push to your branch. + +### Publishing + +Publishing is handled automatically by the `@changesets` package. This package, in concert with Changesets Bot and `release.yml` GitHub workflow, allows us to publish `earwurm` whenever the `main` branch sees a `package.json > version` value change. + +## App + +To aid in local development, I have provided a demo application. This app doubles as our β€œmarketing site”, which is also built-and-deployed through GitHub. + +### Development + +Simply run the `start` command from the project root and you will get file watching for `pkg/earwurm` as well as HMR for the app. Any changes you make to `earwurm` are automatically available to the demo app. diff --git a/docs/conversion.md b/docs/conversion.md new file mode 100644 index 0000000..8e1cac3 --- /dev/null +++ b/docs/conversion.md @@ -0,0 +1,32 @@ +# Converting audio + +This documentation will NOT describe how to record audio and export it from any editing software. + +Quite simply, if you have existing audio files that are not already in `webm` format, you can convert them using a command-line tool called [`ffmpeg`](https://ffmpeg.org/). You can learn some audio-specific commands from the [`ffmpeg` documentation](https://ffmpeg.org/ffmpeg.html#Audio-Options). + +Using `ffmpeg`, you can select an audio file as an β€œinput source”, pass some options that tell `ffmpeg` how you want to transform the audio, and point to an β€œoutput source” to save the converted asset. + +**Good defaults for web audio:** + +The following command will take a `wav` asset and convert it to `webm`: + +```sh +# Navigate to the directory with your audio assets: +cd to/directory/that/has/audio-assets + +# Convert a single audio file: +ffmpeg -i input-file.wav -dash 1 -map_metadata -1 -acodec libopus -ar 48000 -ac 2 -ab 96k -f webm output-file.webm +``` + +**Here is a breakdown of the command:** + +- `ffmpeg`: Call the `ffmpeg` function. +- `-i {input-file.ext}`: Select a file as input. +- `-dash 1`: Create a WebM file conforming to WebM DASH specification _(may not be necessary for more use-cases)_. +- `-map_metadata -1`: Strip out metadata, resulting in a smaller file size. +- `-acodec libopus`: Use the `opus` codec. +- `-ar 48000`: Set the audio frequency. `48000hz` might be the minimum for `libopus` _(could throw an error at a lower value)_. +- `-ac 2`: Set the number of audio channels (mono = 1, stereo = 2). +- `-ab 96k`: Set the bitrate. `96k` for 2-channel `stereo` sound is probably good, but `128k` might be preferrable. +- `-f webm`: Specifiy the output format. +- `{output-file.ext}`: End with the file name _(including extension)_ you wish to save. diff --git a/docs/examples-future.md b/docs/examples-future.md deleted file mode 100644 index b80e239..0000000 --- a/docs/examples-future.md +++ /dev/null @@ -1,139 +0,0 @@ -# Future examples - -This document simply sets aside some code examples that serve as an expectation for a future implementation. - -**Stopping after an elapsed play time:** - -```ts -const bananaStack = manager.get('Banana'); -const bananaSound = await bananaStack.prepare(); - -// We will store the result of calling `.play()` and `.stop()`, -// but you can also access the `bananaSound?.state` property -// to know when a sound is actively `playing`. -let isPlaying = false; -let completion = '0%'; - -if (bananaSound) { - bananaSound.play(); - - isPlaying = bananaSound.playing; - - bananaSound.on('progress', ({elapsed, progress}) => { - if (progress === 50) bananaSound.stop(); - - // This is a silly example of using `elapsed`. Realistically, - // you would simply check if `progress >= 50`. - const isHalfway = elapsed === Math.min(0, bananaSound.duration / 2); - - // `progress` is returning a value between `0` and `100`. - // Example: `elapsed / duration * 100`. - completion = `${progress}%`; - }); - - bananaSound.on('ended', () => { - console.log(`Audio is ${completion} completed`); - }); -} -``` - -**Looping audio:** - -We can easily toggle a `Sound` to β€œloop indefinitely” by the `sound.loop` accessor. - -```tsx -const appleStack = manager.get('Apple'); -const appleSound = await appleStack?.prepare(); - -let playCount = 0; -appleSound.loop = true; - -// Increment `playCount` by `1` each time a loop is completed. -appleSound?.on('loop', () => playCount++); -``` - -**Restarting a playing `Sound`:** - -However, it is worth remembering that each call to `.play()` creates a new instance of a `Sound`. If doing so is a problem, and you need to reference / re-use an existing sound, you can alternatively call `.seek()` on the actively playing sound. - -```tsx -const restartStack = manager.get('MySound'); -let sound = restartStack.prepare(); - -async function handleRestartPlay() { - // Early return if the `Promise` has not resolved. - if (!sound?.id) return; - - // Simply call `.play()` if the sound has - // never been played yet. - if (sound.state === 'created') { - return sound.play(); - } - - // Check if the `Sound` is `playing`, and if so, - // return the β€œplay position” back to the beginning. - if (sound.playing) { - return sound.seek(0); - } - - // Otherwise, we need to re-create the sound - // and play it once ready. - sound = restartStack.prepare(); - const restarted = await sound.play(); - return restarted; -} - -return ; -``` - -**Managing a `Sound` queue:** - -The problem with the β€œOne-at-a-time” pattern is that it prevents adding a `Sound` to the `stack.queue` if `state` is `playing`. If the behaviour you _really want_ is to queue up a sound to play as soon as `state` is no longer `playing`, you can utilize the β€œWait-your-turn pattern”: - -```tsx -// 1. Listen for `queuechange` on the `stack`. -// - Need to `emit` a new event that returns an array of `keys`. -// 2. Prepare a sound. -// - Prevent adding more sounds if `keys.length` exceeds `max`. -// 3. When the `queue` has changed: -// - Get the first sound in the `queue` and call `.play()` - -const stack = manager.get('MySound'); - -function handleQueueChange(keys: SoundId[]) { - if (!stack || !stack.keys.length) return; - - const firstId = stack.keys[0]; - const firstSound = stack.get(firstId); - - firstSound.play(); -} - -stack?.on('queuechange', (keys) => handleQueueChange(keys)); - -async function handleQueuedPlay() { - if (!stack || stack.keys.length >= tokens.maxStackSize) return; - - const sound = await stack.prepare(); - return sound; -} - -return ; -``` - -**Using audio sprites:** - -With each individual audio file comes an individual network request. - -Depending on the scope of sound effects you are using, it might be wise to use a β€œsprite”. This is a technique of spacing out individual sound effects within a single file, allowing you to condense multiple small requests into one large request. - -> It is up to you to determine where and when to use an audio sprite, as there are many factors to consider. - -```tsx -// Capture each sound embedded within the sprite by -// targeting each sound’s start/end time. This will -// require you to know the exact timestamp of each sound. -const beepSound = manager.get('Sprite')?.range(0, 900); -const oinkSound = manager.get('Sprite')?.range(1000, 2200); -const woofSound = manager.get('Sprite')?.range(2300, 3000); -``` diff --git a/docs/examples.md b/docs/examples.md index 21c08d8..9bc41fa 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -8,34 +8,39 @@ The following examples should help demonstrate _most of the_ common use cases fo **Initialization:** -In order to start making noise, we need to have a `Earwurm` instance to work with. +In order to start making noise, we will need to have an `Earwurm` instance to work with. ```ts +// Initialize the β€œmanager”. const manager = new Earwurm(); manager.add({id: 'MyStack', path: 'path/to/my/sound.webm'}); +// Now play some sounds! const stack = manager.get('MyStack'); +const sound = await stack?.prepare(); + +sound?.play(); ``` **Enabling autoplay:** Most browsers will intentionally block audio from playing automatically. The user should not be caught off guard with unwanted noise… annoying advertisements be damned! Any media should be explicitly initialized by the user. -With that said, sometimes you just _need to autoplay audio_. In that case, you likely need to β€œunlock” the ability to play audio. +With that said, sometimes we just _need to autoplay audio_. In that case, we likely need to β€œunlock” the ability to play audio. ```ts // It is safe to call `unlock()` even if the browser // has already β€œunlocked” the `AudioContext`. manager.unlock(); -// You can always check `unlocked` status before +// We can always check `unlocked` status before // performing an audio action. -if (manager.unlocked) stack.play(); +if (manager.unlocked) sound?.play(); ``` **Adding entries:** -You can add as few as `1` new `Stack` at a time. +We can add as few as `1` new `Stack` at a time. ```ts // Add one new `Stack` entry. @@ -70,14 +75,14 @@ manager.add( **Removing entries:** -Similarly, we can remove entries that we have already added: +Similarly, we can remove any entries that have already been added: ```ts // Remove one entry at a time, referencing the `id` // that was used when added. manager.remove('SomeStack'); -// If you call `.remove()` on an `id` that does not exist, +// If we call `.remove()` on an `id` that does not exist, // the result will simply be an empty array. // > [] @@ -101,10 +106,10 @@ const appleSound = await appleStack?.prepare(); // It is possible that we have asked for an `id` that // does not exist, so we will guard against `undefined`. if (appleSound) { - appleSound.volume(0.8); + appleSound.volume = 0.8; appleSound.play(); - // We only wanted this sound to play once, - // so go ahead and remove it after it has ended. + // We only wanted this `Stack > Sound` to play once, + // so we remove the entire `Stack` once it has ended. appleSound.on('ended', () => manager.remove('Apple')); } @@ -117,9 +122,37 @@ const durationBuffer = 100; setTimeout(() => appleSound?.play(), appleSoundDuration + durationBuffer); ``` +The creation of a sound is asynchronous, which means we need to wait for it to be β€œready” before we can perform actions on it. There are two patterns for this: + +```ts +// Await the sound assignment as it is being prepared. +const sound1 = await stack?.prepare(); +if (sound1) sound1.play(); + +// Or, perform our action as a `.then()` callback. +const sound2 = stack?.prepare(); +if (sound2) sound2.then((soundInstance) => soundInstance.play()); +``` + **Determining state values:** -While there is a dedicated `playing` property, you can obtain a more granular `state` by listening for the `state` event and checking the `state` property directly. +A `Stack` instance will have a dedicated `playing` property to help identify if _atleast one contained `Sound`_ is actively β€œplaying”. + +Additionally, the `state` property is exposed which can give us a better idea of what the current state is. + +If we want real time updates, we can subscribe to the `state` change event instead. + +```ts +// Get a `true` or `false` value. +const isPlaying = stack.playing; + +// Or get a string value for the current state. +const currentState = stack.state; + +stack.on('state', (currentState) => console.log(currentState)); +``` + +Many of the same rules apply to a `Sound` instance. ```ts let capturedState = sound.state; @@ -135,13 +168,13 @@ sound.on('state', (state) => { As discussed in the `Design` document, sounds within the `AudioContext` are β€œone-and-done”. A `Sound` is β€œdestroyed” upon completion. -Depending on your needs, you can tailor the behaviour in several ways. +Depending on our needs, we can tailor the behaviour in several ways. **Allowing sounds to overlap:** -Every time you make a call to `.prepare()`, you β€œcreate a new instance” of that `Sound` within the `Stack`. After calling `.play()`, that `Sound` then β€œexpires” and is removed from the `Stack` upon completion _(or call to `.stop()`)_. +Every time we make a call to `.prepare()`, we β€œcreate a new instance” of that `Sound` within the `Stack`. After calling `.play()`, that `Sound` then β€œexpires” and is removed from the `Stack` upon completion _(or call to `.stop()`)_. -Depending on the `duration` of the `Sound`, rapid consecutive calls to `.prepare()` followed by `.play()` will create a β€œstack of sounds” that overlap. If this is your intention, then implemention is very simple. +Depending on the `duration` of the `Sound`, rapid consecutive calls to `.prepare()` followed by `.play()` will create a β€œstack of sounds” that overlap. If this is our intention, then implemention is very simple. This is referred to as the β€œOverlapping pattern”: @@ -151,8 +184,8 @@ const overlapStack = manager.get('MyStack'); async function handleOverlappingPlay() { if (!overlapStack) return; - const sound = overlapStack.prepare(); - const playedSound = await sound.play(); + const sound = await overlapStack.prepare(); + const playedSound = sound.play(); return playedSound; } @@ -162,9 +195,9 @@ return ; **Restricting a `Sound` to a single instance:** -If you do not want consecutive plays of a `Sound` to overlap, you can restrict the `Stack` to allow only a single `Sound` in the `queue` at once. Simply checking for `stack.keys.length` will let you know how many sounds have been queued up. +If we do not want consecutive plays of a `Sound` to overlap, we can restrict the `Stack` to allow only a single `Sound` in the `queue` at once. Simply checking for `stack.keys.length` will let us know how many sounds have been queued up. -In this example, we will avoid additional calls to `.prepare()` if the `queue` exceeds `1`. This is refferd to as the β€œOne-at-a-time pattern”: +In this example, we will avoid additional calls to `.prepare()` if the `queue` exceeds `1`. This is referred to as the β€œOne-at-a-time pattern”: ```tsx const singleStack = manager.get('MyStack'); @@ -174,8 +207,8 @@ const singleStack = manager.get('MyStack'); async function handleSinglePlay() { if (!singleStack || singleStack.keys.length >= 1) return; - const sound = singleStack.prepare(); - const playedSound = await sound.play(); + const sound = await singleStack.prepare(); + const playedSound = sound.play(); return playedSound; } @@ -183,7 +216,7 @@ async function handleSinglePlay() { return ; ``` -It could be that there are sounds in the `queue` that were paused. You might decide to clear out any non-playing sounds whenever a new call to `.play()` is requested. +It could be that there are sounds in the `queue` that were paused. We might decide to clear out any non-playing sounds whenever a new call to `.play()` is requested. ```tsx async function handleSinglePlay() { @@ -197,8 +230,8 @@ async function handleSinglePlay() { singleStack.stop(); } - const sound = singleStack.prepare(); - const playedSound = await sound.play(); + const sound = await singleStack.prepare(); + const playedSound = sound.play(); return playedSound; } @@ -215,12 +248,12 @@ const restartStack = manager.get('MyStack'); // will stop then restart the `Sound`. function handleRestartPlay() { if (!restartStack) return; - // If you are treating this as a β€œsingle instance sound”, + // If we are treating this as a β€œsingle instance sound”, // then it is fine to call `.stop()` on an already "stopped" `Stack`. restartStack.stop(); - const sound = restartStack.prepare(); - const playedSound = await sound.play(); + const sound = await restartStack.prepare(); + const playedSound = sound.play(); return playedSound; } @@ -230,7 +263,7 @@ return ; **Restricting a specific `Sound` in the `Stack`:** -If you are re-using the same `Sound` in multiple places throughout the app, it could be beneficial to re-use the same variable reference. +If we are re-using the same `Sound` in multiple places throughout the app, it could be beneficial to re-use the same variable reference. Here is another example of the β€œOne-at-a-time pattern”, but referrencing a specific variable: @@ -246,8 +279,136 @@ sound?.on('ended', () => { }); function handleSoundPlay() { - if (!sound?.playing) single.play(); + sound?.play(); } return ; ``` + +**Managing a `Sound` queue:** + +The problem with the β€œOne-at-a-time” pattern is that it prevents adding a `Sound` to the `stack.queue` if `state` is `playing`. If the behaviour we _really want_ is to queue up a sound to play as soon as `state` is no longer `playing`, we can utilize the β€œWait-your-turn pattern”: + +The pattern works like so: + +1. Listen for `queue` change event on the `Stack`. +2. Prepare a sound. + - Remember, there is a limit to the number of sounds that can be queued within a `Stack`! +3. When the `queue` has changed: + - Get the first sound in the `queue` and call `.play()` + +```tsx +const stack = manager.get('MyStack'); + +const handleQueueChange: StackEventMap['queue'] = (newKeys, _oldKeys) => { + if (!stack || !stack.keys.length) return; + + const firstId = stack.keys[0]; + const firstSound = stack.get(firstId ?? ''); + + // It is harmless to call `.play()` on a `Sound` that is already playing. + firstSound?.play(); +}; + +stack?.on('queue', handleQueueChange); + +async function handleQueuedPlay() { + if (!stack || stack.keys.length >= tokens.maxStackSize) return; + + const sound = await stack.prepare(); + + // No real reason to return anything from this function... + return sound; +} + +return ; +``` + +This same pattern could be achieved using the `Sound > ended` event instead: + +```tsx +const stack = manager.get('MyStack'); + +const handleSoundEnded: SoundEventMap['ended'] = (event) => { + if (!stack) return; + + // By the time this Sound has "ended", it should be + // removed from it’s Stack queue. + const firstId = stack.keys[0]; + const firstSound = stack.get(firstId ?? ''); + + firstSound?.play(); +}; + +async function handleQueuedPlay() { + if (!stack || stack.keys.length >= tokens.maxStackSize) return; + + const sound = await stack.prepare(); + sound?.once('ended', handleSoundEnded); +} + +return ; +``` + +**Stopping after an elapsed play time:** + +```ts +const stack = manager.get('MyStack'); +const sound = await stack?.prepare(); + +// We will store the result of calling `.play()` and `.stop()`, +// but we can also access the `sound?.state` property +// to know when a sound is actively `playing`. +let isPlaying = false; +let completion = '0%'; + +if (sound) { + sound.play(); + + isPlaying = sound.playing; + + sound.on('progress', ({elapsed, progress}) => { + if (progress === 50) sound.stop(); + + // This is a silly example of using `elapsed`. Realistically, + // we would simply check if `progress >= 50`. + const isHalfway = elapsed === Math.min(0, sound.duration / 2); + + // `progress` is returning a value between `0` and `100`. + // Example: `elapsed / duration * 100`. + completion = `${progress}%`; + }); + + sound.on('ended', ({id}) => { + console.log(`Sound ${id} has been stopped at ${completion} completion`); + }); +} +``` + +**Looping audio:** + +We can easily toggle a `Sound` to β€œloop indefinitely” by the `sound.loop` accessor. + +```tsx +const stack = manager.get('MyStack'); +const sound = await stack?.prepare(); + +let playCount = 0; + +if (sound) { + sound.loop = true; + sound.play(); + + // Retrieve the `iterations` count by listening to the `progress` event. + sound?.on('progress', ({iterations}) => { + playCount = iterations; + + // Keep in mind, `iterations` is only incremented at the start of a loop. + if (iterations === 10) sound.stop(); + }); +} +``` + +## Summary + +Hopefully this document has provided enough examples to help you identify the capabilities of `earwurm`. If you are anxious to start experimenting, please check out the included demo app within this repo! diff --git a/docs/future/examples-future.md b/docs/future/examples-future.md new file mode 100644 index 0000000..b82cf6b --- /dev/null +++ b/docs/future/examples-future.md @@ -0,0 +1,54 @@ +# Future examples + +This document simply sets aside some code examples that serve as an expectation for a future implementation. + +**Restarting a playing `Sound`:** + +It is worth remembering that each call to `.play()` creates a new instance of a `Sound`. If doing so is a problem, and you need to reference / re-use an existing sound, you can alternatively call `.seek()` on the actively playing sound. + +```tsx +const restartStack = manager.get('MySound'); +let sound = await restartStack.prepare(); + +async function handleRestartPlay() { + // Early return if the `Promise` has not resolved. + if (!sound?.id) return; + + // Simply call `.play()` if the sound has + // never been played yet. + if (sound.state === 'created') { + return sound.play(); + } + + // Check if the `Sound` is `playing`, and if so, + // return the β€œplay position” back to the beginning. + if (sound.playing) { + return sound.seek(0); + } + + // Otherwise, we need to re-create the sound + // and play it once ready. + sound = await restartStack.prepare(); + const restarted = sound.play(); + return restarted; +} + +return ; +``` + +**Using audio sprites:** + +With each individual audio file comes an individual network request. + +Depending on the scope of sound effects you are using, it might be wise to use a β€œsprite”. This is a technique of spacing out individual sound effects within a single file, allowing you to condense multiple small requests into one large request. + +> It is up to you to determine where and when to use an audio sprite, as there are many factors to consider. + +```tsx +// Capture each sound embedded within the sprite by +// targeting each sound’s start/end time. This will +// require you to know the exact timestamp of each sound. +const beepSound = manager.get('Sprite')?.range(0, 900); +const oinkSound = manager.get('Sprite')?.range(1000, 2200); +const woofSound = manager.get('Sprite')?.range(2300, 3000); +``` diff --git a/docs/roadmap-future.md b/docs/future/roadmap-future.md similarity index 68% rename from docs/roadmap-future.md rename to docs/future/roadmap-future.md index 6fcdecb..3305e9f 100644 --- a/docs/roadmap-future.md +++ b/docs/future/roadmap-future.md @@ -16,13 +16,9 @@ soundStack.cached; /// Events // Capture the moment the audio asset fetch request changes -// from `false` to `true`. Will noever fire if an `error` +// from `false` to `true`. Will never fire if an `error` // occurs, or if the asset is already cached on initialization. -soundStack.onCache((cached: true) => void); - -// Capture the `error` thrown from the audio asset request, -// or the subsequent decoding of that response data. -soundStack.onError((error: unknown) => void); +soundStack.on('cache', () => void); ``` ## Sound @@ -58,9 +54,6 @@ sound.reverse = true || false; // by the browser as a way to free-up memory. sound.loaded; -// Get the β€œcurrent play time” for this `Sound`. -sound.elapsed; - // Get a `boolean` for whether or not this `Sound` is // to be played in the β€œreverse” direction. sound.reverse; @@ -73,25 +66,9 @@ sound.sprite; /// /// Events -// Event called whenever `.play()` is triggered. -sound.onPlay(() => void); - -// Event called whenever `.pause()` is triggered. -sound.onPause(() => void); - -// Event called whenever `.stop()` is triggered. -sound.onStop(() => void); - -// Event called each time a β€œloop” restarts. -sound.onLoop(() => void); - -// Event called whenever `elapsed` changes while -// the `Sound` is `playing`. -sound.onProgress(({elapsed, progress}) => void); - // Event called whenever there is an `Error` thrown // from the `Sound`. -sound.onError((error) => void); +soundStack.on('error', (message: CombinedErrorMessage) => void); ``` ## Concerns @@ -100,6 +77,3 @@ sound.onError((error) => void); - If we find that the `Sound` is not getting removed from the `Stack`, perhaps it is because `.empty()` is called before the `listener` has run. - Is having `context` and `destination` set to `readonly` allowing consumer's to hijack the inidivual properties attached to the `AudioContext` and `AudioNode`? - If so, we will need to switch these to being private. -- What happens when I try to call `.play()` on an already destroyed `Sound`? - - Is that variable now `undefined`? - - Do I need to add a early return within the `.play()` method? diff --git a/docs/roadmap.md b/docs/roadmap.md index eaebc4b..2a6545a 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -4,20 +4,12 @@ While we are intentionally keeping the scope of `Earwurm` to an absolute minimum, there are still some features / tasks that remain to be completed. -## Tasks - -1. Calculate `elapsed` time per-sound. - - If this can be achieved _(taking into consideration how `speed` will influence the calculation of `elapsed`)_, then we can add a `progress` event. -2. Finish docs. - - We need to elaborate on returning a `scratchBuffer` if the `fetch` fails. - - If we failed to load the sound, return a β€œscratch buffer” so that we can still register an `ended` listener and call `.stop()` on the `source`. Since `Stack` will `emit` an `error` event with the `Sound > id`, consumer’s can listen for that event and perform their own handling. - ## Considerations 1. Should we make `context` available to the consumer so that they can re-use it for other things? - Can cause many complications within `Earwurm`. -2. Should we have some β€œSSR detection” to know if we can actually use the `Web Audio API`? - - Can the `Web Audio API` work on a server? +2. Should we have some β€œSSR/node detection” to know if we can actually use the `Web Audio API`? + - Can the `Web Audio API` work on a server / in node? 3. Should we offer a utility to help detect: - `AudioContext` support. - `webm` format support. @@ -42,17 +34,15 @@ While we are intentionally keeping the scope of `Earwurm` to an absolute minimum - We could introduce this private property: `#audioBuffer: AudioBuffer | null;` - And then add an option to the `config` for `cacheAudioBuffer?: boolean;` - This would have to be flagged as potentially "dangerous", as I imagine caching too many buffers creates considerable overhead. -11. Considering adding a `queuechange` event on `Stack`. - - We could simply `.emit()` from `#setQueue` and pass `keys` as the argument. -12. Do we need to re-check the `#queue` state when a sound has `ended`? +11. Do we need to re-check the `#queue` state when a sound has `ended`? - This would be done within `Stack > #handleSoundEnded`. - A sound goes into a `stopping` state first, which will trigger `#setStateFromQueue`. There shouldn't be any reason for the `ended` event to fail… but if so, then we will need to re-check. -13. Find out if `statechange` event listeners automatically get removed upon calling `.close()` / state change to `closed` on a `AudioContext`. +12. Find out if `statechange` event listeners automatically get removed upon calling `.close()` / state change to `closed` on a `AudioContext`. - If so, then I can remove the `.close().then()` chain. -14. Consider adding a `readonly parent` to both `Stack` and `Sound`. +13. Consider adding a `readonly parent` to both `Stack` and `Sound`. - The value of each would be `this` from either the `Manager` or the `Stack`. - Example: This would allow me to know what `Stack` manages a particular `Sound`. -15. Consider setting `Stack > state` to `closed` on `teardown`. +14. Consider setting `Stack > state` to `closed` on `teardown`. - This way, there is a better mechanism to removing a `Stack` after listening to a `statechange`. ### Additional diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 302eb4c..0000000 --- a/package-lock.json +++ /dev/null @@ -1,7487 +0,0 @@ -{ - "name": "earwurm", - "version": "0.5.2", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "earwurm", - "version": "0.5.2", - "license": "ISC", - "dependencies": { - "emitten": "^0.6.2" - }, - "devDependencies": { - "@changesets/changelog-github": "^0.5.0", - "@changesets/cli": "^2.27.1", - "@types/node": "^20.10.6", - "@typescript-eslint/eslint-plugin": "^6.17.0", - "@vitest/coverage-v8": "^1.1.2", - "@vitest/ui": "^1.1.2", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-config-standard-with-typescript": "^43.0.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-n": "^16.6.1", - "eslint-plugin-prettier": "^5.1.2", - "eslint-plugin-promise": "^6.1.1", - "happy-dom": "^12.10.3", - "prettier": "^3.1.1", - "typescript": "^5.3.3", - "vite": "^5.0.10", - "vite-plugin-dts": "^3.7.0", - "vitest": "^1.1.2" - }, - "engines": { - "node": ">=20.10.0", - "npm": ">=10.2.0" - }, - "peerDependencies": { - "emitten": "^0.6.2" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", - "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@changesets/apply-release-plan": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.0.tgz", - "integrity": "sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/config": "^3.0.0", - "@changesets/get-version-range-type": "^0.4.0", - "@changesets/git": "^3.0.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.0.tgz", - "integrity": "sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/changelog-git": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz", - "integrity": "sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0" - } - }, - "node_modules/@changesets/changelog-github": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.5.0.tgz", - "integrity": "sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==", - "dev": true, - "dependencies": { - "@changesets/get-github-info": "^0.6.0", - "@changesets/types": "^6.0.0", - "dotenv": "^8.1.0" - } - }, - "node_modules/@changesets/cli": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.1.tgz", - "integrity": "sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/apply-release-plan": "^7.0.0", - "@changesets/assemble-release-plan": "^6.0.0", - "@changesets/changelog-git": "^0.2.0", - "@changesets/config": "^3.0.0", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/get-release-plan": "^4.0.0", - "@changesets/git": "^3.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/pre": "^2.0.0", - "@changesets/read": "^0.6.0", - "@changesets/types": "^6.0.0", - "@changesets/write": "^0.3.0", - "@manypkg/get-packages": "^1.1.3", - "@types/semver": "^7.5.0", - "ansi-colors": "^4.1.3", - "chalk": "^2.1.0", - "ci-info": "^3.7.0", - "enquirer": "^2.3.0", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "meow": "^6.0.0", - "outdent": "^0.5.0", - "p-limit": "^2.2.0", - "preferred-pm": "^3.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^2.0.0", - "term-size": "^2.1.0", - "tty-table": "^4.1.5" - }, - "bin": { - "changeset": "bin.js" - } - }, - "node_modules/@changesets/config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.0.tgz", - "integrity": "sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==", - "dev": true, - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.2" - } - }, - "node_modules/@changesets/errors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", - "dev": true, - "dependencies": { - "extendable-error": "^0.1.5" - } - }, - "node_modules/@changesets/get-dependents-graph": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.0.0.tgz", - "integrity": "sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/get-github-info": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.6.0.tgz", - "integrity": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==", - "dev": true, - "dependencies": { - "dataloader": "^1.4.0", - "node-fetch": "^2.5.0" - } - }, - "node_modules/@changesets/get-release-plan": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.0.tgz", - "integrity": "sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/assemble-release-plan": "^6.0.0", - "@changesets/config": "^3.0.0", - "@changesets/pre": "^2.0.0", - "@changesets/read": "^0.6.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/get-version-range-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", - "dev": true - }, - "node_modules/@changesets/git": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.0.tgz", - "integrity": "sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.2", - "spawndamnit": "^2.0.0" - } - }, - "node_modules/@changesets/logger": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.0.tgz", - "integrity": "sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==", - "dev": true, - "dependencies": { - "chalk": "^2.1.0" - } - }, - "node_modules/@changesets/parse": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz", - "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@changesets/pre": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.0.tgz", - "integrity": "sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" - } - }, - "node_modules/@changesets/read": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.0.tgz", - "integrity": "sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/git": "^3.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/parse": "^0.4.0", - "@changesets/types": "^6.0.0", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0" - } - }, - "node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/write": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.0.tgz", - "integrity": "sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/types": "^6.0.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "prettier": "^2.7.1" - } - }, - "node_modules/@changesets/write/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@manypkg/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - } - }, - "node_modules/@manypkg/find-root/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" - } - }, - "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "dev": true - }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@microsoft/api-extractor": { - "version": "7.39.0", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.39.0.tgz", - "integrity": "sha512-PuXxzadgnvp+wdeZFPonssRAj/EW4Gm4s75TXzPk09h3wJ8RS3x7typf95B4vwZRrPTQBGopdUl+/vHvlPdAcg==", - "dev": true, - "dependencies": { - "@microsoft/api-extractor-model": "7.28.3", - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.62.0", - "@rushstack/rig-package": "0.5.1", - "@rushstack/ts-command-line": "4.17.1", - "colors": "~1.2.1", - "lodash": "~4.17.15", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "source-map": "~0.6.1", - "typescript": "5.3.3" - }, - "bin": { - "api-extractor": "bin/api-extractor" - } - }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.28.3.tgz", - "integrity": "sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.62.0" - } - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz", - "integrity": "sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.24", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", - "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", - "dev": true - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz", - "integrity": "sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz", - "integrity": "sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz", - "integrity": "sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz", - "integrity": "sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz", - "integrity": "sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz", - "integrity": "sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz", - "integrity": "sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz", - "integrity": "sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz", - "integrity": "sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz", - "integrity": "sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz", - "integrity": "sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz", - "integrity": "sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz", - "integrity": "sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rushstack/node-core-library": { - "version": "3.62.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.62.0.tgz", - "integrity": "sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==", - "dev": true, - "dependencies": { - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "z-schema": "~5.0.2" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/rig-package": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.1.tgz", - "integrity": "sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==", - "dev": true, - "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" - } - }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.17.1.tgz", - "integrity": "sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==", - "dev": true, - "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", - "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz", - "integrity": "sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.17.0", - "@typescript-eslint/type-utils": "6.17.0", - "@typescript-eslint/utils": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz", - "integrity": "sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.17.0", - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/typescript-estree": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz", - "integrity": "sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz", - "integrity": "sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.17.0", - "@typescript-eslint/utils": "6.17.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.17.0.tgz", - "integrity": "sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz", - "integrity": "sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.17.0.tgz", - "integrity": "sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.17.0", - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/typescript-estree": "6.17.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz", - "integrity": "sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.17.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitest/coverage-v8": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.1.2.tgz", - "integrity": "sha512-W12+EiqKxNgcot5ZdUA/8G/P+3bHVr1Ggi4G7qWbLGXFfyEANCDidpV7KzxnOgFGrL4DAB1nsh4mzTIZ3Nz79A==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.4", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.1.6", - "magic-string": "^0.30.5", - "magicast": "^0.3.2", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "^1.0.0" - } - }, - "node_modules/@vitest/expect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.1.2.tgz", - "integrity": "sha512-1aOqDLbgkvJ2e1nLQ/5dkUX54V1Alwt2e6M2u03Oy7wGbDYHV5ZLKm1XbcT45h8TMXtc2q/BPtkeIjyRv1oDHQ==", - "dev": true, - "dependencies": { - "@vitest/spy": "1.1.2", - "@vitest/utils": "1.1.2", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.1.2.tgz", - "integrity": "sha512-oTqXCGtZzu9EaXq9cO/QDGnC721iryuTPs5rLyVZUJsdm33IQeIOwTRIWUB7EYFwpJsI+qMiCiuGZS49+DP5hA==", - "dev": true, - "dependencies": { - "@vitest/utils": "1.1.2", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.1.2.tgz", - "integrity": "sha512-hXXd5KjURGt6GCrmw55A+PNIlrOaE6x6KcdEANXac76xmvVbJZXSiNVJ1JuMCiyvLLTzdpPnrgWyCX9/CepFCQ==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.1.2.tgz", - "integrity": "sha512-1Nn70K3oY00lhThDXsVQxjslUvJij1YQDzH/4FMxMLgjYxB5u4Aw4yXeICNSSap04wyV2dtGL3RqdBGwoR3sPA==", - "dev": true, - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.1.2.tgz", - "integrity": "sha512-l+fPKIJWEwBHP1TUnBKkCVxWG26/LAc5VIkXFOyKaz/NWoHQBuNa4OArLMsREHYo5EhozzbKQMdZiJVPxjcajA==", - "dev": true, - "dependencies": { - "@vitest/utils": "1.1.2", - "fast-glob": "^3.3.2", - "fflate": "^0.8.1", - "flatted": "^3.2.9", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "sirv": "^2.0.4" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "^1.0.0" - } - }, - "node_modules/@vitest/utils": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.1.2.tgz", - "integrity": "sha512-QrXfDieptshDkTkXnA+HmlVQto1h0jengbkSKcJjlbCMeXbSCr3AcALPPzozRQxEOKvFjqx9WHjljz62uxrGew==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@volar/language-core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", - "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", - "dev": true, - "dependencies": { - "@volar/source-map": "1.11.1" - } - }, - "node_modules/@volar/source-map": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", - "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", - "dev": true, - "dependencies": { - "muggle-string": "^0.3.1" - } - }, - "node_modules/@volar/typescript": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz", - "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", - "dev": true, - "dependencies": { - "@volar/language-core": "1.11.1", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.5.tgz", - "integrity": "sha512-Daka7P1z2AgKjzuueWXhwzIsKu0NkLB6vGbNVEV2iJ8GJTrzraZo/Sk4GWCMRtd/qVi3zwnk+Owbd/xSZbwHtQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.23.6", - "@vue/shared": "3.4.5", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@vue/compiler-dom": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.5.tgz", - "integrity": "sha512-J8YlxknJVd90SXFJ4HwGANSAXsx5I0lK30sO/zvYV7s5gXf7gZR7r/1BmZ2ju7RGH1lnc6bpBc6nL61yW+PsAQ==", - "dev": true, - "dependencies": { - "@vue/compiler-core": "3.4.5", - "@vue/shared": "3.4.5" - } - }, - "node_modules/@vue/language-core": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz", - "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", - "dev": true, - "dependencies": { - "@volar/language-core": "~1.11.1", - "@volar/source-map": "~1.11.1", - "@vue/compiler-dom": "^3.3.0", - "@vue/shared": "^3.3.0", - "computeds": "^0.0.1", - "minimatch": "^9.0.3", - "muggle-string": "^0.3.1", - "path-browserify": "^1.0.1", - "vue-template-compiler": "^2.7.14" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/shared": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.5.tgz", - "integrity": "sha512-6XptuzlMvN4l4cDnDw36pdGEV+9njYkQ1ZE0Q6iZLwrKefKaOJyiFmcP3/KBDHbt72cJZGtllAc1GaHe6XGAyg==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", - "dev": true, - "dependencies": { - "is-windows": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/breakword": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/breakword/-/breakword-1.0.6.tgz", - "integrity": "sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==", - "dev": true, - "dependencies": { - "wcwidth": "^1.0.1" - } - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/computeds": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", - "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true - }, - "node_modules/csv": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz", - "integrity": "sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==", - "dev": true, - "dependencies": { - "csv-generate": "^3.4.3", - "csv-parse": "^4.16.3", - "csv-stringify": "^5.6.5", - "stream-transform": "^2.1.3" - }, - "engines": { - "node": ">= 0.1.90" - } - }, - "node_modules/csv-generate": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz", - "integrity": "sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==", - "dev": true - }, - "node_modules/csv-parse": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", - "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", - "dev": true - }, - "node_modules/csv-stringify": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz", - "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==", - "dev": true - }, - "node_modules/dataloader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", - "dev": true - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/emitten": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/emitten/-/emitten-0.6.2.tgz", - "integrity": "sha512-fOQfNUj0+8de81lWPmG9NY704ngNFiEgaXI8klVi9rVQWPWrZXDed13Afh3nvFKM0UJlynv5Hh7lTYH2czOsZQ==", - "engines": { - "node": ">=20.10.0", - "npm": ">=10.2.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "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.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-compat-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/eslint-config-standard-with-typescript": { - "version": "43.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-43.0.0.tgz", - "integrity": "sha512-AT0qK01M5bmsWiE3UZvaQO5da1y1n6uQckAKqGNe6zPW5IOzgMLXZxw77nnFm+C11nxAZXsCPrbsgJhSrGfX6Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/parser": "^6.4.0", - "eslint-config-standard": "17.1.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.4.0", - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0", - "typescript": "*" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es-x": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", - "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0", - "eslint-compat-utils": "^0.1.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": ">=8" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-n": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.1.tgz", - "integrity": "sha512-M1kE5bVQRLBMDYRZwDhWzlzbp370SRRRC1MHqq4I3L2Tatey+9/2csc5mwLDPlmhJaDvkojbrNUME5/llpRyDg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.5.0", - "get-tsconfig": "^4.7.0", - "globals": "^13.24.0", - "ignore": "^5.2.4", - "is-builtin-module": "^3.2.1", - "is-core-module": "^2.12.1", - "minimatch": "^3.1.2", - "resolve": "^1.22.2", - "semver": "^7.5.3" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.2.tgz", - "integrity": "sha512-dhlpWc9vOwohcWmClFcA+HjlvUpuyynYs0Rf+L/P6/0iQE6vlHW9l5bkfzN62/Stm9fbq8ku46qzde76T1xlSg==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/extendable-error": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", - "dev": true - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fflate": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.1.tgz", - "integrity": "sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==", - "dev": true - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", - "dev": true, - "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/happy-dom": { - "version": "12.10.3", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-12.10.3.tgz", - "integrity": "sha512-JzUXOh0wdNGY54oKng5hliuBkq/+aT1V3YpTM+lrN/GoLQTANZsMaIvmHiHe612rauHvPJnDZkZ+5GZR++1Abg==", - "dev": true, - "dependencies": { - "css.escape": "^1.5.1", - "entities": "^4.5.0", - "iconv-lite": "^0.6.3", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0" - } - }, - "node_modules/happy-dom/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/human-id": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", - "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", - "dev": true - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-subdir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", - "dev": true, - "dependencies": { - "better-path-resolve": "1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/load-yaml-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", - "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/magicast": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.2.tgz", - "integrity": "sha512-Fjwkl6a0syt9TFN0JSYpOybxiMCkYNEeOTnOTNRbjphirLakznZXAqrXgj/7GG3D1dvETONNwrBfinvAbpunDg==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "source-map-js": "^1.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", - "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "^4.0.2", - "normalize-package-data": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mixme": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.10.tgz", - "integrity": "sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/mlly": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", - "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.3.0" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/muggle-string": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", - "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/outdent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", - "dev": true - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preferred-pm": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz", - "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0", - "find-yarn-workspace-root2": "1.2.16", - "path-exists": "^4.0.0", - "which-pm": "2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/preferred-pm/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/preferred-pm/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/preferred-pm/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/preferred-pm/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/preferred-pm/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.2.tgz", - "integrity": "sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.2", - "@rollup/rollup-android-arm64": "4.9.2", - "@rollup/rollup-darwin-arm64": "4.9.2", - "@rollup/rollup-darwin-x64": "4.9.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.2", - "@rollup/rollup-linux-arm64-gnu": "4.9.2", - "@rollup/rollup-linux-arm64-musl": "4.9.2", - "@rollup/rollup-linux-riscv64-gnu": "4.9.2", - "@rollup/rollup-linux-x64-gnu": "4.9.2", - "@rollup/rollup-linux-x64-musl": "4.9.2", - "@rollup/rollup-win32-arm64-msvc": "4.9.2", - "@rollup/rollup-win32-ia32-msvc": "4.9.2", - "@rollup/rollup-win32-x64-msvc": "4.9.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smartwrap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz", - "integrity": "sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==", - "dev": true, - "dependencies": { - "array.prototype.flat": "^1.2.3", - "breakword": "^1.0.5", - "grapheme-splitter": "^1.0.4", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1", - "yargs": "^15.1.0" - }, - "bin": { - "smartwrap": "src/terminal-adapter.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/smartwrap/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/smartwrap/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/smartwrap/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/smartwrap/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/smartwrap/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smartwrap/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/smartwrap/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawndamnit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz", - "integrity": "sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==", - "dev": true, - "dependencies": { - "cross-spawn": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/spawndamnit/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/spawndamnit/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/spawndamnit/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawndamnit/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawndamnit/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/spawndamnit/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true - }, - "node_modules/stream-transform": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz", - "integrity": "sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==", - "dev": true, - "dependencies": { - "mixme": "^0.5.1" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", - "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tinybench": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", - "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.1.tgz", - "integrity": "sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", - "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/tty-table": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/tty-table/-/tty-table-4.2.3.tgz", - "integrity": "sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "csv": "^5.5.3", - "kleur": "^4.1.5", - "smartwrap": "^2.0.2", - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.1", - "yargs": "^17.7.1" - }, - "bin": { - "tty-table": "adapters/terminal-adapter.js" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/tty-table/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/tty-table/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/tty-table/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/tty-table/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/tty-table/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tty-table/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", - "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", - "dev": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vite": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.10.tgz", - "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==", - "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.1.2.tgz", - "integrity": "sha512-2S3Y7T68PMrBbFS2H9Oda2GeordkIU5gLx2toubxPUcFZ+LKZ9L6U69pLtofotwQUrb3NcUImP3fl9GfLplebA==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-dts": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-3.7.0.tgz", - "integrity": "sha512-np1uPaYzu98AtPReB8zkMnbjwcNHOABsLhqVOf81b3ol9b5M2wPcAVs8oqPnOpr6Us+7yDXVauwkxsk5+ldmRA==", - "dev": true, - "dependencies": { - "@microsoft/api-extractor": "7.39.0", - "@rollup/pluginutils": "^5.1.0", - "@vue/language-core": "^1.8.26", - "debug": "^4.3.4", - "kolorist": "^1.8.0", - "vue-tsc": "^1.8.26" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "typescript": "*", - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.1.2.tgz", - "integrity": "sha512-nEw58z0PFBARwo3hWx6aKmI0Rob2avL9Mt2IYW+5mH5dS4S39J+VLH9aG8x6KZIgyegdE1p7/3JjZ93FzVCsoQ==", - "dev": true, - "dependencies": { - "@vitest/expect": "1.1.2", - "@vitest/runner": "1.1.2", - "@vitest/snapshot": "1.1.2", - "@vitest/spy": "1.1.2", - "@vitest/utils": "1.1.2", - "acorn-walk": "^8.3.1", - "cac": "^6.7.14", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^1.3.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.1", - "vite": "^5.0.0", - "vite-node": "1.1.2", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "^1.0.0", - "@vitest/ui": "^1.0.0", - "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 - } - } - }, - "node_modules/vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", - "dev": true, - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/vue-tsc": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz", - "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", - "dev": true, - "dependencies": { - "@volar/typescript": "~1.11.1", - "@vue/language-core": "1.8.27", - "semver": "^7.5.4" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/whatwg-url/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/which-pm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", - "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", - "dev": true, - "dependencies": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8.15" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/z-schema": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", - "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", - "dev": true, - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "commander": "^9.4.1" - } - } - } -} diff --git a/package.json b/package.json index e107445..bfe37d2 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,10 @@ { - "name": "earwurm", - "version": "0.7.0", - "description": "Browser audio for the modern age", + "name": "earwurm-monorepo", + "version": "0.0.0", + "description": "Monorepo for the Earwurm TypeScript project", "author": "Curtis Dulmage", "license": "ISC", - "keywords": [ - "browser", - "web", - "audio", - "sound", - "webm" - ], + "keywords": [], "homepage": "https://github.com/beefchimi/earwurm#readme", "bugs": { "url": "https://github.com/beefchimi/earwurm/issues" @@ -19,67 +13,47 @@ "type": "git", "url": "git+https://github.com/beefchimi/earwurm.git" }, - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org" - }, - "type": "module", - "main": "./dist/earwurm.umd.js", - "module": "./dist/earwurm.es.js", - "types": "./dist/index.d.ts", - "files": [ - "dist" - ], - "exports": { - ".": { - "import": "./dist/earwurm.es.js", - "require": "./dist/earwurm.umd.js", - "types": "./dist/index.d.ts" - } - }, + "private": true, "engines": { "node": ">=20.10.0", - "npm": ">=10.2.0" + "pnpm": ">=8.14.0" }, + "packageManager": "pnpm@8.14.0", "scripts": { - "clean": "rm -rf coverage && rm -rf dist", - "nuke": "npm run clean && rm -rf node_modules && rm -rf package-lock.json && npm cache clean --force", - "build": "npm run clean && tsc && vite build", - "lint": "eslint . --ext .ts", - "lint:fix": "npm run lint -- --fix", - "format": "prettier --check src/", - "format:fix": "prettier --write src/", + "clean": "pnpm -r clean && rm -rf coverage", + "nuke": "pnpm clean && ./scripts/nuke.sh", + "start": "pnpm --filter earwurm build && pnpm -r --parallel --stream start", + "build": "pnpm -r build", + "lint": "pnpm -r lint && eslint . --ext .ts", + "lint:fix": "pnpm -r lint:fix && eslint . --fix --ext .ts", + "format": "prettier --check .", + "format:fix": "prettier --write .", + "type-check": "pnpm build && pnpm -r type-check", "test": "vitest --pool forks", "test:ui": "vitest --ui", "coverage": "vitest --run --coverage", "report": "changeset", - "release": "npm run build && changeset publish" - }, - "dependencies": { - "emitten": "^0.6.2" + "release:version": "changeset version", + "release:publish": "changeset publish" }, "devDependencies": { "@changesets/changelog-github": "^0.5.0", "@changesets/cli": "^2.27.1", - "@types/node": "^20.10.6", - "@typescript-eslint/eslint-plugin": "^6.17.0", - "@vitest/coverage-v8": "^1.1.2", - "@vitest/ui": "^1.1.2", + "@types/node": "^20.11.5", + "@typescript-eslint/eslint-plugin": "^6.19.0", + "@vitest/coverage-v8": "^1.2.1", + "@vitest/ui": "^1.2.1", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", - "eslint-config-standard-with-typescript": "^43.0.0", + "eslint-config-standard-with-typescript": "^43.0.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-n": "^16.6.1", - "eslint-plugin-prettier": "^5.1.2", + "eslint-plugin-n": "^16.6.2", + "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-promise": "^6.1.1", - "happy-dom": "^12.10.3", - "prettier": "^3.1.1", + "happy-dom": "^13.2.0", + "prettier": "^3.2.4", "typescript": "^5.3.3", - "vite": "^5.0.10", - "vite-plugin-dts": "^3.7.0", - "vitest": "^1.1.2" - }, - "peerDependencies": { - "emitten": "^0.6.2" + "vite": "^5.0.12", + "vitest": "^1.2.1" } } diff --git a/pkg/README.md b/pkg/README.md new file mode 100644 index 0000000..4a1f238 --- /dev/null +++ b/pkg/README.md @@ -0,0 +1,29 @@ +# Package directory + +All of the monorepo’s shared packages are located here. Most of these packages are β€œlocal only”, which means that we do not actually publish that folder’s code. + +## TypeScript + +If we later decide we want a unique `tsconfig.json` for each package, we will need to: + +1. Create a `tsconfig.json` within each package folder. +2. Remove the `pkg` include within the root `tsconfig.json`. +3. Add the correct project `references` within the root `tsconfig.json`. + +Individual package configs would look something like: + +```json +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "module": "esnext", + "moduleResolution": "bundler" + }, + "include": ["vite.config.ts", "src/**/*.ts"] +} +``` + +A `references` value would look something like: + +`"references": [{"path": "app/website"}]` diff --git a/pkg/earwurm/package.json b/pkg/earwurm/package.json new file mode 100644 index 0000000..ac2801a --- /dev/null +++ b/pkg/earwurm/package.json @@ -0,0 +1,64 @@ +{ + "name": "earwurm", + "version": "0.7.0", + "description": "Browser audio for the modern age", + "author": "Curtis Dulmage", + "license": "ISC", + "keywords": [ + "browser", + "web", + "audio", + "sound", + "webm" + ], + "homepage": "https://github.com/beefchimi/earwurm#readme", + "bugs": { + "url": "https://github.com/beefchimi/earwurm/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/beefchimi/earwurm.git" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org" + }, + "type": "module", + "main": "./dist/earwurm.umd.js", + "module": "./dist/earwurm.es.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "exports": { + ".": { + "import": "./dist/earwurm.es.js", + "require": "./dist/earwurm.umd.js", + "types": "./dist/index.d.ts" + } + }, + "engines": { + "node": ">=20.10.0", + "pnpm": ">=8.14.0" + }, + "scripts": { + "clean": "rm -rf dist", + "build:only": "tsc && vite build", + "build": "pnpm clean && pnpm build:only", + "start": "pnpm build:only --watch" + }, + "dependencies": { + "@earwurm/helpers": "workspace:*", + "@earwurm/types": "workspace:*", + "@earwurm/utilities": "workspace:*", + "emitten": "^0.6.3" + }, + "devDependencies": { + "@earwurm/mocks": "workspace:*", + "vite": "^5.0.12", + "vite-plugin-dts": "^3.7.1" + }, + "peerDependencies": { + "emitten": "^0.6.3" + } +} diff --git a/src/Earwurm.ts b/pkg/earwurm/src/Earwurm.ts similarity index 97% rename from src/Earwurm.ts rename to pkg/earwurm/src/Earwurm.ts index 99c0d88..884c64c 100644 --- a/src/Earwurm.ts +++ b/pkg/earwurm/src/Earwurm.ts @@ -1,11 +1,11 @@ import {EmittenCommon} from 'emitten'; +import {linearRamp, unlockAudioContext} from '@earwurm/helpers'; +import {arrayShallowEquals, clamp, getErrorMessage} from '@earwurm/utilities'; +import type {TimeoutId} from '@earwurm/types'; -import {getErrorMessage, linearRamp, unlockAudioContext} from './helpers'; -import {arrayShallowEquals, clamp} from './utilities'; +import {Stack} from './Stack'; import {tokens} from './tokens'; - import type { - TimeoutId, ManagerState, ManagerEventMap, ManagerConfig, @@ -14,8 +14,6 @@ import type { StackEventMap, } from './types'; -import {Stack} from './Stack'; - export class Earwurm extends EmittenCommon { private _vol = 1; private _mute = false; diff --git a/src/Sound.ts b/pkg/earwurm/src/Sound.ts similarity index 93% rename from src/Sound.ts rename to pkg/earwurm/src/Sound.ts index 670db02..4d086fc 100644 --- a/src/Sound.ts +++ b/pkg/earwurm/src/Sound.ts @@ -1,7 +1,7 @@ import {EmittenCommon} from 'emitten'; +import {linearRamp} from '@earwurm/helpers'; +import {clamp, calcProgress} from '@earwurm/utilities'; -import {linearRamp} from './helpers'; -import {clamp, progressPercentage} from './utilities'; import {tokens} from './tokens'; import type { SoundId, @@ -188,7 +188,7 @@ export class Sound extends EmittenCommon { this.#progress.remaining = this.duration - this.#progress.elapsed; this.#progress.percentage = clamp( 0, - progressPercentage(this.#progress.elapsed, this.duration), + calcProgress(this.#progress.elapsed, {max: this.duration}), 100, ); @@ -200,6 +200,8 @@ export class Sound extends EmittenCommon { } play() { + if (this._state === 'playing') return this; + if (!this.#hasStarted) { this.#source.start(); this.#hasStarted = true; @@ -298,6 +300,12 @@ export class Sound extends EmittenCommon { readonly #handleEnded = () => { this.#setState('ending'); + // TODO: Include a boolean property to indicate if this + // was "stopped" or came to a natural "end". + // We should also include the `iterations` value here so + // that we can distinguish from a `loop > stop` having + // played to completion at least one. Lastly, we might + // also need to indicate if this was a "scratch buffer". this.emit('ended', { id: this.id, source: this.#source, diff --git a/src/Stack.ts b/pkg/earwurm/src/Stack.ts similarity index 97% rename from src/Stack.ts rename to pkg/earwurm/src/Stack.ts index 8d826c4..21a0662 100644 --- a/src/Stack.ts +++ b/pkg/earwurm/src/Stack.ts @@ -1,14 +1,9 @@ import {EmittenCommon} from 'emitten'; +import {fetchAudioBuffer, linearRamp, scratchBuffer} from '@earwurm/helpers'; +import {arrayShallowEquals, clamp, getErrorMessage} from '@earwurm/utilities'; -import { - getErrorMessage, - fetchAudioBuffer, - linearRamp, - scratchBuffer, -} from './helpers'; -import {arrayShallowEquals, clamp} from './utilities'; +import {Sound} from './Sound'; import {tokens} from './tokens'; - import type { StackId, StackState, @@ -19,8 +14,6 @@ import type { SoundEventMap, } from './types'; -import {Sound} from './Sound'; - export class Stack extends EmittenCommon { static readonly #loadError = ( id: StackId, diff --git a/src/index.ts b/pkg/earwurm/src/index.ts similarity index 100% rename from src/index.ts rename to pkg/earwurm/src/index.ts diff --git a/src/tests/Abstract.test.ts b/pkg/earwurm/src/tests/Abstract.test.ts similarity index 100% rename from src/tests/Abstract.test.ts rename to pkg/earwurm/src/tests/Abstract.test.ts diff --git a/src/tests/Earwurm.test.ts b/pkg/earwurm/src/tests/Earwurm.test.ts similarity index 99% rename from src/tests/Earwurm.test.ts rename to pkg/earwurm/src/tests/Earwurm.test.ts index 2b0db9d..8b564bb 100644 --- a/src/tests/Earwurm.test.ts +++ b/pkg/earwurm/src/tests/Earwurm.test.ts @@ -1,8 +1,10 @@ import {afterEach, describe, it, expect, vi} from 'vitest'; +import {mockData} from '@earwurm/mocks'; import {Earwurm} from '../Earwurm'; import {Stack} from '../Stack'; import type {Sound} from '../Sound'; + import {tokens} from '../tokens'; import type { ManagerEventMap, @@ -10,7 +12,6 @@ import type { LibraryEntry, StackId, } from '../types'; -import {mockData} from './mock'; describe('Earwurm component', () => { let mockManager = new Earwurm(); diff --git a/src/tests/Sound.test.ts b/pkg/earwurm/src/tests/Sound.test.ts similarity index 99% rename from src/tests/Sound.test.ts rename to pkg/earwurm/src/tests/Sound.test.ts index b3d0dd8..98ec4f3 100644 --- a/src/tests/Sound.test.ts +++ b/pkg/earwurm/src/tests/Sound.test.ts @@ -94,7 +94,7 @@ describe('Sound component', () => { }); // TODO: Not using `linearRamp` at the moment because: - // 1. We are not usign "transitions" yet on `speed` change. + // 1. We are not using "transitions" yet on `speed` change. // 2. FireFox seems to have a problem pausing after a // `speed` change when using `linearRamp`. Likely due to // either the same `to/from > currentTime` or no call to diff --git a/src/tests/Stack.test.ts b/pkg/earwurm/src/tests/Stack.test.ts similarity index 99% rename from src/tests/Stack.test.ts rename to pkg/earwurm/src/tests/Stack.test.ts index 5b7103d..756e553 100644 --- a/src/tests/Stack.test.ts +++ b/pkg/earwurm/src/tests/Stack.test.ts @@ -1,11 +1,11 @@ import {afterEach, describe, it, expect, vi} from 'vitest'; +import {mockData} from '@earwurm/mocks'; +import {arrayOfLength} from '@earwurm/utilities'; import {Stack} from '../Stack'; import {Sound} from '../Sound'; import {tokens} from '../tokens'; -import {arrayOfLength} from '../utilities'; import type {StackEventMap, SoundEventMap} from '../types'; -import {mockData} from './mock'; type StackConstructor = ConstructorParameters; diff --git a/src/tokens.ts b/pkg/earwurm/src/tokens.ts similarity index 100% rename from src/tokens.ts rename to pkg/earwurm/src/tokens.ts diff --git a/src/types.ts b/pkg/earwurm/src/types.ts similarity index 88% rename from src/types.ts rename to pkg/earwurm/src/types.ts index afe31c7..8d5f05b 100644 --- a/src/types.ts +++ b/pkg/earwurm/src/types.ts @@ -1,19 +1,4 @@ -export type PrimitiveType = - | string - | number - | bigint - | boolean - | symbol - | undefined - | null; - -export type TimeoutId = number | ReturnType; - -// Tuple: custom error, original error. -export type CombinedErrorMessage = [string, string]; - -/// -/// Manager +import type {CombinedErrorMessage} from '@earwurm/types'; export type ManagerState = AudioContextState | 'suspending' | 'interrupted'; diff --git a/pkg/earwurm/vite.config.ts b/pkg/earwurm/vite.config.ts new file mode 100644 index 0000000..f841e98 --- /dev/null +++ b/pkg/earwurm/vite.config.ts @@ -0,0 +1,35 @@ +import {defineConfig} from 'vite'; +import dts from 'vite-plugin-dts'; +import {resolve} from 'path'; + +import rootViteConfig from '../../vite.config'; +import pkg from './package.json'; + +export default defineConfig({ + ...rootViteConfig, + build: { + lib: { + entry: resolve(__dirname, 'src/index.ts'), + name: 'earwurm', + fileName: (format) => `earwurm.${format}.js`, + }, + rollupOptions: { + // We might need to define global variables + // to use in the UMD build. + external: Object.keys(pkg.peerDependencies || {}), + }, + minify: false, + }, + plugins: [ + dts({ + // Nessesary so that our `index.d.ts` file does not `import` + // monorepo packages that are not actually published. + bundledPackages: ['@earwurm/types'], + // Will capture only the types that are exposed to consumers + // and condense them all into a single file. If we also want + // unexported types, as well as their folder structure, then + // replace `rollupTypes` with `insertTypesEntry`. + rollupTypes: true, + }), + ], +}); diff --git a/src/helpers/fetch-audio-buffer.ts b/pkg/helpers/fetch-audio-buffer.ts similarity index 100% rename from src/helpers/fetch-audio-buffer.ts rename to pkg/helpers/fetch-audio-buffer.ts diff --git a/src/helpers/index.ts b/pkg/helpers/index.ts similarity index 80% rename from src/helpers/index.ts rename to pkg/helpers/index.ts index 9256005..1e30829 100644 --- a/src/helpers/index.ts +++ b/pkg/helpers/index.ts @@ -1,4 +1,3 @@ -export {getErrorMessage} from './error-message'; export {fetchAudioBuffer} from './fetch-audio-buffer'; export {linearRamp} from './linear-ramp'; export {scratchBuffer} from './scratch-buffer'; diff --git a/src/helpers/linear-ramp.ts b/pkg/helpers/linear-ramp.ts similarity index 100% rename from src/helpers/linear-ramp.ts rename to pkg/helpers/linear-ramp.ts diff --git a/pkg/helpers/package.json b/pkg/helpers/package.json new file mode 100644 index 0000000..1966466 --- /dev/null +++ b/pkg/helpers/package.json @@ -0,0 +1,14 @@ +{ + "name": "@earwurm/helpers", + "private": true, + "version": "0.0.0", + "license": "ISC", + "engines": { + "node": ">=20.10.0", + "pnpm": ">=8.14.0" + }, + "dependencies": {}, + "devDependencies": { + "@earwurm/mocks": "workspace:*" + } +} diff --git a/src/helpers/scratch-buffer.ts b/pkg/helpers/scratch-buffer.ts similarity index 100% rename from src/helpers/scratch-buffer.ts rename to pkg/helpers/scratch-buffer.ts diff --git a/pkg/helpers/tests/fetch-audio-buffer.test.ts b/pkg/helpers/tests/fetch-audio-buffer.test.ts new file mode 100644 index 0000000..14bcc3d --- /dev/null +++ b/pkg/helpers/tests/fetch-audio-buffer.test.ts @@ -0,0 +1,30 @@ +import {describe, it, expect} from 'vitest'; +import {mockData} from '@earwurm/mocks'; + +import {fetchAudioBuffer} from '../fetch-audio-buffer'; + +describe('fetchAudioBuffer()', () => { + const mockContext = new AudioContext(); + + it('throws parse Error on bogus path', async () => { + const mockPath = './path/nowhere.webm'; + + // This test used to check that the error was: + // `Failed to parse URL from ${mockPath}` + // However, we now get back a `[object Request]`, + await expect( + async () => await fetchAudioBuffer(mockPath, mockContext), + ).rejects.toThrowError(); + }); + + it.todo('throws network error on bad response'); + + // TODO: Cannot test against `fetch()` until we correctly mock it. + it.skip('returns AudioBuffer', async () => { + await expect( + fetchAudioBuffer(mockData.audio, mockContext).catch((_error) => {}), + ).resolves.toBeInstanceOf(AudioBuffer); + }); + + it.todo('passes custom options to fetch'); +}); diff --git a/pkg/helpers/tests/linear-ramp.test.ts b/pkg/helpers/tests/linear-ramp.test.ts new file mode 100644 index 0000000..f552158 --- /dev/null +++ b/pkg/helpers/tests/linear-ramp.test.ts @@ -0,0 +1,42 @@ +import {describe, it, expect, vi} from 'vitest'; + +import {linearRamp} from '../linear-ramp'; + +describe('linearRamp()', () => { + const mockContext = new AudioContext(); + + it('transitions to the specified value', async () => { + const mockAudioParam = new AudioParam(); + + const spyCancel = vi.spyOn(mockAudioParam, 'cancelScheduledValues'); + const spySet = vi.spyOn(mockAudioParam, 'setValueAtTime'); + const spyRamp = vi.spyOn(mockAudioParam, 'linearRampToValueAtTime'); + + const fromValue = mockAudioParam.value; + const fromTime = mockContext.currentTime; + + const toValue = 2; + const toTime = fromTime + 2; + + expect(spyCancel).not.toBeCalled(); + expect(spySet).not.toBeCalled(); + expect(spyRamp).not.toBeCalled(); + + const result = linearRamp( + mockAudioParam, + {from: fromValue, to: toValue}, + {from: fromTime, to: toTime}, + ); + + expect(result).toBeInstanceOf(AudioParam); + + expect(spyCancel).toBeCalledTimes(1); + expect(spyCancel).toBeCalledWith(fromTime); + + expect(spySet).toBeCalledTimes(1); + expect(spySet).toBeCalledWith(fromValue, fromTime); + + expect(spyRamp).toBeCalledTimes(1); + expect(spyRamp).toBeCalledWith(toValue, toTime); + }); +}); diff --git a/pkg/helpers/tests/scratch-buffer.test.ts b/pkg/helpers/tests/scratch-buffer.test.ts new file mode 100644 index 0000000..7ea2270 --- /dev/null +++ b/pkg/helpers/tests/scratch-buffer.test.ts @@ -0,0 +1,17 @@ +import {describe, it, expect} from 'vitest'; + +import {scratchBuffer} from '../scratch-buffer'; + +describe('scratchBuffer()', () => { + const mockContext = new AudioContext(); + + it('creates a short silent AudioBuffer', async () => { + const result = scratchBuffer(mockContext); + + expect(result).toBeInstanceOf(AudioBuffer); + + expect(result).toHaveProperty('length', 1); + expect(result).toHaveProperty('numberOfChannels', 1); + expect(result).toHaveProperty('sampleRate', 22050); + }); +}); diff --git a/pkg/helpers/tests/unlock-audio-context.test.ts b/pkg/helpers/tests/unlock-audio-context.test.ts new file mode 100644 index 0000000..8c6a1e3 --- /dev/null +++ b/pkg/helpers/tests/unlock-audio-context.test.ts @@ -0,0 +1,63 @@ +import {afterEach, describe, it, expect, vi} from 'vitest'; +import {audioBufferSourceNodeEndedEvent} from '@earwurm/mocks'; + +import {unlockAudioContext} from '../unlock-audio-context'; + +describe('unlockAudioContext()', () => { + const mockContext = new AudioContext(); + + afterEach(() => { + vi.advanceTimersToNextTimer(); + }); + + it('resumes AudioContext state', async () => { + const spyCreateBuffer = vi.spyOn(mockContext, 'createBuffer'); + const spyResume = vi.spyOn(mockContext, 'resume'); + + const spySourceConnect = vi.spyOn( + AudioBufferSourceNode.prototype, + 'connect', + ); + const spySourceStart = vi.spyOn(AudioBufferSourceNode.prototype, 'start'); + + unlockAudioContext(mockContext); + + expect(spyCreateBuffer).toBeCalledTimes(1); + expect(spyResume).not.toBeCalled(); + expect(spySourceConnect).not.toBeCalled(); + expect(spySourceStart).not.toBeCalled(); + + // Unlocks upon any of these events: + // `click`, `keydown`, `touchstart`, and `touchend`. + const clickEvent = new Event('click'); + document.dispatchEvent(clickEvent); + + expect(spyResume).toBeCalledTimes(2); + expect(spySourceConnect).toBeCalledWith(mockContext.destination); + expect(spySourceStart).toBeCalledTimes(1); + }); + + it('calls onEnded after interaction event', async () => { + vi.spyOn( + AudioBufferSourceNode.prototype, + 'addEventListener', + ).mockImplementation(audioBufferSourceNodeEndedEvent); + + const mockEnded = vi.fn(); + const spySourceDisconnect = vi.spyOn( + AudioBufferSourceNode.prototype, + 'disconnect', + ); + + unlockAudioContext(mockContext, mockEnded); + + expect(spySourceDisconnect).not.toBeCalled(); + expect(mockEnded).not.toBeCalled(); + + const keydownEvent = new Event('keydown'); + document.dispatchEvent(keydownEvent); + + expect(spySourceDisconnect).toBeCalledTimes(1); + expect(mockEnded).toBeCalledTimes(1); + }); +}); diff --git a/src/helpers/unlock-audio-context.ts b/pkg/helpers/unlock-audio-context.ts similarity index 100% rename from src/helpers/unlock-audio-context.ts rename to pkg/helpers/unlock-audio-context.ts diff --git a/src/tests/mock/MockAudioBuffer.ts b/pkg/mocks/MockAudioBuffer.ts similarity index 100% rename from src/tests/mock/MockAudioBuffer.ts rename to pkg/mocks/MockAudioBuffer.ts diff --git a/src/tests/mock/MockAudioBufferSourceNode.ts b/pkg/mocks/MockAudioBufferSourceNode.ts similarity index 100% rename from src/tests/mock/MockAudioBufferSourceNode.ts rename to pkg/mocks/MockAudioBufferSourceNode.ts diff --git a/src/tests/mock/MockAudioContext.ts b/pkg/mocks/MockAudioContext.ts similarity index 100% rename from src/tests/mock/MockAudioContext.ts rename to pkg/mocks/MockAudioContext.ts diff --git a/src/tests/mock/MockAudioDestinationNode.ts b/pkg/mocks/MockAudioDestinationNode.ts similarity index 100% rename from src/tests/mock/MockAudioDestinationNode.ts rename to pkg/mocks/MockAudioDestinationNode.ts diff --git a/src/tests/mock/MockAudioListener.ts b/pkg/mocks/MockAudioListener.ts similarity index 100% rename from src/tests/mock/MockAudioListener.ts rename to pkg/mocks/MockAudioListener.ts diff --git a/src/tests/mock/MockAudioNode.ts b/pkg/mocks/MockAudioNode.ts similarity index 100% rename from src/tests/mock/MockAudioNode.ts rename to pkg/mocks/MockAudioNode.ts diff --git a/src/tests/mock/MockAudioParam.ts b/pkg/mocks/MockAudioParam.ts similarity index 97% rename from src/tests/mock/MockAudioParam.ts rename to pkg/mocks/MockAudioParam.ts index 85e010a..22c84db 100644 --- a/src/tests/mock/MockAudioParam.ts +++ b/pkg/mocks/MockAudioParam.ts @@ -1,4 +1,4 @@ -import {secToMs} from '../../utilities'; +import {secToMs} from '@earwurm/utilities'; import {createErrorMessage} from './mock-utils'; function internalMessage(methodName: string, ...args: unknown[]) { diff --git a/src/tests/mock/MockAudioScheduledSourceNode.ts b/pkg/mocks/MockAudioScheduledSourceNode.ts similarity index 100% rename from src/tests/mock/MockAudioScheduledSourceNode.ts rename to pkg/mocks/MockAudioScheduledSourceNode.ts diff --git a/src/tests/mock/MockAudioWorklet.ts b/pkg/mocks/MockAudioWorklet.ts similarity index 100% rename from src/tests/mock/MockAudioWorklet.ts rename to pkg/mocks/MockAudioWorklet.ts diff --git a/src/tests/mock/MockBaseAudioContext.ts b/pkg/mocks/MockBaseAudioContext.ts similarity index 100% rename from src/tests/mock/MockBaseAudioContext.ts rename to pkg/mocks/MockBaseAudioContext.ts diff --git a/src/tests/mock/MockGainNode.ts b/pkg/mocks/MockGainNode.ts similarity index 100% rename from src/tests/mock/MockGainNode.ts rename to pkg/mocks/MockGainNode.ts diff --git a/src/tests/mock/MockWorklet.ts b/pkg/mocks/MockWorklet.ts similarity index 100% rename from src/tests/mock/MockWorklet.ts rename to pkg/mocks/MockWorklet.ts diff --git a/src/tests/mock/index.ts b/pkg/mocks/index.ts similarity index 100% rename from src/tests/mock/index.ts rename to pkg/mocks/index.ts diff --git a/src/tests/mock/mock-data.ts b/pkg/mocks/mock-data.ts similarity index 100% rename from src/tests/mock/mock-data.ts rename to pkg/mocks/mock-data.ts diff --git a/src/tests/mock/mock-utils.ts b/pkg/mocks/mock-utils.ts similarity index 100% rename from src/tests/mock/mock-utils.ts rename to pkg/mocks/mock-utils.ts diff --git a/pkg/mocks/package.json b/pkg/mocks/package.json new file mode 100644 index 0000000..1b17dc5 --- /dev/null +++ b/pkg/mocks/package.json @@ -0,0 +1,14 @@ +{ + "name": "@earwurm/mocks", + "private": true, + "version": "0.0.0", + "license": "ISC", + "engines": { + "node": ">=20.10.0", + "pnpm": ">=8.14.0" + }, + "dependencies": { + "@earwurm/utilities": "workspace:*" + }, + "devDependencies": {} +} diff --git a/pkg/types/index.ts b/pkg/types/index.ts new file mode 100644 index 0000000..9a9ed3a --- /dev/null +++ b/pkg/types/index.ts @@ -0,0 +1,30 @@ +export type Primitive = + | string + | number + | bigint + | boolean + | symbol + | undefined + | null; + +// eslint-disable-next-line @typescript-eslint/ban-types +export type Builtin = Primitive | Function | Date | Error | RegExp; + +export type AnyFn = (...args: any[]) => any; +export type Fn = () => void; + +export type GlobalEventCallback = (event: any) => void; +export type GlobalEventTarget = + | Document + | Window + | HTMLElement + | null + | undefined; + +export type UtcMilliseconds = ReturnType; + +export type IntervalId = number | ReturnType; +export type TimeoutId = number | ReturnType; + +// Tuple: custom error, original error. +export type CombinedErrorMessage = [string, string]; diff --git a/pkg/types/package.json b/pkg/types/package.json new file mode 100644 index 0000000..dd3039f --- /dev/null +++ b/pkg/types/package.json @@ -0,0 +1,12 @@ +{ + "name": "@earwurm/types", + "private": true, + "version": "0.0.0", + "license": "ISC", + "engines": { + "node": ">=20.10.0", + "pnpm": ">=8.14.0" + }, + "dependencies": {}, + "devDependencies": {} +} diff --git a/pkg/utilities/array.ts b/pkg/utilities/array.ts new file mode 100644 index 0000000..f6eb256 --- /dev/null +++ b/pkg/utilities/array.ts @@ -0,0 +1,29 @@ +import type {Primitive} from '@earwurm/types'; + +export function arrayDedupe(...arrays: T[]) { + // Not recursive (will not dedupe nested arrays). + return [...new Set([...arrays.flat()])]; +} + +export function arrayOfLength(length = 0) { + const safeLength = Math.max(0, length); + const ghostArray = Array.from(Array(safeLength)); + + return ghostArray.map((_item, index) => index); +} + +export function arrayShallowEquals(one: Primitive[], two: Primitive[]) { + const equalLength = one.length === two.length; + return equalLength && one.every((value, index) => value === two[index]); +} + +export function arrayShuffle(array: T[]): T[] { + return array + .map((item) => ({sort: Math.random(), value: item})) + .sort((one, two) => one.sort - two.sort) + .map((item) => item.value); +} + +export const typedObjectKeys = Object.keys as ( + obj: T, +) => Array; diff --git a/src/helpers/error-message.ts b/pkg/utilities/error.ts similarity index 100% rename from src/helpers/error-message.ts rename to pkg/utilities/error.ts diff --git a/pkg/utilities/index.ts b/pkg/utilities/index.ts new file mode 100644 index 0000000..67b2ff2 --- /dev/null +++ b/pkg/utilities/index.ts @@ -0,0 +1,34 @@ +export { + arrayDedupe, + arrayOfLength, + arrayShallowEquals, + arrayShuffle, + typedObjectKeys, +} from './array'; + +export {getErrorMessage} from './error'; + +export { + assertNumber, + assertInteger, + assertFloat, + calcProgress, + clamp, + flipNumberSign, + roundNumber, + trimDecimals, +} from './number'; + +export {objFilterNullish} from './object'; +export {randomFloat, randomInteger, randomBoolean} from './random'; + +export { + capitalize, + escapeStringRegexp, + kebabToPascal, + splitRetain, +} from './string'; + +export {supportDom, supportMatchMedia} from './support'; +export {timeMeasurement, msToSec, secToMs} from './time'; +export {debounce, sleep} from './wait'; diff --git a/pkg/utilities/number.ts b/pkg/utilities/number.ts new file mode 100644 index 0000000..98dacfd --- /dev/null +++ b/pkg/utilities/number.ts @@ -0,0 +1,62 @@ +import {objFilterNullish} from './object'; + +interface CalcProgressOptions { + min?: number; + max?: number; + round?: boolean; +} + +export function assertNumber(value?: unknown): value is number { + // Both `NaN` and `Infinity` are of type `number`, + // but will not pass the `isFinite()` check. + return typeof value === 'number' && isFinite(value); +} + +export function assertInteger(value?: unknown): value is number { + return assertNumber(value) && Number.isInteger(value); +} + +export function assertFloat(value?: unknown): value is number { + return assertNumber(value) && !Number.isInteger(value); +} + +export function calcProgress(value = 0, options?: CalcProgressOptions) { + const defaultOptions = {min: 0, max: 100, round: false}; + const {min, max, round} = { + ...defaultOptions, + ...objFilterNullish(options), + }; + + const range = max - min; + const adjustedValue = value - min; + const percentage = (adjustedValue / range) * 100; + const result = assertNumber(percentage) ? percentage : 0; + + return round ? Math.floor(result) : result; +} + +export function clamp(min = 0, preference = 0.5, max = 1) { + const result = Math.min(Math.max(min, preference), max); + return assertNumber(result) ? result : 0; +} + +export function flipNumberSign(value = 0) { + if (Object.is(value, -0)) return 0; + return value ? -value : value; +} + +export function roundNumber(value = 0, decimals = 0) { + const multiplier = Math.pow(10, decimals); + return Math.round(value * multiplier) / multiplier; +} + +export function trimDecimals(value = 0, decimals = 2) { + const parts = `${value}`.split('.').filter((part) => part !== '.'); + + if (parts.length <= 1) return value; + + const trimmedDecimals = parts[1].slice(0, decimals); + const joined = [parts[0], trimmedDecimals].join('.'); + + return parseFloat(joined); +} diff --git a/pkg/utilities/object.ts b/pkg/utilities/object.ts new file mode 100644 index 0000000..1d25b3f --- /dev/null +++ b/pkg/utilities/object.ts @@ -0,0 +1,14 @@ +export function objFilterNullish>(obj = {}): T { + const keys = Object.keys(obj) as Array; + + // NOTE: This filter function is not recursive! + return keys.reduce((accumulator, current) => { + return obj[current] == null + ? accumulator + : { + ...accumulator, + [current]: obj[current], + }; + // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter, @typescript-eslint/consistent-type-assertions + }, {} as T); +} diff --git a/pkg/utilities/package.json b/pkg/utilities/package.json new file mode 100644 index 0000000..3eed394 --- /dev/null +++ b/pkg/utilities/package.json @@ -0,0 +1,14 @@ +{ + "name": "@earwurm/utilities", + "private": true, + "version": "0.0.0", + "license": "ISC", + "engines": { + "node": ">=20.10.0", + "pnpm": ">=8.14.0" + }, + "dependencies": { + "@earwurm/types": "workspace:*" + }, + "devDependencies": {} +} diff --git a/pkg/utilities/random.ts b/pkg/utilities/random.ts new file mode 100644 index 0000000..5a09907 --- /dev/null +++ b/pkg/utilities/random.ts @@ -0,0 +1,15 @@ +export function randomFloat(min = 0, max = 1) { + const random = Math.random() * (max - min) + min; + return Math.min(random, max); +} + +export function randomInteger(min = 0, max = 1) { + const minCeil = Math.ceil(min); + const maxFloor = Math.floor(max); + + return Math.floor(Math.random() * (maxFloor - minCeil + 1)) + minCeil; +} + +export function randomBoolean() { + return Boolean(randomInteger()); +} diff --git a/pkg/utilities/string.ts b/pkg/utilities/string.ts new file mode 100644 index 0000000..b439192 --- /dev/null +++ b/pkg/utilities/string.ts @@ -0,0 +1,24 @@ +export function capitalize(word = '') { + return `${word.charAt(0).toUpperCase()}${word.slice(1).toLocaleLowerCase()}`; +} + +export function escapeStringRegexp(value = '') { + // Useful for constructing regex strings that require + // special characters to be escaped. + return value.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d'); +} + +export function kebabToPascal(value = '') { + return value.split('-').map(capitalize).join(''); +} + +export function splitRetain(value = '', match = '') { + if (!match) return [value]; + + // This utility is useful for things like a fuzzy search + // where you want to highlight the `match` within a term. + const escaped = escapeStringRegexp(match); + const search = new RegExp(`(${escaped})`, 'i'); + + return value.split(search).filter((entry) => entry !== ''); +} diff --git a/pkg/utilities/support.ts b/pkg/utilities/support.ts new file mode 100644 index 0000000..96e3190 --- /dev/null +++ b/pkg/utilities/support.ts @@ -0,0 +1,8 @@ +export function supportDom() { + return typeof window?.document?.createElement !== 'undefined'; +} + +export function supportMatchMedia() { + return () => + window && 'matchMedia' in window && typeof window.matchMedia === 'function'; +} diff --git a/pkg/utilities/tests/array.test.ts b/pkg/utilities/tests/array.test.ts new file mode 100644 index 0000000..207c9d6 --- /dev/null +++ b/pkg/utilities/tests/array.test.ts @@ -0,0 +1,86 @@ +import {describe, it, expect} from 'vitest'; + +import { + arrayDedupe, + arrayOfLength, + arrayShallowEquals, + arrayShuffle, + typedObjectKeys, +} from '../array'; + +describe('array utilities', () => { + describe('arrayDedupe()', () => { + it('removes duplicates within a single array', async () => { + const result = arrayDedupe([1, 2, 3, 1, 2, 3]); + expect(result).toStrictEqual([1, 2, 3]); + }); + + it('removes duplicates across multiple arrays', async () => { + const result = arrayDedupe([1, 2, 3], [3, 2, 1], [4, 2, 0]); + expect(result).toStrictEqual([1, 2, 3, 4, 0]); + }); + }); + + describe('arrayOfLength()', () => { + it('returns an empty array by default', async () => { + const result = arrayOfLength(); + expect(result).toStrictEqual([]); + }); + + it('returns an array of incremented index values', async () => { + const mockLength = 6; + const result = arrayOfLength(mockLength); + + expect(result).toStrictEqual([0, 1, 2, 3, 4, 5]); + expect(result).toHaveLength(mockLength); + }); + }); + + describe('arrayShallowEquals()', () => { + it('returns `true` when matching', async () => { + const result = arrayShallowEquals( + [true, false, null, undefined, 0, 1, 'end'], + [true, false, null, undefined, 0, 1, 'end'], + ); + expect(result).toBe(true); + }); + + it('returns `false` when at least one value is unmatched', async () => { + const result = arrayShallowEquals([true, false], [false, true]); + expect(result).toBe(false); + }); + }); + + describe('arrayShuffle()', () => { + // Since the shuffle is randomized, it is possible that + // this test could occasionally fail. + it('returns a shuffled array with all equivalent values at difference indices', async () => { + const original = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + const result = arrayShuffle(original); + + expect([...original]).toStrictEqual(original); + + expect(result).not.toStrictEqual(original); + expect(result).toHaveLength(original.length); + + // eslint-disable-next-line @typescript-eslint/require-array-sort-compare + expect(result.toSorted()).toStrictEqual(original); + }); + }); + + describe('typedObjectKeys()', () => { + it('returns the equivalent of Object.keys()', async () => { + const mockObj = { + foo: 1, + bar: 'two', + beef: false, + chimi: null, + earwurm: undefined, + }; + const result = typedObjectKeys(mockObj); + + expect(result).toStrictEqual(['foo', 'bar', 'beef', 'chimi', 'earwurm']); + expect(result).toStrictEqual(Object.keys(mockObj)); + }); + }); +}); diff --git a/pkg/utilities/tests/error.test.ts b/pkg/utilities/tests/error.test.ts new file mode 100644 index 0000000..6130c5a --- /dev/null +++ b/pkg/utilities/tests/error.test.ts @@ -0,0 +1,35 @@ +import {describe, it, expect} from 'vitest'; + +import {getErrorMessage} from '../error'; + +describe('error utilities', () => { + describe('getErrorMessage()', () => { + it('returns message from basic object', async () => { + const mockError = { + message: 'foo', + }; + + const result = getErrorMessage(mockError); + + expect(result).toBe(mockError.message); + }); + + it('returns message from Error', async () => { + const mockMessage = 'Foo'; + const mockError = new Error(mockMessage, { + cause: 'bar', + }); + + const result = getErrorMessage(mockError); + + expect(result).toBe(mockMessage); + }); + + it('returns stringified result when unknown', async () => { + const mockError = ['foo', true, {bar: false}, null]; + const result = getErrorMessage(mockError); + + expect(result).toBe(JSON.stringify(mockError)); + }); + }); +}); diff --git a/pkg/utilities/tests/number.test.ts b/pkg/utilities/tests/number.test.ts new file mode 100644 index 0000000..2cd32ed --- /dev/null +++ b/pkg/utilities/tests/number.test.ts @@ -0,0 +1,199 @@ +import {describe, it, expect} from 'vitest'; + +import { + assertNumber, + assertInteger, + assertFloat, + clamp, + calcProgress, + flipNumberSign, + roundNumber, + trimDecimals, +} from '../number'; + +describe('number utilities', () => { + describe('assertNumber()', () => { + it('accepts an integer', async () => { + const result = assertNumber(123); + expect(result).toBe(true); + }); + + it('accepts a float', async () => { + const result = assertNumber(123.456); + expect(result).toBe(true); + }); + + it('does not allow a bigint', async () => { + const result = assertNumber(1000n); + expect(result).toBe(false); + }); + + it('does not allow NaN', async () => { + const result = assertNumber(NaN); + expect(result).toBe(false); + }); + + it('does not allow Infinity', async () => { + const result = assertNumber(Infinity); + expect(result).toBe(false); + }); + + it('does not allow other non-numnber types', async () => { + expect(assertNumber(true)).toBe(false); + expect(assertNumber(false)).toBe(false); + expect(assertNumber({one: 1})).toBe(false); + expect(assertNumber([1, 2, 3])).toBe(false); + expect(assertNumber('123')).toBe(false); + }); + }); + + describe('assertInteger()', () => { + it('returns true when int', async () => { + const result = assertInteger(123); + expect(result).toBe(true); + }); + + it('returns false when float', async () => { + const result = assertInteger(12.3); + expect(result).toBe(false); + }); + }); + + describe('assertFloat()', () => { + it('returns true when float', async () => { + const result = assertFloat(12.3); + expect(result).toBe(true); + }); + + it('returns false when int', async () => { + const result = assertFloat(123); + expect(result).toBe(false); + }); + }); + + describe('calcProgress()', () => { + it('returns percentage integer', async () => { + const result = calcProgress(10); + expect(result).toBe(10); + }); + + it('returns floating-point result', async () => { + const result = calcProgress(12, {max: 345}); + expect(result).toBe(3.4782608695652173); + }); + + it('returns rounded result', async () => { + const result = calcProgress(12, {max: 345, round: true}); + expect(result).toBe(3); + }); + + it('returns percentage between min and max', async () => { + const result = calcProgress(0, {min: -10, max: 10}); + expect(result).toBe(50); + }); + + it('protects against NaN', async () => { + const result = calcProgress(0, {max: 0}); + expect(result).toBe(0); + }); + + it('protects against Infinity', async () => { + const result = calcProgress(2, {max: 0}); + expect(result).toBe(0); + }); + }); + + describe('clamp()', () => { + it('returns preference', async () => { + const mockArgs: Parameters = [1, 10, 100]; + const result = clamp(...mockArgs); + + expect(result).toBe(10); + }); + + it('returns min', async () => { + const mockArgs: Parameters = [10, 1, 100]; + const result = clamp(...mockArgs); + + expect(result).toBe(10); + }); + + it('returns max', async () => { + const mockArgs: Parameters = [1, 100, 10]; + const result = clamp(...mockArgs); + + expect(result).toBe(10); + }); + + it('protects against NaN', async () => { + const result = clamp(1, NaN, 2); + expect(result).toBe(0); + }); + + it('protects against Infinity', async () => { + const result = clamp(Infinity, Infinity, Infinity); + expect(result).toBe(0); + }); + }); + + describe('flipNumberSign()', () => { + it('returns a negative number when provided a positive number', async () => { + const result = flipNumberSign(123); + expect(result).toBe(-123); + }); + + it('returns a positive number when provided a negative number', async () => { + const result = flipNumberSign(-321); + expect(result).toBe(321); + }); + + it('returns a positive 0', async () => { + const result = flipNumberSign(-0); + expect(result).toBe(0); + }); + + it('does not flip a positive 0 to negative', async () => { + const result = flipNumberSign(0); + expect(result).toBe(0); + }); + }); + + describe('roundNumber()', () => { + it('returns an integer by default', async () => { + const result = roundNumber(123.456); + expect(result).toBe(123); + }); + + it('rounds to the specified decimal length', async () => { + const result = roundNumber(1234.567, 2); + expect(result).toBe(1234.57); + }); + + it('trims to the specified decimal length when rounding is not required', async () => { + const result = roundNumber(9876.54321, 3); + expect(result).toBe(9876.543); + }); + + it('does no additional rounding when not required', async () => { + const result = roundNumber(654.321, 8); + expect(result).toBe(654.321); + }); + }); + + describe('trimDecimals()', () => { + it('returns an integer when there is nothing to trim', async () => { + const result = trimDecimals(123); + expect(result).toBe(123); + }); + + it('returns 2 decimal places by default', async () => { + const result = trimDecimals(987.654321); + expect(result).toBe(987.65); + }); + + it('returns the specified decimals', async () => { + const result = trimDecimals(123.456789, 3); + expect(result).toBe(123.456); + }); + }); +}); diff --git a/pkg/utilities/tests/object.test.ts b/pkg/utilities/tests/object.test.ts new file mode 100644 index 0000000..04cc303 --- /dev/null +++ b/pkg/utilities/tests/object.test.ts @@ -0,0 +1,31 @@ +import {describe, it, expect} from 'vitest'; + +import {objFilterNullish} from '../object'; + +describe('object utilities', () => { + describe('objFilterNullish()', () => { + it('returns an object with all null and undefined entries removed', async () => { + const mockObj = { + foo: 1, + bar: 2, + beef: true, + chimi: false, + ear: null, + wurm: undefined, + chicken: 0, + friendship: Infinity, + }; + + const result = objFilterNullish(mockObj); + + expect(result).toStrictEqual({ + foo: 1, + bar: 2, + beef: true, + chimi: false, + chicken: 0, + friendship: Infinity, + }); + }); + }); +}); diff --git a/pkg/utilities/tests/random.test.ts b/pkg/utilities/tests/random.test.ts new file mode 100644 index 0000000..23c9026 --- /dev/null +++ b/pkg/utilities/tests/random.test.ts @@ -0,0 +1,44 @@ +import {describe, it, expect} from 'vitest'; + +import {randomFloat, randomInteger, randomBoolean} from '../random'; + +describe('random utilities', () => { + describe('randomFloat()', () => { + it('returns a random floating-point number', async () => { + const result = randomFloat(); + expect(`${result}`).toContain('.'); + }); + + it('returns a number between the specified range', async () => { + const min = 1.8; + const max = 1.9; + const result = randomFloat(min, max); + + expect(result).toBeGreaterThanOrEqual(min); + expect(result).toBeLessThanOrEqual(max); + }); + }); + + describe('randomInteger()', () => { + it('returns a random integer', async () => { + const result = randomInteger(); + expect(`${result}`).not.toContain('.'); + }); + + it('returns a number between the specified range', async () => { + const min = 2; + const max = 4; + const result = randomInteger(min, max); + + expect(result).toBeGreaterThanOrEqual(min); + expect(result).toBeLessThanOrEqual(max); + }); + }); + + describe('randomBoolean()', () => { + it('returns a random boolean', async () => { + const result = randomBoolean(); + expect(typeof result === 'boolean').toBe(true); + }); + }); +}); diff --git a/pkg/utilities/tests/string.test.ts b/pkg/utilities/tests/string.test.ts new file mode 100644 index 0000000..b793c75 --- /dev/null +++ b/pkg/utilities/tests/string.test.ts @@ -0,0 +1,40 @@ +import {describe, it, expect} from 'vitest'; + +import { + capitalize, + // escapeStringRegexp, + kebabToPascal, + splitRetain, +} from '../string'; + +describe('string utilities', () => { + describe('capitalize()', () => { + it('capitalizes only the first letter', async () => { + const result = capitalize('hello world'); + expect(result).toBe('Hello world'); + }); + }); + + describe('escapeStringRegexp()', () => { + // TODO: Determine the best way to get around these escape characters. + // const result = escapeStringRegexp('start | \ { } ( ) [ ] ^ $ + * ? . - end'); + // expect(result).toBe('start \| \\ \{ \} \( \) \[ \] \^ \$ \+ \* \? \. \- end'); + it.todo( + 'returns a string with an escape character in front of each special character', + ); + }); + + describe('kebabToPascal()', () => { + it('converts the provided slug', async () => { + const result = kebabToPascal('hello-world-foo-bar'); + expect(result).toBe('HelloWorldFooBar'); + }); + }); + + describe('splitRetain()', () => { + it('splits the string by match', async () => { + const result = splitRetain('Hello world foo bar Earwurm', 'world'); + expect(result).toStrictEqual(['Hello ', 'world', ' foo bar Earwurm']); + }); + }); +}); diff --git a/pkg/utilities/tests/support.test.ts b/pkg/utilities/tests/support.test.ts new file mode 100644 index 0000000..37ecc1b --- /dev/null +++ b/pkg/utilities/tests/support.test.ts @@ -0,0 +1,19 @@ +import {describe, it, expect} from 'vitest'; + +import {supportDom, supportMatchMedia} from '../support'; + +describe('support utilities', () => { + describe('supportDom()', () => { + it('returns true in this test environment', async () => { + const result = supportDom(); + expect(result).toBe(true); + }); + }); + + describe('supportMatchMedia()', () => { + it('returns true in this test environment', async () => { + const resultFunction = supportMatchMedia(); + expect(resultFunction()).toBe(true); + }); + }); +}); diff --git a/pkg/utilities/tests/time.test.ts b/pkg/utilities/tests/time.test.ts new file mode 100644 index 0000000..891a175 --- /dev/null +++ b/pkg/utilities/tests/time.test.ts @@ -0,0 +1,19 @@ +import {describe, it, expect} from 'vitest'; + +import {msToSec, secToMs} from '../time'; + +describe('time utilities', () => { + describe('msToSec()', () => { + it('converts to seconds', async () => { + const result = msToSec(1234); + expect(result).toBe(1.234); + }); + }); + + describe('secToMs()', () => { + it('converts to milliseconds', async () => { + const result = secToMs(5.678); + expect(result).toBe(5678); + }); + }); +}); diff --git a/pkg/utilities/tests/wait.test.ts b/pkg/utilities/tests/wait.test.ts new file mode 100644 index 0000000..0e2cac1 --- /dev/null +++ b/pkg/utilities/tests/wait.test.ts @@ -0,0 +1,14 @@ +import {describe, it} from 'vitest'; + +// TODO: Finish these tests. +// import {debounce, sleep} from '../support'; + +describe('wait utilities', () => { + describe('debounce()', () => { + it.todo('does not execute more than the timeout allows'); + }); + + describe('sleep()', () => { + it.todo('creates a Promise that resolves after the specified time'); + }); +}); diff --git a/pkg/utilities/time.ts b/pkg/utilities/time.ts new file mode 100644 index 0000000..eb129da --- /dev/null +++ b/pkg/utilities/time.ts @@ -0,0 +1,71 @@ +const monthsPerYear = 12; + +const weeksPerMonth = 4; +const weeksPerYear = 52; + +const daysPerWeek = 7; +const daysPerMonth = 30; +const daysPerYear = 365; + +const hrsPerDay = 24; +const hrsPerWeek = hrsPerDay * daysPerWeek; +const hrsPerMonth = hrsPerDay * daysPerMonth; +const hrsPerYear = hrsPerDay * daysPerYear; + +const minsPerHr = 60; +const minsPerDay = minsPerHr * hrsPerDay; +const minsPerWeek = minsPerDay * daysPerWeek; +const minsPerMonth = minsPerDay * daysPerMonth; +const minsPerYear = minsPerDay * daysPerYear; + +const secsPerMin = 60; +const secsPerHr = secsPerMin * minsPerHr; +const secsPerDay = secsPerHr * hrsPerDay; +const secsPerWeek = secsPerDay * daysPerWeek; +const secsPerMonth = secsPerDay * daysPerMonth; +const secsPerYear = secsPerDay * daysPerYear; + +const msPerSec = 1000; +const msPerMin = msPerSec * secsPerMin; +const msPerHr = msPerMin * minsPerHr; +const msPerDay = msPerHr * hrsPerDay; +const msPerWeek = msPerDay * daysPerWeek; +const msPerMonth = msPerDay * daysPerMonth; +const msPerYear = msPerDay * daysPerYear; + +export const timeMeasurement = { + monthsPerYear, + weeksPerMonth, + weeksPerYear, + daysPerWeek, + hrsPerDay, + hrsPerWeek, + hrsPerMonth, + hrsPerYear, + minsPerHr, + minsPerDay, + minsPerWeek, + minsPerMonth, + minsPerYear, + secsPerMin, + secsPerHr, + secsPerDay, + secsPerWeek, + secsPerMonth, + secsPerYear, + msPerSec, + msPerMin, + msPerHr, + msPerDay, + msPerWeek, + msPerMonth, + msPerYear, +}; + +export function msToSec(milliseconds = 0) { + return milliseconds / msPerSec; +} + +export function secToMs(seconds = 0) { + return seconds * msPerSec; +} diff --git a/pkg/utilities/wait.ts b/pkg/utilities/wait.ts new file mode 100644 index 0000000..e4367dd --- /dev/null +++ b/pkg/utilities/wait.ts @@ -0,0 +1,18 @@ +export function debounce) => ReturnType>( + callback: T, + timeout: number, +): (...args: Parameters) => void { + let timer: ReturnType; + + return (...args: Parameters) => { + clearTimeout(timer); + + timer = setTimeout(() => { + callback(...args); + }, timeout); + }; +} + +export async function sleep(ms = 0) { + return await new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..158667a --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5711 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@changesets/changelog-github': + specifier: ^0.5.0 + version: 0.5.0 + '@changesets/cli': + specifier: ^2.27.1 + version: 2.27.1 + '@types/node': + specifier: ^20.11.5 + version: 20.11.5 + '@typescript-eslint/eslint-plugin': + specifier: ^6.19.0 + version: 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) + '@vitest/coverage-v8': + specifier: ^1.2.1 + version: 1.2.1(vitest@1.2.1) + '@vitest/ui': + specifier: ^1.2.1 + version: 1.2.1(vitest@1.2.1) + eslint: + specifier: ^8.56.0 + version: 8.56.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.56.0) + eslint-config-standard-with-typescript: + specifier: ^43.0.1 + version: 43.0.1(@typescript-eslint/eslint-plugin@6.19.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)(typescript@5.3.3) + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.19.0)(eslint@8.56.0) + eslint-plugin-n: + specifier: ^16.6.2 + version: 16.6.2(eslint@8.56.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.4) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.1.1(eslint@8.56.0) + happy-dom: + specifier: ^13.2.0 + version: 13.2.0 + prettier: + specifier: ^3.2.4 + version: 3.2.4 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + vite: + specifier: ^5.0.12 + version: 5.0.12(@types/node@20.11.5)(lightningcss@1.23.0) + vitest: + specifier: ^1.2.1 + version: 1.2.1(@types/node@20.11.5)(@vitest/ui@1.2.1)(happy-dom@13.2.0) + + app/website: + dependencies: + '@earwurm/utilities': + specifier: workspace:* + version: link:../../pkg/utilities + earwurm: + specifier: workspace:* + version: link:../../pkg/earwurm + vue: + specifier: ^3.4.15 + version: 3.4.15(typescript@5.3.3) + devDependencies: + '@earwurm/types': + specifier: workspace:* + version: link:../../pkg/types + '@rushstack/eslint-patch': + specifier: ^1.7.0 + version: 1.7.0 + '@tsconfig/node20': + specifier: ^20.1.2 + version: 20.1.2 + '@vitejs/plugin-vue': + specifier: ^5.0.3 + version: 5.0.3(vite@5.0.12)(vue@3.4.15) + '@vue/eslint-config-prettier': + specifier: ^9.0.0 + version: 9.0.0(eslint@8.56.0)(prettier@3.2.4) + '@vue/eslint-config-typescript': + specifier: ^12.0.0 + version: 12.0.0(eslint-plugin-vue@9.20.1)(eslint@8.56.0)(typescript@5.3.3) + '@vue/tsconfig': + specifier: ^0.5.1 + version: 0.5.1 + eslint-plugin-vue: + specifier: ^9.20.1 + version: 9.20.1(eslint@8.56.0) + lightningcss: + specifier: ^1.23.0 + version: 1.23.0 + vite-plugin-svg-sprite: + specifier: ^0.5.1 + version: 0.5.1(vite@5.0.12) + vue-tsc: + specifier: ^1.8.27 + version: 1.8.27(typescript@5.3.3) + + pkg/earwurm: + dependencies: + '@earwurm/helpers': + specifier: workspace:* + version: link:../helpers + '@earwurm/types': + specifier: workspace:* + version: link:../types + '@earwurm/utilities': + specifier: workspace:* + version: link:../utilities + emitten: + specifier: ^0.6.3 + version: 0.6.3 + devDependencies: + '@earwurm/mocks': + specifier: workspace:* + version: link:../mocks + vite: + specifier: ^5.0.12 + version: 5.0.12(@types/node@20.11.5)(lightningcss@1.23.0) + vite-plugin-dts: + specifier: ^3.7.1 + version: 3.7.1(@types/node@20.11.5)(typescript@5.3.3)(vite@5.0.12) + + pkg/helpers: + devDependencies: + '@earwurm/mocks': + specifier: workspace:* + version: link:../mocks + + pkg/mocks: + dependencies: + '@earwurm/utilities': + specifier: workspace:* + version: link:../utilities + + pkg/types: {} + + pkg/utilities: + dependencies: + '@earwurm/types': + specifier: workspace:* + version: link:../types + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 + dev: true + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + + /@babel/runtime@7.23.8: + resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: true + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@changesets/apply-release-plan@7.0.0: + resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + dependencies: + '@babel/runtime': 7.23.8 + '@changesets/config': 3.0.0 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.5.4 + dev: true + + /@changesets/assemble-release-plan@6.0.0: + resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + dependencies: + '@babel/runtime': 7.23.8 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.5.4 + dev: true + + /@changesets/changelog-git@0.2.0: + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + dependencies: + '@changesets/types': 6.0.0 + dev: true + + /@changesets/changelog-github@0.5.0: + resolution: {integrity: sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==} + dependencies: + '@changesets/get-github-info': 0.6.0 + '@changesets/types': 6.0.0 + dotenv: 8.6.0 + transitivePeerDependencies: + - encoding + dev: true + + /@changesets/cli@2.27.1: + resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + hasBin: true + dependencies: + '@babel/runtime': 7.23.8 + '@changesets/apply-release-plan': 7.0.0 + '@changesets/assemble-release-plan': 6.0.0 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.0 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/get-release-plan': 4.0.0 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.0 + '@manypkg/get-packages': 1.1.3 + '@types/semver': 7.5.6 + ansi-colors: 4.1.3 + chalk: 2.4.2 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + meow: 6.1.1 + outdent: 0.5.0 + p-limit: 2.3.0 + preferred-pm: 3.1.2 + resolve-from: 5.0.0 + semver: 7.5.4 + spawndamnit: 2.0.0 + term-size: 2.2.1 + tty-table: 4.2.3 + dev: true + + /@changesets/config@3.0.0: + resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/logger': 0.1.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.5 + dev: true + + /@changesets/errors@0.2.0: + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + dependencies: + extendable-error: 0.1.7 + dev: true + + /@changesets/get-dependents-graph@2.0.0: + resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + chalk: 2.4.2 + fs-extra: 7.0.1 + semver: 7.5.4 + dev: true + + /@changesets/get-github-info@0.6.0: + resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} + dependencies: + dataloader: 1.4.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + + /@changesets/get-release-plan@4.0.0: + resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + dependencies: + '@babel/runtime': 7.23.8 + '@changesets/assemble-release-plan': 6.0.0 + '@changesets/config': 3.0.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + dev: true + + /@changesets/get-version-range-type@0.4.0: + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + dev: true + + /@changesets/git@3.0.0: + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + dependencies: + '@babel/runtime': 7.23.8 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.5 + spawndamnit: 2.0.0 + dev: true + + /@changesets/logger@0.1.0: + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + dependencies: + chalk: 2.4.2 + dev: true + + /@changesets/parse@0.4.0: + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 + dev: true + + /@changesets/pre@2.0.0: + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + dependencies: + '@babel/runtime': 7.23.8 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + dev: true + + /@changesets/read@0.6.0: + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + dependencies: + '@babel/runtime': 7.23.8 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + chalk: 2.4.2 + fs-extra: 7.0.1 + p-filter: 2.1.0 + dev: true + + /@changesets/types@4.1.0: + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + dev: true + + /@changesets/types@6.0.0: + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + dev: true + + /@changesets/write@0.3.0: + resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + dependencies: + '@babel/runtime': 7.23.8 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + dev: true + + /@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.22 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@manypkg/find-root@1.1.0: + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + dependencies: + '@babel/runtime': 7.23.8 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + dev: true + + /@manypkg/get-packages@1.1.3: + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + dependencies: + '@babel/runtime': 7.23.8 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + dev: true + + /@microsoft/api-extractor-model@7.28.3(@types/node@20.11.5): + resolution: {integrity: sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.62.0(@types/node@20.11.5) + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor@7.39.0(@types/node@20.11.5): + resolution: {integrity: sha512-PuXxzadgnvp+wdeZFPonssRAj/EW4Gm4s75TXzPk09h3wJ8RS3x7typf95B4vwZRrPTQBGopdUl+/vHvlPdAcg==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.28.3(@types/node@20.11.5) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.62.0(@types/node@20.11.5) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.3.3 + 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@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + dev: true + + /@pkgr/core@0.1.1: + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + + /@polka/url@1.0.0-next.24: + resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + dev: true + + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rollup/rollup-android-arm-eabi@4.9.5: + resolution: {integrity: sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.9.5: + resolution: {integrity: sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.9.5: + resolution: {integrity: sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.9.5: + resolution: {integrity: sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.9.5: + resolution: {integrity: sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.9.5: + resolution: {integrity: sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.9.5: + resolution: {integrity: sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.9.5: + resolution: {integrity: sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.5: + resolution: {integrity: sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.9.5: + resolution: {integrity: sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.9.5: + resolution: {integrity: sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.9.5: + resolution: {integrity: sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.9.5: + resolution: {integrity: sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rushstack/eslint-patch@1.7.0: + resolution: {integrity: sha512-Jh4t/593gxs0lJZ/z3NnasKlplXT2f+4y/LZYuaKZW5KAaiVFL/fThhs+17EbUd53jUVJ0QudYCBGbN/psvaqg==} + dev: true + + /@rushstack/node-core-library@3.62.0(@types/node@20.11.5): + resolution: {integrity: sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 20.11.5 + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + dev: true + + /@rushstack/rig-package@0.5.1: + resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + dev: true + + /@rushstack/ts-command-line@4.17.1: + resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@tsconfig/node20@20.1.2: + resolution: {integrity: sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==} + dev: true + + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: true + + /@types/node@20.11.5: + resolution: {integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: true + + /@typescript-eslint/eslint-plugin@6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.19.0 + '@typescript-eslint/type-utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.19.0 + debug: 4.3.4 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.19.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.19.0 + '@typescript-eslint/types': 6.19.0 + '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.19.0 + debug: 4.3.4 + eslint: 8.56.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@6.19.0: + resolution: {integrity: sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.19.0 + '@typescript-eslint/visitor-keys': 6.19.0 + dev: true + + /@typescript-eslint/type-utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@6.19.0: + resolution: {integrity: sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@6.19.0(typescript@5.3.3): + resolution: {integrity: sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.19.0 + '@typescript-eslint/visitor-keys': 6.19.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.19.0 + '@typescript-eslint/types': 6.19.0 + '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) + eslint: 8.56.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.19.0: + resolution: {integrity: sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.19.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@vitejs/plugin-vue@5.0.3(vite@5.0.12)(vue@3.4.15): + resolution: {integrity: sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + dependencies: + vite: 5.0.12(@types/node@20.11.5)(lightningcss@1.23.0) + vue: 3.4.15(typescript@5.3.3) + dev: true + + /@vitest/coverage-v8@1.2.1(vitest@1.2.1): + resolution: {integrity: sha512-fJEhKaDwGMZtJUX7BRcGxooGwg1Hl0qt53mVup/ZJeznhvL5EodteVnb/mcByhEcvVWbK83ZF31c7nPEDi4LOQ==} + peerDependencies: + vitest: ^1.0.0 + dependencies: + '@ampproject/remapping': 2.2.1 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + magic-string: 0.30.5 + magicast: 0.3.3 + picocolors: 1.0.0 + std-env: 3.7.0 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + vitest: 1.2.1(@types/node@20.11.5)(@vitest/ui@1.2.1)(happy-dom@13.2.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@1.2.1: + resolution: {integrity: sha512-/bqGXcHfyKgFWYwIgFr1QYDaR9e64pRKxgBNWNXPefPFRhgm+K3+a/dS0cUGEreWngets3dlr8w8SBRw2fCfFQ==} + dependencies: + '@vitest/spy': 1.2.1 + '@vitest/utils': 1.2.1 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.2.1: + resolution: {integrity: sha512-zc2dP5LQpzNzbpaBt7OeYAvmIsRS1KpZQw4G3WM/yqSV1cQKNKwLGmnm79GyZZjMhQGlRcSFMImLjZaUQvNVZQ==} + dependencies: + '@vitest/utils': 1.2.1 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.2.1: + resolution: {integrity: sha512-Tmp/IcYEemKaqAYCS08sh0vORLJkMr0NRV76Gl8sHGxXT5151cITJCET20063wk0Yr/1koQ6dnmP6eEqezmd/Q==} + dependencies: + magic-string: 0.30.5 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.2.1: + resolution: {integrity: sha512-vG3a/b7INKH7L49Lbp0IWrG6sw9j4waWAucwnksPB1r1FTJgV7nkBByd9ufzu6VWya/QTvQW4V9FShZbZIB2UQ==} + dependencies: + tinyspy: 2.2.0 + dev: true + + /@vitest/ui@1.2.1(vitest@1.2.1): + resolution: {integrity: sha512-5kyEDpH18TB13Keutk5VScWG+LUDfPJOL2Yd1hqX+jv6+V74tp4ZYcmTgx//WDngiZA5PvX3qCHQ5KrhGzPbLg==} + peerDependencies: + vitest: ^1.0.0 + dependencies: + '@vitest/utils': 1.2.1 + fast-glob: 3.3.2 + fflate: 0.8.1 + flatted: 3.2.9 + pathe: 1.1.2 + picocolors: 1.0.0 + sirv: 2.0.4 + vitest: 1.2.1(@types/node@20.11.5)(@vitest/ui@1.2.1)(happy-dom@13.2.0) + dev: true + + /@vitest/utils@1.2.1: + resolution: {integrity: sha512-bsH6WVZYe/J2v3+81M5LDU8kW76xWObKIURpPrOXm2pjBniBu2MERI/XP60GpS4PHU3jyK50LUutOwrx4CyHUg==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + + /@volar/language-core@1.11.1: + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + dependencies: + '@volar/source-map': 1.11.1 + dev: true + + /@volar/source-map@1.11.1: + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + dependencies: + muggle-string: 0.3.1 + dev: true + + /@volar/typescript@1.11.1: + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + dev: true + + /@vue/compiler-core@3.4.15: + resolution: {integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==} + dependencies: + '@babel/parser': 7.23.6 + '@vue/shared': 3.4.15 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + + /@vue/compiler-dom@3.4.15: + resolution: {integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==} + dependencies: + '@vue/compiler-core': 3.4.15 + '@vue/shared': 3.4.15 + + /@vue/compiler-sfc@3.4.15: + resolution: {integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==} + dependencies: + '@babel/parser': 7.23.6 + '@vue/compiler-core': 3.4.15 + '@vue/compiler-dom': 3.4.15 + '@vue/compiler-ssr': 3.4.15 + '@vue/shared': 3.4.15 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.33 + source-map-js: 1.0.2 + + /@vue/compiler-ssr@3.4.15: + resolution: {integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==} + dependencies: + '@vue/compiler-dom': 3.4.15 + '@vue/shared': 3.4.15 + + /@vue/eslint-config-prettier@9.0.0(eslint@8.56.0)(prettier@3.2.4): + resolution: {integrity: sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==} + peerDependencies: + eslint: '>= 8.0.0' + prettier: '>= 3.0.0' + dependencies: + eslint: 8.56.0 + eslint-config-prettier: 9.1.0(eslint@8.56.0) + eslint-plugin-prettier: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.4) + prettier: 3.2.4 + transitivePeerDependencies: + - '@types/eslint' + dev: true + + /@vue/eslint-config-typescript@12.0.0(eslint-plugin-vue@9.20.1)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-vue: ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + eslint: 8.56.0 + eslint-plugin-vue: 9.20.1(eslint@8.56.0) + typescript: 5.3.3 + vue-eslint-parser: 9.4.0(eslint@8.56.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@vue/language-core@1.8.27(typescript@5.3.3): + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.4.15 + '@vue/shared': 3.4.15 + computeds: 0.0.1 + minimatch: 9.0.3 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + typescript: 5.3.3 + vue-template-compiler: 2.7.16 + dev: true + + /@vue/reactivity@3.4.15: + resolution: {integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==} + dependencies: + '@vue/shared': 3.4.15 + + /@vue/runtime-core@3.4.15: + resolution: {integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==} + dependencies: + '@vue/reactivity': 3.4.15 + '@vue/shared': 3.4.15 + + /@vue/runtime-dom@3.4.15: + resolution: {integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==} + dependencies: + '@vue/runtime-core': 3.4.15 + '@vue/shared': 3.4.15 + csstype: 3.1.3 + + /@vue/server-renderer@3.4.15(vue@3.4.15): + resolution: {integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==} + peerDependencies: + vue: 3.4.15 + dependencies: + '@vue/compiler-ssr': 3.4.15 + '@vue/shared': 3.4.15 + vue: 3.4.15(typescript@5.3.3) + + /@vue/shared@3.4.15: + resolution: {integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==} + + /@vue/tsconfig@0.5.1: + resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==} + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.5 + is-array-buffer: 3.0.2 + dev: true + + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + dependencies: + is-windows: 1.0.2 + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /breakword@1.0.6: + resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + dependencies: + wcwidth: 1.0.1 + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.4 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.2.0 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /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 + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + 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 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: true + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + requiresBuild: true + dev: true + optional: true + + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + dev: true + + /computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: true + + /css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.0.2 + dev: true + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + css-tree: 2.2.1 + dev: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /csv-generate@3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + dev: true + + /csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + dev: true + + /csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + dev: true + + /csv@5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + dependencies: + csv-generate: 3.4.3 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + stream-transform: 2.1.3 + dev: true + + /dataloader@1.4.0: + resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + dev: true + + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /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 + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + dev: true + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.7 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + dev: true + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dotenv@8.6.0: + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} + engines: {node: '>=10'} + dev: true + + /emitten@0.6.3: + resolution: {integrity: sha512-BTTfom/QsGUETYGHmkb+sREmFV8AQ6OJUM2wDASngfABSiSZvHU0ZJ1ISxozuG1zlGCFZ4iOE/ittW9+Y5wBMA==} + engines: {node: '>=20.10.0', npm: '>=10.2.0'} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + dev: true + + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 + 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.12 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.2 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.13 + dev: true + + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + has-tostringtag: 1.0.0 + hasown: 2.0.0 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.0 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-compat-utils@0.1.2(eslint@8.56.0): + resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-config-prettier@9.1.0(eslint@8.56.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-config-standard-with-typescript@43.0.1(@typescript-eslint/eslint-plugin@6.19.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.4.0 + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: '^15.0.0 || ^16.0.0 ' + eslint-plugin-promise: ^6.0.0 + typescript: '*' + dependencies: + '@typescript-eslint/eslint-plugin': 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + eslint: 8.56.0 + eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.19.0)(eslint@8.56.0) + eslint-plugin-n: 16.6.2(eslint@8.56.0) + eslint-plugin-promise: 6.1.1(eslint@8.56.0) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0): + resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: '^15.0.0 || ^16.0.0 ' + eslint-plugin-promise: ^6.0.0 + dependencies: + eslint: 8.56.0 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.19.0)(eslint@8.56.0) + eslint-plugin-n: 16.6.2(eslint@8.56.0) + eslint-plugin-promise: 6.1.1(eslint@8.56.0) + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + debug: 3.2.7 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-es-x@7.5.0(eslint@8.56.0): + resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + eslint: 8.56.0 + eslint-compat-utils: 0.1.2(eslint@8.56.0) + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.0)(eslint@8.56.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + hasown: 2.0.0 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-n@16.6.2(eslint@8.56.0): + resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + builtins: 5.0.1 + eslint: 8.56.0 + eslint-plugin-es-x: 7.5.0(eslint@8.56.0) + get-tsconfig: 4.7.2 + globals: 13.24.0 + ignore: 5.3.0 + is-builtin-module: 3.2.1 + is-core-module: 2.13.1 + minimatch: 3.1.2 + resolve: 1.22.8 + semver: 7.5.4 + dev: true + + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.4): + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.56.0 + eslint-config-prettier: 9.1.0(eslint@8.56.0) + prettier: 3.2.4 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + dev: true + + /eslint-plugin-promise@6.1.1(eslint@8.56.0): + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-plugin-vue@9.20.1(eslint@8.56.0): + resolution: {integrity: sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + eslint: 8.56.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.0.15 + semver: 7.5.4 + vue-eslint-parser: 9.4.0(eslint@8.56.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.2.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + dev: true + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + dev: true + + /fflate@0.8.1: + resolution: {integrity: sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==} + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /happy-dom@13.2.0: + resolution: {integrity: sha512-aeFD9M5d1sN618nOpWy/76IiU5/UJxdYydPdzpXxEn4r7MQByrmtoH1iU9v8v9bJJ0fMte6OAMy6rDD/mGawfg==} + engines: {node: '>=16.0.0'} + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + hasown: 2.0.0 + side-channel: 1.0.4 + dev: true + + /is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + dependencies: + hasown: 2.0.0 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + + /is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.0 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + dependencies: + better-path-resolve: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.13 + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + + /js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lightningcss-darwin-arm64@1.23.0: + resolution: {integrity: sha512-kl4Pk3Q2lnE6AJ7Qaij47KNEfY2/UXRZBT/zqGA24B8qwkgllr/j7rclKOf1axcslNXvvUdztjo4Xqh39Yq1aA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-darwin-x64@1.23.0: + resolution: {integrity: sha512-KeRFCNoYfDdcolcFXvokVw+PXCapd2yHS1Diko1z1BhRz/nQuD5XyZmxjWdhmhN/zj5sH8YvWsp0/lPLVzqKpg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-freebsd-x64@1.23.0: + resolution: {integrity: sha512-xhnhf0bWPuZxcqknvMDRFFo2TInrmQRWZGB0f6YoAsZX8Y+epfjHeeOIGCfAmgF0DgZxHwYc8mIR5tQU9/+ROA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm-gnueabihf@1.23.0: + resolution: {integrity: sha512-fBamf/bULvmWft9uuX+bZske236pUZEoUlaHNBjnueaCTJ/xd8eXgb0cEc7S5o0Nn6kxlauMBnqJpF70Bgq3zg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-gnu@1.23.0: + resolution: {integrity: sha512-RS7sY77yVLOmZD6xW2uEHByYHhQi5JYWmgVumYY85BfNoVI3DupXSlzbw+b45A9NnVKq45+oXkiN6ouMMtTwfg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-musl@1.23.0: + resolution: {integrity: sha512-cU00LGb6GUXCwof6ACgSMKo3q7XYbsyTj0WsKHLi1nw7pV0NCq8nFTn6ZRBYLoKiV8t+jWl0Hv8KkgymmK5L5g==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-gnu@1.23.0: + resolution: {integrity: sha512-q4jdx5+5NfB0/qMbXbOmuC6oo7caPnFghJbIAV90cXZqgV8Am3miZhC4p+sQVdacqxfd+3nrle4C8icR3p1AYw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-musl@1.23.0: + resolution: {integrity: sha512-G9Ri3qpmF4qef2CV/80dADHKXRAQeQXpQTLx7AiQrBYQHqBjB75oxqj06FCIe5g4hNCqLPnM9fsO4CyiT1sFSQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-win32-x64-msvc@1.23.0: + resolution: {integrity: sha512-1rcBDJLU+obPPJM6qR5fgBUiCdZwZLafZM5f9kwjFLkb/UBNIzmae39uCSmh71nzPCTXZqHbvwu23OWnWEz+eg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /lightningcss@1.23.0: + resolution: {integrity: sha512-SEArWKMHhqn/0QzOtclIwH5pXIYQOUEkF8DgICd/105O+GCgd7jxjNod/QPnBCSWvpRHQBGVz5fQ9uScby03zA==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.23.0 + lightningcss-darwin-x64: 1.23.0 + lightningcss-freebsd-x64: 1.23.0 + lightningcss-linux-arm-gnueabihf: 1.23.0 + lightningcss-linux-arm64-gnu: 1.23.0 + lightningcss-linux-arm64-musl: 1.23.0 + lightningcss-linux-x64-gnu: 1.23.0 + lightningcss-linux-x64-musl: 1.23.0 + lightningcss-win32-x64-msvc: 1.23.0 + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + dev: true + + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.5.0 + pkg-types: 1.0.3 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + /magicast@0.3.3: + resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + source-map-js: 1.0.2 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + dev: true + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + + /meow@6.1.1: + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + engines: {node: '>=8'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 2.5.0 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.13.1 + yargs-parser: 18.1.3 + dev: true + + /merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mixme@0.5.10: + resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} + engines: {node: '>= 8.0.0'} + dev: true + + /mlly@1.5.0: + resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.3.2 + dev: true + + /mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + dev: true + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + dev: true + + /p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + dependencies: + p-map: 2.1.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.5.0 + pathe: 1.1.2 + dev: true + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /postcss-prefix-selector@1.16.0(postcss@5.2.18): + resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==} + peerDependencies: + postcss: '>4 <9' + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + dev: true + + /postcss@8.4.33: + resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + dev: true + + /posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + dev: true + + /posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /preferred-pm@3.1.2: + resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /prettier@3.2.4: + resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: true + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@4.9.5: + resolution: {integrity: sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.9.5 + '@rollup/rollup-android-arm64': 4.9.5 + '@rollup/rollup-darwin-arm64': 4.9.5 + '@rollup/rollup-darwin-x64': 4.9.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.5 + '@rollup/rollup-linux-arm64-gnu': 4.9.5 + '@rollup/rollup-linux-arm64-musl': 4.9.5 + '@rollup/rollup-linux-riscv64-gnu': 4.9.5 + '@rollup/rollup-linux-x64-gnu': 4.9.5 + '@rollup/rollup-linux-x64-musl': 4.9.5 + '@rollup/rollup-win32-arm64-msvc': 4.9.5 + '@rollup/rollup-win32-ia32-msvc': 4.9.5 + '@rollup/rollup-win32-x64-msvc': 4.9.5 + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-array-concat@1.1.0: + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test@1.0.2: + resolution: {integrity: sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-regex: 1.1.4 + dev: true + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-function-length@1.2.0: + resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 + dev: true + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.24 + mrmime: 2.0.0 + totalist: 3.0.1 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /smartwrap@2.0.2: + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + array.prototype.flat: 1.3.2 + breakword: 1.0.6 + grapheme-splitter: 1.0.4 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 15.4.1 + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + dependencies: + cross-spawn: 5.1.0 + signal-exit: 3.0.7 + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + + /stream-transform@2.1.3: + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + dependencies: + mixme: 0.5.10 + dev: true + + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.11.3 + dev: true + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.0(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.8 + transitivePeerDependencies: + - supports-color + dev: true + + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: true + + /svgo@3.2.0: + resolution: {integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.0.0 + dev: true + + /synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + dev: true + + /term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + dev: true + + /tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + engines: {node: '>=14.0.0'} + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /ts-api-utils@1.0.3(typescript@5.3.3): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /tty-table@4.2.3: + resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + csv: 5.5.3 + kleur: 4.1.5 + smartwrap: 2.0.2 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 17.7.2 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + /ufo@1.3.2: + resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + dev: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.5 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.22 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + dev: true + + /vite-node@1.2.1(@types/node@20.11.5): + resolution: {integrity: sha512-fNzHmQUSOY+y30naohBvSW7pPn/xn3Ib/uqm+5wAJQJiqQsU0NBR78XdRJb04l4bOFKjpTWld0XAfkKlrDbySg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.0.12(@types/node@20.11.5)(lightningcss@1.23.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-plugin-dts@3.7.1(@types/node@20.11.5)(typescript@5.3.3)(vite@5.0.12): + resolution: {integrity: sha512-VZJckNFpVfRAkmOxhGT5OgTUVWVXxkNQqLpBUuiNGAr9HbtvmvsPLo2JB3Xhn+o/Z9+CT6YZfYa4bX9SGR5hNw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@microsoft/api-extractor': 7.39.0(@types/node@20.11.5) + '@rollup/pluginutils': 5.1.0 + '@vue/language-core': 1.8.27(typescript@5.3.3) + debug: 4.3.4 + kolorist: 1.8.0 + typescript: 5.3.3 + vite: 5.0.12(@types/node@20.11.5)(lightningcss@1.23.0) + vue-tsc: 1.8.27(typescript@5.3.3) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + dev: true + + /vite-plugin-svg-sprite@0.5.1(vite@5.0.12): + resolution: {integrity: sha512-ZetyR0tj9KWQmT+QzoCYXSfcwQyyCG67HpvcWqhQRsFAmIyqA8AzHrZJcivwtf+zw3dCgVoJtA1we5Bxq6KOkA==} + peerDependencies: + vite: ^2 || ^3 || ^4 || ^5 + dependencies: + micromatch: 4.0.5 + svg-baker: 1.7.0 + svg-parser: 2.0.4 + svgo: 3.2.0 + vite: 5.0.12(@types/node@20.11.5)(lightningcss@1.23.0) + transitivePeerDependencies: + - supports-color + dev: true + + /vite@5.0.12(@types/node@20.11.5)(lightningcss@1.23.0): + resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.11.5 + esbuild: 0.19.11 + lightningcss: 1.23.0 + postcss: 8.4.33 + rollup: 4.9.5 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@1.2.1(@types/node@20.11.5)(@vitest/ui@1.2.1)(happy-dom@13.2.0): + resolution: {integrity: sha512-TRph8N8rnSDa5M2wKWJCMnztCZS9cDcgVTQ6tsTFTG/odHJ4l5yNVqvbeDJYJRZ6is3uxaEpFs8LL6QM+YFSdA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': ^1.0.0 + '@vitest/ui': ^1.0.0 + 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 + dependencies: + '@types/node': 20.11.5 + '@vitest/expect': 1.2.1 + '@vitest/runner': 1.2.1 + '@vitest/snapshot': 1.2.1 + '@vitest/spy': 1.2.1 + '@vitest/ui': 1.2.1(vitest@1.2.1) + '@vitest/utils': 1.2.1 + acorn-walk: 8.3.2 + cac: 6.7.14 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + happy-dom: 13.2.0 + local-pkg: 0.5.0 + magic-string: 0.30.5 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 1.3.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.0.12(@types/node@20.11.5)(lightningcss@1.23.0) + vite-node: 1.2.1(@types/node@20.11.5) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vue-eslint-parser@9.4.0(eslint@8.56.0): + resolution: {integrity: sha512-7KsNBb6gHFA75BtneJsoK/dbZ281whUIwFYdQxA68QrCrGMXYzUMbPDHGcOQ0OocIVKrWSKWXZ4mL7tonCXoUw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.56.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /vue-tsc@1.8.27(typescript@5.3.3): + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/typescript': 1.11.1 + '@vue/language-core': 1.8.27(typescript@5.3.3) + semver: 7.5.4 + typescript: 5.3.3 + dev: true + + /vue@3.4.15(typescript@5.3.3): + resolution: {integrity: sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.4.15 + '@vue/compiler-sfc': 3.4.15 + '@vue/runtime-dom': 3.4.15 + '@vue/server-renderer': 3.4.15(vue@3.4.15) + '@vue/shared': 3.4.15 + typescript: 5.3.3 + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: true + + /whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: true + + /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: true + + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /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 + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + 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: 21.1.1 + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /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.11.0 + optionalDependencies: + commander: 9.5.0 + dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..a184673 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - 'app/*' + - 'pkg/*' diff --git a/scripts/nuke.sh b/scripts/nuke.sh new file mode 100755 index 0000000..f5c5c76 --- /dev/null +++ b/scripts/nuke.sh @@ -0,0 +1,9 @@ +function pnpmNuke() { + rm -rf node_modules && + rm -rf pnpm-lock.yaml && + find ./app -name "node_modules" -type d -maxdepth 2 -exec rm -rf {} + && + find ./pkg -name "node_modules" -type d -maxdepth 2 -exec rm -rf {} + && + pnpm store prune +} + +pnpmNuke diff --git a/src/tests/helpers.test.ts b/src/tests/helpers.test.ts deleted file mode 100644 index ac3e821..0000000 --- a/src/tests/helpers.test.ts +++ /dev/null @@ -1,174 +0,0 @@ -import {afterEach, describe, it, expect, vi} from 'vitest'; - -import { - getErrorMessage, - fetchAudioBuffer, - linearRamp, - scratchBuffer, - unlockAudioContext, -} from '../helpers'; -import {mockData, audioBufferSourceNodeEndedEvent} from './mock'; - -describe('Helpers', () => { - const mockContext = new AudioContext(); - - describe('getErrorMessage()', () => { - it('returns message from basic object', async () => { - const mockError = { - message: 'foo', - }; - - const result = getErrorMessage(mockError); - - expect(result).toBe(mockError.message); - }); - - it('returns message from Error', async () => { - const mockMessage = 'Foo'; - const mockError = new Error(mockMessage, { - cause: 'bar', - }); - - const result = getErrorMessage(mockError); - - expect(result).toBe(mockMessage); - }); - - it('returns stringified result when unknown', async () => { - const mockError = ['foo', true, {bar: false}, null]; - const result = getErrorMessage(mockError); - - expect(result).toBe(JSON.stringify(mockError)); - }); - }); - - describe('fetchAudioBuffer()', () => { - it('throws parse Error on bogus path', async () => { - const mockPath = './path/nowhere.webm'; - - // This test used to check that the error was: - // `Failed to parse URL from ${mockPath}` - // However, we now get back a `[object Request]`, - await expect( - async () => await fetchAudioBuffer(mockPath, mockContext), - ).rejects.toThrowError(); - }); - - it.todo('throws network error on bad response'); - - // TODO: Cannot test against `fetch()` until we correctly mock it. - it.skip('returns AudioBuffer', async () => { - await expect( - fetchAudioBuffer(mockData.audio, mockContext).catch((_error) => {}), - ).resolves.toBeInstanceOf(AudioBuffer); - }); - - it.todo('passes custom options to fetch'); - }); - - describe('linearRamp()', () => { - it('transitions to the specified value', async () => { - const mockAudioParam = new AudioParam(); - - const spyCancel = vi.spyOn(mockAudioParam, 'cancelScheduledValues'); - const spySet = vi.spyOn(mockAudioParam, 'setValueAtTime'); - const spyRamp = vi.spyOn(mockAudioParam, 'linearRampToValueAtTime'); - - const fromValue = mockAudioParam.value; - const fromTime = mockContext.currentTime; - - const toValue = 2; - const toTime = fromTime + 2; - - expect(spyCancel).not.toBeCalled(); - expect(spySet).not.toBeCalled(); - expect(spyRamp).not.toBeCalled(); - - const result = linearRamp( - mockAudioParam, - {from: fromValue, to: toValue}, - {from: fromTime, to: toTime}, - ); - - expect(result).toBeInstanceOf(AudioParam); - - expect(spyCancel).toBeCalledTimes(1); - expect(spyCancel).toBeCalledWith(fromTime); - - expect(spySet).toBeCalledTimes(1); - expect(spySet).toBeCalledWith(fromValue, fromTime); - - expect(spyRamp).toBeCalledTimes(1); - expect(spyRamp).toBeCalledWith(toValue, toTime); - }); - }); - - describe('scratchBuffer()', () => { - it('creates a short silent AudioBuffer', async () => { - const result = scratchBuffer(mockContext); - - expect(result).toBeInstanceOf(AudioBuffer); - - expect(result).toHaveProperty('length', 1); - expect(result).toHaveProperty('numberOfChannels', 1); - expect(result).toHaveProperty('sampleRate', 22050); - }); - }); - - describe('unlockAudioContext()', () => { - afterEach(() => { - vi.advanceTimersToNextTimer(); - }); - - it('resumes AudioContext state', async () => { - const spyCreateBuffer = vi.spyOn(mockContext, 'createBuffer'); - const spyResume = vi.spyOn(mockContext, 'resume'); - - const spySourceConnect = vi.spyOn( - AudioBufferSourceNode.prototype, - 'connect', - ); - const spySourceStart = vi.spyOn(AudioBufferSourceNode.prototype, 'start'); - - unlockAudioContext(mockContext); - - expect(spyCreateBuffer).toBeCalledTimes(1); - expect(spyResume).not.toBeCalled(); - expect(spySourceConnect).not.toBeCalled(); - expect(spySourceStart).not.toBeCalled(); - - // Unlocks upon any of these events: - // `click`, `keydown`, `touchstart`, and `touchend`. - const clickEvent = new Event('click'); - document.dispatchEvent(clickEvent); - - expect(spyResume).toBeCalledTimes(2); - expect(spySourceConnect).toBeCalledWith(mockContext.destination); - expect(spySourceStart).toBeCalledTimes(1); - }); - - it('calls onEnded after interaction event', async () => { - vi.spyOn( - AudioBufferSourceNode.prototype, - 'addEventListener', - ).mockImplementation(audioBufferSourceNodeEndedEvent); - - const mockEnded = vi.fn(); - const spySourceDisconnect = vi.spyOn( - AudioBufferSourceNode.prototype, - 'disconnect', - ); - - unlockAudioContext(mockContext, mockEnded); - - expect(spySourceDisconnect).not.toBeCalled(); - expect(mockEnded).not.toBeCalled(); - - const keydownEvent = new Event('keydown'); - document.dispatchEvent(keydownEvent); - - expect(spySourceDisconnect).toBeCalledTimes(1); - expect(mockEnded).toBeCalledTimes(1); - }); - }); -}); diff --git a/src/tests/utilities.test.ts b/src/tests/utilities.test.ts deleted file mode 100644 index 074171e..0000000 --- a/src/tests/utilities.test.ts +++ /dev/null @@ -1,144 +0,0 @@ -import {describe, it, expect} from 'vitest'; -import { - arrayOfLength, - arrayShallowEquals, - assertNumber, - clamp, - progressPercentage, - msToSec, - secToMs, -} from '../utilities'; - -describe('Utilities', () => { - describe('Array', () => { - describe('arrayOfLength()', () => { - it('returns an empty array by default', async () => { - const result = arrayOfLength(); - expect(result).toStrictEqual([]); - }); - - it('returns an array of incremented index values', async () => { - const mockLength = 6; - const result = arrayOfLength(mockLength); - - expect(result).toStrictEqual([0, 1, 2, 3, 4, 5]); - expect(result).toHaveLength(mockLength); - }); - }); - - describe('arrayShallowEquals()', () => { - it('returns `true` when matching', async () => { - const result = arrayShallowEquals( - [true, false, null, undefined, 0, 1, 'end'], - [true, false, null, undefined, 0, 1, 'end'], - ); - expect(result).toBe(true); - }); - - it('returns `false` when at least one value is unmatched', async () => { - const result = arrayShallowEquals([true, false], [false, true]); - expect(result).toBe(false); - }); - }); - }); - - describe('Numbers', () => { - describe('assertNumber()', () => { - it('accepts an integer', async () => { - const result = assertNumber(123); - expect(result).toBe(true); - }); - - it('accepts a float', async () => { - const result = assertNumber(123.456); - expect(result).toBe(true); - }); - - it('does not allow a bigint', async () => { - const result = assertNumber(1000n); - expect(result).toBe(false); - }); - - it('does not allow NaN', async () => { - const result = assertNumber(NaN); - expect(result).toBe(false); - }); - - it('does not allow Infinity', async () => { - const result = assertNumber(Infinity); - expect(result).toBe(false); - }); - - it('does not allow other non-numnber types', async () => { - expect(assertNumber(true)).toBe(false); - expect(assertNumber(false)).toBe(false); - expect(assertNumber({one: 1})).toBe(false); - expect(assertNumber([1, 2, 3])).toBe(false); - expect(assertNumber('123')).toBe(false); - }); - }); - - describe('clamp()', () => { - it('returns preference', async () => { - const mockArgs: Parameters = [1, 10, 100]; - const result = clamp(...mockArgs); - - expect(result).toBe(10); - }); - - it('returns min', async () => { - const mockArgs: Parameters = [10, 1, 100]; - const result = clamp(...mockArgs); - - expect(result).toBe(10); - }); - - it('returns max', async () => { - const mockArgs: Parameters = [1, 100, 10]; - const result = clamp(...mockArgs); - - expect(result).toBe(10); - }); - }); - - describe('progressPercentage()', () => { - it('returns percentage integer', async () => { - const result = progressPercentage(6, 20); - expect(result).toBe(30); - }); - - it('round down floating-point result', async () => { - const result = progressPercentage(12, 345); - // Before Math.floor(), result should be: - // 3.4782608695652173 - expect(result).toBe(3); - }); - - it('protects against NaN', async () => { - const result = progressPercentage(0, 0); - expect(result).toBe(0); - }); - - it('protects against Infinity', async () => { - const result = progressPercentage(2, 0); - expect(result).toBe(0); - }); - }); - }); - - describe('Time', () => { - describe('msToSec()', () => { - it('converts to seconds', async () => { - const result = msToSec(1234); - expect(result).toBe(1.234); - }); - }); - - describe('secToMs()', () => { - it('converts to milliseconds', async () => { - const result = secToMs(5.678); - expect(result).toBe(5678); - }); - }); - }); -}); diff --git a/src/utilities/array.ts b/src/utilities/array.ts deleted file mode 100644 index da64bca..0000000 --- a/src/utilities/array.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type {PrimitiveType} from '../types'; - -export function arrayOfLength(length = 0): number[] { - return Array.from(Array(length)).map((_item, index) => index); -} - -export function arrayShallowEquals(one: PrimitiveType[], two: PrimitiveType[]) { - const equalLength = one.length === two.length; - return equalLength && one.every((value, index) => value === two[index]); -} diff --git a/src/utilities/index.ts b/src/utilities/index.ts deleted file mode 100644 index 9c91b30..0000000 --- a/src/utilities/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export {arrayOfLength, arrayShallowEquals} from './array'; -export {assertNumber, clamp, progressPercentage} from './numbers'; -export {msToSec, secToMs} from './time'; diff --git a/src/utilities/numbers.ts b/src/utilities/numbers.ts deleted file mode 100644 index 4c602b6..0000000 --- a/src/utilities/numbers.ts +++ /dev/null @@ -1,14 +0,0 @@ -export function assertNumber(value?: unknown): value is number { - // Both `NaN` and `Infinity` are of type `number`, - // but will not pass the `isFinite()` check. - return typeof value === 'number' && isFinite(value); -} - -export function clamp(min = 0, preference = 0.5, max = 1) { - return Math.min(Math.max(min, preference), max); -} - -export function progressPercentage(value = 0, max = 100) { - const progress = Math.floor((value / max) * 100); - return assertNumber(progress) ? progress : 0; -} diff --git a/src/utilities/time.ts b/src/utilities/time.ts deleted file mode 100644 index 4f44d00..0000000 --- a/src/utilities/time.ts +++ /dev/null @@ -1,9 +0,0 @@ -const MS_PER_SEC = 1000; - -export function msToSec(milliseconds: number) { - return milliseconds / MS_PER_SEC; -} - -export function secToMs(seconds: number) { - return seconds * MS_PER_SEC; -} diff --git a/tsconfig.json b/tsconfig.json index ec0bc13..57bfd89 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,10 @@ { - "compileOnSave": false, "compilerOptions": { "target": "esnext", "module": "esnext", "lib": ["esnext", "dom"], "moduleResolution": "bundler", "strict": true, - "allowJs": false, - "allowSyntheticDefaultImports": true, - "esModuleInterop": false, "isolatedModules": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, @@ -18,6 +14,5 @@ "noImplicitReturns": true, "skipLibCheck": true }, - "include": ["./vite.config.ts", "./src/**/*", "./config/**/*"], - "exclude": ["./node_modules/**/*"] + "include": ["vite.config.ts", "config/**/*", "pkg/**/*"] } diff --git a/vite.config.ts b/vite.config.ts index 5a3f9b1..ad814b6 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,33 +1,14 @@ import {defineConfig} from 'vite'; -import dts from 'vite-plugin-dts'; - -import pkg from './package.json'; +// import {configDefaults} from 'vitest/config'; +// Root-level config export default defineConfig({ - build: { - lib: { - entry: 'src/index.ts', - name: 'earwurm', - fileName: (format) => `earwurm.${format}.js`, - }, - rollupOptions: { - // We might need to define global variables - // to use in the UMD build. - external: Object.keys(pkg.peerDependencies || {}), - }, - minify: false, - }, - plugins: [ - dts({ - // Will capture only the types that are exposed to consumers - // and condense them all into a single file. If we also want - // unexported types, as well as their folder structure, then - // replace `rollupTypes` with `insertTypesEntry`. - rollupTypes: true, - }), - ], test: { environment: 'happy-dom', setupFiles: 'config/tests-setup', + // exclude: [...configDefaults.exclude, './app/**/*'], + coverage: { + exclude: ['app/**', 'config/**', 'scrap/**'], + }, }, });