diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..f4f1972
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,6 @@
+node_modules
+dist
+
+docs/.vitepress/.temp/
+docs/.vitepress/.cache/
+docs/.vitepress/dist/
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..6d1153c
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,80 @@
+module.exports = {
+ root: true,
+ parserOptions: {
+ parser: '@typescript-eslint/parser',
+ ecmaVersion: 2020,
+ },
+ env: {
+ node: true,
+ },
+ plugins: ['vue', 'import', '@typescript-eslint'],
+ extends: [
+ 'eslint:recommended',
+ 'plugin:vue/vue3-recommended',
+ 'standard',
+ ],
+ rules: {
+ quotes: ['error', 'single', {
+ avoidEscape: true,
+ }],
+ 'no-multi-spaces': 'error',
+ 'no-trailing-spaces': 'error',
+ 'no-empty': 'off',
+ 'padded-blocks': 'off',
+ 'comma-dangle': ['error', 'always-multiline'],
+ 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+ 'max-len': [process.env.NODE_ENV === 'production' ? 'warn' : 'off', {
+ code: 120,
+ ignoreTrailingComments: true,
+ ignoreUrls: true,
+ ignoreStrings: true,
+ ignoreTemplateLiterals: true,
+ ignoreRegExpLiterals: true,
+ }],
+ 'space-before-function-paren': 'off',
+ 'vue/attributes-order': ['error', {
+ alphabetical: true,
+ }],
+ '@typescript-eslint/no-explicit-any': 'off',
+ // Avoids false errors like “'NodeListOf' is not defined”.
+ 'no-undef': 'off',
+ // Turns off some non-TypeScript rules in favor of their specific TypeScript rules to avoid false negatives:
+ indent: 'off',
+ '@typescript-eslint/indent': ['error', 2],
+ 'no-unused-vars': 'off',
+ '@typescript-eslint/no-unused-vars': 'error',
+ '@typescript-eslint/space-before-function-paren': ['error', {
+ anonymous: 'never',
+ named: 'never',
+ asyncArrow: 'always',
+ }],
+ // Ensures ESLint understands that `defineEmits<{ ... }>()` does _not_ fail this rule.
+ 'func-call-spacing': 'off',
+ '@typescript-eslint/func-call-spacing': 'error',
+ '@typescript-eslint/consistent-type-imports': ['error', {
+ prefer: 'type-imports',
+ fixStyle: 'separate-type-imports',
+ }],
+ 'vue/no-restricted-static-attribute': ['error',
+ {
+ key: 'data-test-id',
+ message: 'Using "data-test-id" is not allowed. Use "data-testid" instead.',
+ },
+ {
+ key: 'data-tracking-id',
+ message: 'Using "data-tracking-id" is not allowed. Use "data-testid" instead.',
+ },
+ ],
+ 'vue/no-restricted-v-bind': ['error',
+ {
+ argument: 'data-test-id',
+ message: 'Using "data-test-id" is not allowed. Use "data-testid" instead.',
+ },
+ {
+ argument: 'data-tracking-id',
+ message: 'Using "data-tracking-id" is not allowed. Use "data-testid" instead.',
+ },
+ ],
+ },
+}
diff --git a/.github/workflows/commitlint.yaml b/.github/workflows/commitlint.yaml
index 8754169..53b4d1d 100644
--- a/.github/workflows/commitlint.yaml
+++ b/.github/workflows/commitlint.yaml
@@ -16,6 +16,6 @@ jobs:
- name: Remove tsconfig
run: rm tsconfig.json
- - uses: wagoid/commitlint-github-action@v5.4.4
+ - uses: wagoid/commitlint-github-action@v5.4.5
with:
configFile: commitlint.config.cjs
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
index 1b11bae..5f40f7a 100644
--- a/.github/workflows/publish.yaml
+++ b/.github/workflows/publish.yaml
@@ -4,8 +4,6 @@ on:
push:
branches:
- main
- - alpha
- - beta
jobs:
run-tests:
@@ -14,8 +12,7 @@ jobs:
publish:
name: Build and Publish
- needs:
- - run-tests
+ needs: [run-tests]
runs-on: ubuntu-latest
steps:
- name: Checkout
@@ -49,3 +46,49 @@ jobs:
GITHUB_TOKEN: ${{ secrets.KONGPONENTS_BOT_PAT }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN_PUBLIC_PUBLISH }}
+ deploy-github-pages:
+ name: Deploy GitHub Pages
+ if: ${{ github.ref == 'refs/heads/main' }}
+ needs: [publish]
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+ permissions:
+ contents: read
+ pages: write
+ id-token: write
+ # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
+ # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+ concurrency:
+ group: 'pages'
+ cancel-in-progress: false
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup PNPM with Dependencies
+ uses: ./.github/actions/setup-pnpm-with-dependencies/
+ with:
+ force-install: true
+
+ - name: Build Sandbox
+ env:
+ # Tell the script to use the sandbox directory
+ USE_SANDBOX: true
+ run: pnpm run build:sandbox
+
+ - name: Setup Pages
+ uses: actions/configure-pages@v4
+
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ # Upload sandbox/dist directory
+ path: './sandbox/dist'
+
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index 7cb7824..29a158a 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -9,8 +9,6 @@ on:
- labeled
branches:
- main
- - alpha
- - beta
# Allow calling manually from GitHub
workflow_dispatch:
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1cdb631
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,18 @@
+node_modules
+.DS_Store
+dist
+bin
+*.local
+bundle-analyzer
+
+# Temp files
+
+.temp
+.cache
+.idea
+.husky
+
+docs/.vitepress/.temp
+docs/.vitepress/.cache
+docs/.vitepress/cache
+docs/.vitepress/dist
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000..8b0beab
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+20.11.0
diff --git a/.stylelintrc.cjs b/.stylelintrc.cjs
new file mode 100644
index 0000000..a7473bd
--- /dev/null
+++ b/.stylelintrc.cjs
@@ -0,0 +1,28 @@
+module.exports = {
+ extends: [
+ 'stylelint-config-html',
+ 'stylelint-config-recommended-scss',
+ 'stylelint-config-recommended-vue/scss'
+ ],
+ plugins: [
+ 'stylelint-order',
+ '@kong/design-tokens/stylelint-plugin',
+ ],
+ rules: {
+ 'order/properties-alphabetical-order': true,
+ 'unit-disallowed-list': [
+ ['rem', 'em'],
+ ],
+ // Only allow @kong/design-tokens or `--kong-ui-*` CSS custom properties
+ 'custom-property-pattern': [
+ "^(kui-).+$",
+ {
+ message: "Expected custom property \"%s\" to be sourced from @kong/design-tokens with prefix '--kui-'",
+ }
+ ],
+ '@kong/design-tokens/use-proper-token': true,
+ // Disable the following rules
+ 'custom-property-no-missing-var-function': null,
+ 'no-descending-specificity': null,
+ }
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..79f4194
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,10 @@
+{
+ "recommendations": [
+ "Vue.volar",
+ "Vue.vscode-typescript-vue-plugin",
+ "dbaeumer.vscode-eslint",
+ "stylelint.vscode-stylelint",
+ "yzhang.markdown-all-in-one",
+ "mrmlnc.vscode-scss"
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..d19258c
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,23 @@
+{
+ "markdown.extension.toc.levels": "2..3",
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": "explicit",
+ "source.fixAll.stylelint": "explicit"
+ },
+ "editor.formatOnPaste": true,
+ "editor.trimAutoWhitespace": true,
+ "editor.tabSize": 2,
+ "editor.insertSpaces": true,
+ "editor.detectIndentation": false,
+ "eslint.format.enable": true,
+ "eslint.validate": [
+ "typescript",
+ "javascript",
+ "javascriptreact",
+ "vue"
+ ],
+ "scss.scannerExclude": [
+ "**/.git",
+ "**/bower_components",
+ ]
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..6495b1d
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,338 @@
+# [1.0.0-alpha.39](https://github.com/Kong/markdown/compare/v1.0.0-alpha.38...v1.0.0-alpha.39) (2024-01-23)
+
+
+### Bug Fixes
+
+* **deps:** update dependency @kong/icons to ^1.8.13 ([#30](https://github.com/Kong/markdown/issues/30)) ([78ea236](https://github.com/Kong/markdown/commit/78ea2369d8e297cb6f9902950ae31ba932eaacdf))
+
+# [1.0.0-alpha.38](https://github.com/Kong/markdown/compare/v1.0.0-alpha.37...v1.0.0-alpha.38) (2024-01-16)
+
+
+### Bug Fixes
+
+* remove border color ([44e2605](https://github.com/Kong/markdown/commit/44e26054d3ead1c46020474b7f6996aad0bcf2bb))
+
+# [1.0.0-alpha.37](https://github.com/Kong/markdown/compare/v1.0.0-alpha.36...v1.0.0-alpha.37) (2024-01-16)
+
+
+### Bug Fixes
+
+* **deps:** update dependency @kong/icons to ^1.8.12 ([#23](https://github.com/Kong/markdown/issues/23)) ([8bb60d4](https://github.com/Kong/markdown/commit/8bb60d49181eed2a492b2d73928f312f61c068fa))
+* **deps:** update dependency markdown-it-textual-uml to ^0.17.1 ([#26](https://github.com/Kong/markdown/issues/26)) ([38c4b22](https://github.com/Kong/markdown/commit/38c4b22e25576377a864deee17f27db29339d48b))
+
+# [1.0.0-alpha.36](https://github.com/Kong/markdown/compare/v1.0.0-alpha.35...v1.0.0-alpha.36) (2024-01-12)
+
+
+### Bug Fixes
+
+* **deps:** udpate shikiji ([493ef6f](https://github.com/Kong/markdown/commit/493ef6ffdbbf2b0ab8a891e64330005ab3d7cc91))
+* renovate config ([0d42bbb](https://github.com/Kong/markdown/commit/0d42bbb1db59f98cc0efce64784458714c75a220))
+
+# [1.0.0-alpha.35](https://github.com/Kong/markdown/compare/v1.0.0-alpha.34...v1.0.0-alpha.35) (2024-01-12)
+
+
+### Bug Fixes
+
+* **deps:** update dependency @kong/icons to ^1.8.11 ([#22](https://github.com/Kong/markdown/issues/22)) ([9be9db0](https://github.com/Kong/markdown/commit/9be9db009b7787e248e94acfa406d1b2452ed75c))
+
+# [1.0.0-alpha.34](https://github.com/Kong/markdown/compare/v1.0.0-alpha.33...v1.0.0-alpha.34) (2024-01-10)
+
+
+### Bug Fixes
+
+* color theme ([fbad8e8](https://github.com/Kong/markdown/commit/fbad8e89d49992f0faf1c9bf98e8b5f3a31b5a22))
+
+
+### Features
+
+* dark mode ([915ea98](https://github.com/Kong/markdown/commit/915ea98d2d22fdb5d5c8cc9a123859319ea72493))
+* dark mode ([32f6222](https://github.com/Kong/markdown/commit/32f62222327b0c9af83188aae26d695ab6172419))
+* dark mode ([175a9b3](https://github.com/Kong/markdown/commit/175a9b3b7b5fdfd7e2cd58e44b04031e7db93aa0))
+
+# [1.0.0-alpha.33](https://github.com/Kong/markdown/compare/v1.0.0-alpha.32...v1.0.0-alpha.33) (2024-01-09)
+
+
+### Features
+
+* links ([e3a9db5](https://github.com/Kong/markdown/commit/e3a9db51a84a605202da3c168c4fc25b82bede2e))
+
+# [1.0.0-alpha.32](https://github.com/Kong/markdown/compare/v1.0.0-alpha.31...v1.0.0-alpha.32) (2024-01-09)
+
+
+### Bug Fixes
+
+* completed tasks ([09d7b46](https://github.com/Kong/markdown/commit/09d7b468de271646df4a2fe899ebaf1753d1e751))
+
+# [1.0.0-alpha.31](https://github.com/Kong/markdown/compare/v1.0.0-alpha.30...v1.0.0-alpha.31) (2024-01-09)
+
+
+### Bug Fixes
+
+* list display ([cbf75e5](https://github.com/Kong/markdown/commit/cbf75e585ac1ec623360f6eceed79cabc992bb70))
+
+# [1.0.0-alpha.30](https://github.com/Kong/markdown/compare/v1.0.0-alpha.29...v1.0.0-alpha.30) (2024-01-09)
+
+
+### Bug Fixes
+
+* mobile button layout ([c878507](https://github.com/Kong/markdown/commit/c87850768dc0db3df98b97bda28af2467f09b340))
+
+# [1.0.0-alpha.29](https://github.com/Kong/markdown/compare/v1.0.0-alpha.28...v1.0.0-alpha.29) (2024-01-08)
+
+
+### Bug Fixes
+
+* switch mermaid theme ([ab48adc](https://github.com/Kong/markdown/commit/ab48adc5c6733c2858972b367daef6f2483e08f6))
+
+
+### Reverts
+
+* remove mermaid prop ([e8297b2](https://github.com/Kong/markdown/commit/e8297b2fa71537eadb6fd81ca94779c4499d0348))
+
+# [1.0.0-alpha.28](https://github.com/Kong/markdown/compare/v1.0.0-alpha.27...v1.0.0-alpha.28) (2024-01-08)
+
+
+### Features
+
+* publish sandbox to github pages ([687f91f](https://github.com/Kong/markdown/commit/687f91f3b579b4307fe02c1daba7480acde46981))
+
+# [1.0.0-alpha.27](https://github.com/Kong/markdown/compare/v1.0.0-alpha.26...v1.0.0-alpha.27) (2024-01-07)
+
+
+### Bug Fixes
+
+* min height ([3d32693](https://github.com/Kong/markdown/commit/3d32693b10898fe887dd89a637681649e3959392))
+
+# [1.0.0-alpha.26](https://github.com/Kong/markdown/compare/v1.0.0-alpha.25...v1.0.0-alpha.26) (2024-01-07)
+
+
+### Features
+
+* download document ([934651e](https://github.com/Kong/markdown/commit/934651ee8acdcb9b97618314618ccaa0a86ca52e))
+
+# [1.0.0-alpha.25](https://github.com/Kong/markdown/compare/v1.0.0-alpha.24...v1.0.0-alpha.25) (2024-01-04)
+
+
+### Bug Fixes
+
+* remove comments ([6803204](https://github.com/Kong/markdown/commit/680320498a63c5b20a35a00380f95b12cba7c51f))
+
+# 1.0.0-alpha.1 (2024-01-04)
+
+
+### Bug Fixes
+
+* update package version ([8384d6b](https://github.com/Kong/markdown/commit/8384d6bea0dc20ad9f4cc0bc80d91a2b7f0f8acb))
+
+
+### Features
+
+* alpha branch ([8860869](https://github.com/Kong/markdown/commit/8860869a93e367adfe03e63862c506980a2dd59c))
+* initial commit :rocket: ([8fe75b2](https://github.com/Kong/markdown/commit/8fe75b2d974aba055c7bdc726292616924a663b0))
+
+# 1.0.0-alpha.1 (2024-01-04)
+
+
+### Bug Fixes
+
+* update package version ([8384d6b](https://github.com/Kong/markdown/commit/8384d6bea0dc20ad9f4cc0bc80d91a2b7f0f8acb))
+
+
+### Features
+
+* alpha branch ([8860869](https://github.com/Kong/markdown/commit/8860869a93e367adfe03e63862c506980a2dd59c))
+* initial commit :rocket: ([8fe75b2](https://github.com/Kong/markdown/commit/8fe75b2d974aba055c7bdc726292616924a663b0))
+
+# 1.0.0-alpha.1 (2024-01-04)
+
+
+### Features
+
+* alpha branch ([8860869](https://github.com/Kong/markdown/commit/8860869a93e367adfe03e63862c506980a2dd59c))
+* initial commit :rocket: ([8fe75b2](https://github.com/Kong/markdown/commit/8fe75b2d974aba055c7bdc726292616924a663b0))
+
+# 1.0.0-alpha.1 (2024-01-04)
+
+
+### Features
+
+* alpha branch ([8860869](https://github.com/Kong/markdown/commit/8860869a93e367adfe03e63862c506980a2dd59c))
+* initial commit :rocket: ([8fe75b2](https://github.com/Kong/markdown/commit/8fe75b2d974aba055c7bdc726292616924a663b0))
+
+# [1.0.0-alpha.24](https://github.com/Kong/markdown/compare/v1.0.0-alpha.23...v1.0.0-alpha.24) (2024-01-04)
+
+
+### Bug Fixes
+
+* tsconfig exclude tests ([f4825fd](https://github.com/Kong/markdown/commit/f4825fdc615c2a6aea629e7cb4ed348d7b771d74))
+
+# [1.0.0-alpha.23](https://github.com/Kong/markdown/compare/v1.0.0-alpha.22...v1.0.0-alpha.23) (2024-01-03)
+
+
+### Bug Fixes
+
+* modelValue prop ([57c13fc](https://github.com/Kong/markdown/commit/57c13fc4f17e31fb27bd889c81b99c9a03e973a5))
+
+# [1.0.0-alpha.22](https://github.com/Kong/markdown/compare/v1.0.0-alpha.21...v1.0.0-alpha.22) (2024-01-03)
+
+
+### Bug Fixes
+
+* copy button dark ([679f1f4](https://github.com/Kong/markdown/commit/679f1f4c7d4cd976309095ff6445feb04c095a5e))
+
+# [1.0.0-alpha.21](https://github.com/Kong/markdown/compare/v1.0.0-alpha.20...v1.0.0-alpha.21) (2024-01-03)
+
+
+### Features
+
+* use preferred color scheme ([5fa230b](https://github.com/Kong/markdown/commit/5fa230b2086141a7c21cac2e24e8866f7f32e9ec))
+
+# [1.0.0-alpha.20](https://github.com/Kong/markdown/compare/v1.0.0-alpha.19...v1.0.0-alpha.20) (2024-01-03)
+
+
+### Bug Fixes
+
+* copy to clipboard ([6a33cd6](https://github.com/Kong/markdown/commit/6a33cd69a559c0a981f5db29e53610bb5eeed9ae))
+
+# [1.0.0-alpha.19](https://github.com/Kong/markdown/compare/v1.0.0-alpha.18...v1.0.0-alpha.19) (2024-01-02)
+
+
+### Bug Fixes
+
+* code blocks ([833431e](https://github.com/Kong/markdown/commit/833431eb01154fb467f08b02d5e30ce07eb83d67))
+
+# [1.0.0-alpha.18](https://github.com/Kong/markdown/compare/v1.0.0-alpha.17...v1.0.0-alpha.18) (2024-01-02)
+
+
+### Bug Fixes
+
+* list-style ([fd4eb69](https://github.com/Kong/markdown/commit/fd4eb69a9343ddf8e212c4f80525287200d73cfb))
+
+# [1.0.0-alpha.17](https://github.com/Kong/markdown/compare/v1.0.0-alpha.16...v1.0.0-alpha.17) (2024-01-02)
+
+
+### Features
+
+* toolbar enhancements ([c69e591](https://github.com/Kong/markdown/commit/c69e59117aa75b468e59b1720c0a1fba1ce03d45))
+
+# [1.0.0-alpha.16](https://github.com/Kong/markdown/compare/v1.0.0-alpha.15...v1.0.0-alpha.16) (2023-12-31)
+
+
+### Bug Fixes
+
+* enable token validation ([f1808ce](https://github.com/Kong/markdown/commit/f1808ce099ec8d31a2f3b93050016895d985a866))
+
+# [1.0.0-alpha.15](https://github.com/Kong/markdown/compare/v1.0.0-alpha.14...v1.0.0-alpha.15) (2023-12-30)
+
+
+### Features
+
+* typography ([d3e4dca](https://github.com/Kong/markdown/commit/d3e4dca202b14cf10b53b4a3b4f0f317100bfc4e))
+
+# [1.0.0-alpha.14](https://github.com/Kong/markdown/compare/v1.0.0-alpha.13...v1.0.0-alpha.14) (2023-12-30)
+
+
+### Features
+
+* edit button ([c58617a](https://github.com/Kong/markdown/commit/c58617a87f02fb08c9417814646a06c626250f38))
+
+# [1.0.0-alpha.13](https://github.com/Kong/markdown/compare/v1.0.0-alpha.12...v1.0.0-alpha.13) (2023-12-29)
+
+
+### Features
+
+* toolbar-right slot ([469390b](https://github.com/Kong/markdown/commit/469390b626dc2ee0e91e929df99ce707648df04f))
+
+# [1.0.0-alpha.12](https://github.com/Kong/markdown/compare/v1.0.0-alpha.11...v1.0.0-alpha.12) (2023-12-28)
+
+
+### Features
+
+* buttons ([7c8457c](https://github.com/Kong/markdown/commit/7c8457cf3ca882c7633bdc45906aa8cd14e0e406))
+
+# [1.0.0-alpha.11](https://github.com/Kong/markdown/compare/v1.0.0-alpha.10...v1.0.0-alpha.11) (2023-12-28)
+
+
+### Features
+
+* reactive theme ([cf87444](https://github.com/Kong/markdown/commit/cf87444caee07c25ac9247541e1aedfd1eb12abb))
+
+# [1.0.0-alpha.10](https://github.com/Kong/markdown/compare/v1.0.0-alpha.9...v1.0.0-alpha.10) (2023-12-28)
+
+
+### Bug Fixes
+
+* meta keys ([b774d20](https://github.com/Kong/markdown/commit/b774d20bfe3b57684fd2b011f76b88d12e64217e))
+
+# [1.0.0-alpha.9](https://github.com/Kong/markdown/compare/v1.0.0-alpha.8...v1.0.0-alpha.9) (2023-12-28)
+
+
+### Bug Fixes
+
+* toolbar overflow ([aa5fb40](https://github.com/Kong/markdown/commit/aa5fb40638989930f70a0941623a2fa6002396bd))
+
+# [1.0.0-alpha.8](https://github.com/Kong/markdown/compare/v1.0.0-alpha.7...v1.0.0-alpha.8) (2023-12-28)
+
+
+### Bug Fixes
+
+* fullscreen styles ([d27ff8a](https://github.com/Kong/markdown/commit/d27ff8aa648d7a17322459ecb89022fcb14e0033))
+
+# [1.0.0-alpha.7](https://github.com/Kong/markdown/compare/v1.0.0-alpha.6...v1.0.0-alpha.7) (2023-12-28)
+
+
+### Bug Fixes
+
+* styles ([670296f](https://github.com/Kong/markdown/commit/670296fdb0073fafda326e154b2490d1e7ca6e06))
+* toolbar height ([ca365c3](https://github.com/Kong/markdown/commit/ca365c376a56b9d54a5e873b814aa29d10bb0a2e))
+
+# [1.0.0-alpha.6](https://github.com/Kong/markdown/compare/v1.0.0-alpha.5...v1.0.0-alpha.6) (2023-12-28)
+
+
+### Bug Fixes
+
+* textarea border radius ([061500f](https://github.com/Kong/markdown/commit/061500f0d35373025fa3da6f22ab91ac4a1bd651))
+
+
+### Reverts
+
+* restore view switcher ([e357571](https://github.com/Kong/markdown/commit/e3575718e7981ffb042c8a8471fa6cdd6e6eaebe))
+
+# [1.0.0-alpha.5](https://github.com/Kong/markdown/compare/v1.0.0-alpha.4...v1.0.0-alpha.5) (2023-12-23)
+
+
+### Bug Fixes
+
+* mermaid ([c7ec43c](https://github.com/Kong/markdown/commit/c7ec43c03ba0a3cbb69901cd468ab3ac81939f91))
+
+# [1.0.0-alpha.4](https://github.com/Kong/markdown/compare/v1.0.0-alpha.3...v1.0.0-alpha.4) (2023-12-23)
+
+
+### Features
+
+* blockquote ([62409ac](https://github.com/Kong/markdown/commit/62409ac8c9f2ef631159ffab8d8ffa42fa7a068e))
+
+# [1.0.0-alpha.3](https://github.com/Kong/markdown/compare/v1.0.0-alpha.2...v1.0.0-alpha.3) (2023-12-23)
+
+
+### Bug Fixes
+
+* indent ordered list ([b76bd86](https://github.com/Kong/markdown/commit/b76bd8605ea46dcd1e2e69dce8e93fdaae5f6225))
+* remove tab ([3cf0d6b](https://github.com/Kong/markdown/commit/3cf0d6b66aebfd86cf72989be1800a79dcc24157))
+* split and preview modes ([d13b034](https://github.com/Kong/markdown/commit/d13b0349e23c6e8572ff710aa1a96cd430fcc930))
+* tabs if already indented ([1668a47](https://github.com/Kong/markdown/commit/1668a47d5759b2d714ef1a5e13d3b856f95f176a))
+
+# [1.0.0-alpha.2](https://github.com/Kong/markdown/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2023-12-22)
+
+
+### Features
+
+* toolbar updates ([#3](https://github.com/Kong/markdown/issues/3)) ([14a2976](https://github.com/Kong/markdown/commit/14a297600ee28d4eee23d64119f85ffc6a7cd414))
+
+# 1.0.0-alpha.1 (2023-12-22)
+
+
+### Features
+
+* create package ([#2](https://github.com/Kong/markdown/issues/2)) ([bb1bf35](https://github.com/Kong/markdown/commit/bb1bf357f1924413d92ca14f5e2f5c4bc15d43cb))
+* initial commit :rocket: ([8fe75b2](https://github.com/Kong/markdown/commit/8fe75b2d974aba055c7bdc726292616924a663b0))
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..47c8964
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2023 Kong, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
index e84eece..b2f55d8 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# Kong Markdown
> [!IMPORTANT]
-> This repository and the `@kong/markdown` package are currently in development on the `alpha` branch. Breaking changes should be expected.
+> This repository and the `@kong/markdown` package are currently in development on the `main` branch. Breaking changes should be expected.
Kong's open-source markdown renderer and live editor.
@@ -22,11 +22,7 @@ Kong's open-source markdown renderer and live editor.
## TODO
-- [X] Utilize design tokens
-- [X] Add new icons for toolbar
-- [X] Light / Dark mode
-- [X] Default styles for markdown HTML elements
-- [ ] Possibly export separate bundles for syntax highlighting options
+- [ ] Optimize exports via separate bundles for syntax highlighting options
## Usage
diff --git a/commitlint.config.cjs b/commitlint.config.cjs
new file mode 100644
index 0000000..de9e777
--- /dev/null
+++ b/commitlint.config.cjs
@@ -0,0 +1,8 @@
+module.exports = {
+ extends: ['@commitlint/config-conventional'],
+ rules: {
+ 'header-max-length': [2, 'always', 100],
+ 'body-max-line-length': [1, 'always', 150],
+ },
+ ignores: [(message) => /^chore\(release\): .+$/m.test(message)],
+}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..4eef4e7
--- /dev/null
+++ b/index.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+ Kong Markdown
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lefthook.yaml b/lefthook.yaml
new file mode 100644
index 0000000..e0fc762
--- /dev/null
+++ b/lefthook.yaml
@@ -0,0 +1,30 @@
+# Reference:
+# https://github.com/evilmartians/lefthook/blob/master/docs/full_guide.md
+
+pre-push:
+ parallel: true
+ commands:
+ stylelint:
+ skip:
+ - merge
+ - rebase
+ run: pnpm run stylelint
+ eslint:
+ skip:
+ - merge
+ - rebase
+ run: pnpm run lint
+ typecheck:
+ skip:
+ - merge
+ - rebase
+ run: pnpm run typecheck
+
+commit-msg:
+ parallel: true
+ commands:
+ commitlint:
+ skip:
+ - merge
+ - rebase
+ run: pnpm commitlint --edit "$1"
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..b544ef0
--- /dev/null
+++ b/package.json
@@ -0,0 +1,197 @@
+{
+ "name": "@kong/markdown",
+ "version": "1.0.0-alpha.39",
+ "description": "Kong's open-source markdown renderer and live editor",
+ "keywords": [
+ "markdown",
+ "markdown-it",
+ "vue",
+ "editor",
+ "markdown editor",
+ "markdown renderer"
+ ],
+ "license": "Apache-2.0",
+ "type": "module",
+ "main": "./dist/kong-markdown.umd.js",
+ "module": "./dist/kong-markdown.es.js",
+ "files": [
+ "dist"
+ ],
+ "types": "dist/types/index.d.ts",
+ "typings": "dist/types",
+ "exports": {
+ ".": {
+ "import": "./dist/kong-markdown.es.js",
+ "require": "./dist/kong-markdown.umd.js"
+ },
+ "./package.json": "./package.json",
+ "./dist/*": "./dist/*"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "scripts": {
+ "dev": "cross-env USE_SANDBOX=true vite",
+ "build": "pnpm run typecheck && pnpm run build:package && pnpm run build:types && pnpm run build:aliases",
+ "build:package": "vite build -m production",
+ "build:types": "vue-tsc -p './tsconfig.build.json' --emitDeclarationOnly",
+ "build:aliases": "tsc-alias -p './tsconfig.build.json'",
+ "build:analyzer": "BUILD_VISUALIZER='core/markdown-ui' vite build -m production",
+ "build:sandbox": "cross-env USE_SANDBOX=true vite build -m production",
+ "preview": "pnpm run build:sandbox && cross-env USE_SANDBOX=true vite preview",
+ "typecheck": "vue-tsc -p './tsconfig.build.json' --noEmit",
+ "stylelint": "stylelint --allow-empty-input './src/**/*.{css,scss,vue}'",
+ "stylelint:fix": "stylelint --allow-empty-input './src/**/*.{css,scss,sass,vue}' --fix",
+ "lint": "eslint '**/*.{js,jsx,ts,tsx,vue}'",
+ "lint:fix": "eslint '**/*.{js,jsx,ts,tsx,vue}' --fix",
+ "test": "cross-env FORCE_COLOR=1 vitest run",
+ "test:open": "cross-env FORCE_COLOR=1 vitest --ui",
+ "semantic-release": "semantic-release",
+ "commit": "cz"
+ },
+ "peerDependencies": {
+ "vue": ">= 3.3.13 < 4"
+ },
+ "dependencies": {
+ "@kong/icons": "^1.8.13",
+ "@sindresorhus/slugify": "^2.2.1",
+ "@vueuse/core": "^10.7.1",
+ "html-format": "^1.1.6",
+ "markdown-it": "^14.0.0",
+ "markdown-it-abbr": "^2.0.0",
+ "markdown-it-anchor": "^8.6.7",
+ "markdown-it-attrs": "^4.1.6",
+ "markdown-it-deflist": "^3.0.0",
+ "markdown-it-emoji": "^3.0.0",
+ "markdown-it-footnote": "^4.0.0",
+ "markdown-it-ins": "^4.0.0",
+ "markdown-it-mark": "^4.0.0",
+ "markdown-it-sub": "^2.0.0",
+ "markdown-it-sup": "^2.0.0",
+ "markdown-it-task-lists": "^2.1.1",
+ "markdown-it-textual-uml": "^0.17.1",
+ "mermaid": "^10.6.1",
+ "uuid": "^9.0.1"
+ },
+ "devDependencies": {
+ "@babel/types": "^7.23.6",
+ "@commitlint/cli": "^18.4.4",
+ "@commitlint/config-conventional": "^18.4.4",
+ "@digitalroute/cz-conventional-changelog-for-jira": "^8.0.1",
+ "@evilmartians/lefthook": "^1.5.6",
+ "@kong/design-tokens": "^1.12.4",
+ "@semantic-release/changelog": "^6.0.3",
+ "@semantic-release/git": "^10.0.1",
+ "@types/jsdom": "^21.1.6",
+ "@types/markdown-it": "^13.0.7",
+ "@types/markdown-it-attrs": "^4.1.3",
+ "@types/markdown-it-emoji": "^2.0.4",
+ "@types/markdown-it-footnote": "^3.0.3",
+ "@types/node": "^20.10.8",
+ "@types/uuid": "^9.0.7",
+ "@typescript-eslint/eslint-plugin": "^6.18.1",
+ "@typescript-eslint/parser": "^6.18.1",
+ "@vitejs/plugin-vue": "^5.0.3",
+ "@vitest/ui": "^1.2.0",
+ "@vue/test-utils": "^2.4.3",
+ "@vue/tsconfig": "^0.5.1",
+ "autoprefixer": "^10.4.16",
+ "c8": "^9.0.0",
+ "commitizen": "^4.3.0",
+ "cross-env": "^7.0.3",
+ "cz-conventional-changelog": "^3.3.0",
+ "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-plugin-vue": "^9.20.1",
+ "jsdom": "^23.2.0",
+ "markdown-it-shikiji": "^0.9.19",
+ "postcss": "^8.4.33",
+ "postcss-html": "^1.6.0",
+ "rimraf": "^5.0.5",
+ "rollup-plugin-visualizer": "^5.12.0",
+ "sass": "^1.69.7",
+ "semantic-release": "^22.0.12",
+ "shikiji": "^0.9.19",
+ "stylelint": "^16.1.0",
+ "stylelint-config-html": "^1.1.0",
+ "stylelint-config-recommended-scss": "^14.0.0",
+ "stylelint-config-recommended-vue": "^1.5.0",
+ "stylelint-order": "^6.0.4",
+ "ts-node": "^10.9.2",
+ "tsc-alias": "^1.8.8",
+ "typescript": "^5.3.3",
+ "vite": "^5.0.11",
+ "vitest": "1.2.0",
+ "vue": "^3.4.12",
+ "vue-tsc": "^1.8.27"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Kong/markdown.git"
+ },
+ "homepage": "https://github.com/Kong/markdown",
+ "bugs": {
+ "url": "https://github.com/Kong/markdown/issues"
+ },
+ "author": {
+ "name": "Kong Inc.",
+ "url": "https://konghq.com/"
+ },
+ "release": {
+ "branches": [
+ "+([0-9])?(.{+([0-9]),x}).x",
+ "main",
+ "next",
+ "next-major",
+ {
+ "name": "beta",
+ "prerelease": true
+ },
+ {
+ "name": "alpha",
+ "prerelease": true
+ }
+ ],
+ "plugins": [
+ "@semantic-release/commit-analyzer",
+ "@semantic-release/release-notes-generator",
+ [
+ "@semantic-release/changelog",
+ {
+ "changelogFile": "CHANGELOG.md"
+ }
+ ],
+ "@semantic-release/npm",
+ [
+ "@semantic-release/git",
+ {
+ "assets": [
+ "CHANGELOG.md",
+ "package.json"
+ ]
+ }
+ ],
+ "@semantic-release/github"
+ ]
+ },
+ "engines": {
+ "node": ">=18.17.0"
+ },
+ "volta": {
+ "node": "20.11.0",
+ "pnpm": "8.14.1"
+ },
+ "config": {
+ "commitizen": {
+ "path": "./node_modules/@digitalroute/cz-conventional-changelog-for-jira",
+ "skipScope": false,
+ "jiraOptional": true,
+ "jiraLocation": "post-description",
+ "jiraPrepend": "[",
+ "jiraAppend": "]"
+ }
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..47341ae
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,7831 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+dependencies:
+ '@kong/icons':
+ specifier: ^1.8.13
+ version: 1.8.13(vue@3.4.14)
+ '@sindresorhus/slugify':
+ specifier: ^2.2.1
+ version: 2.2.1
+ '@vueuse/core':
+ specifier: ^10.7.1
+ version: 10.7.1(vue@3.4.14)
+ html-format:
+ specifier: ^1.1.6
+ version: 1.1.6
+ markdown-it:
+ specifier: ^14.0.0
+ version: 14.0.0
+ markdown-it-abbr:
+ specifier: ^2.0.0
+ version: 2.0.0
+ markdown-it-anchor:
+ specifier: ^8.6.7
+ version: 8.6.7(@types/markdown-it@13.0.7)(markdown-it@14.0.0)
+ markdown-it-attrs:
+ specifier: ^4.1.6
+ version: 4.1.6(markdown-it@14.0.0)
+ markdown-it-deflist:
+ specifier: ^3.0.0
+ version: 3.0.0
+ markdown-it-emoji:
+ specifier: ^3.0.0
+ version: 3.0.0
+ markdown-it-footnote:
+ specifier: ^4.0.0
+ version: 4.0.0
+ markdown-it-ins:
+ specifier: ^4.0.0
+ version: 4.0.0
+ markdown-it-mark:
+ specifier: ^4.0.0
+ version: 4.0.0
+ markdown-it-sub:
+ specifier: ^2.0.0
+ version: 2.0.0
+ markdown-it-sup:
+ specifier: ^2.0.0
+ version: 2.0.0
+ markdown-it-task-lists:
+ specifier: ^2.1.1
+ version: 2.1.1
+ markdown-it-textual-uml:
+ specifier: ^0.17.1
+ version: 0.17.1
+ mermaid:
+ specifier: ^10.6.1
+ version: 10.6.1
+ uuid:
+ specifier: ^9.0.1
+ version: 9.0.1
+
+devDependencies:
+ '@babel/types':
+ specifier: ^7.23.6
+ version: 7.23.6
+ '@commitlint/cli':
+ specifier: ^18.4.4
+ version: 18.4.4(@types/node@20.11.5)(typescript@5.3.3)
+ '@commitlint/config-conventional':
+ specifier: ^18.4.4
+ version: 18.4.4
+ '@digitalroute/cz-conventional-changelog-for-jira':
+ specifier: ^8.0.1
+ version: 8.0.1(@types/node@20.11.5)(typescript@5.3.3)
+ '@evilmartians/lefthook':
+ specifier: ^1.5.6
+ version: 1.6.0
+ '@kong/design-tokens':
+ specifier: ^1.12.4
+ version: 1.12.4
+ '@semantic-release/changelog':
+ specifier: ^6.0.3
+ version: 6.0.3(semantic-release@22.0.12)
+ '@semantic-release/git':
+ specifier: ^10.0.1
+ version: 10.0.1(semantic-release@22.0.12)
+ '@types/jsdom':
+ specifier: ^21.1.6
+ version: 21.1.6
+ '@types/markdown-it':
+ specifier: ^13.0.7
+ version: 13.0.7
+ '@types/markdown-it-attrs':
+ specifier: ^4.1.3
+ version: 4.1.3
+ '@types/markdown-it-emoji':
+ specifier: ^2.0.4
+ version: 2.0.4
+ '@types/markdown-it-footnote':
+ specifier: ^3.0.3
+ version: 3.0.3
+ '@types/node':
+ specifier: ^20.10.8
+ version: 20.11.5
+ '@types/uuid':
+ specifier: ^9.0.7
+ version: 9.0.7
+ '@typescript-eslint/eslint-plugin':
+ specifier: ^6.18.1
+ version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/parser':
+ specifier: ^6.18.1
+ version: 6.19.1(eslint@8.56.0)(typescript@5.3.3)
+ '@vitejs/plugin-vue':
+ specifier: ^5.0.3
+ version: 5.0.3(vite@5.0.11)(vue@3.4.14)
+ '@vitest/ui':
+ specifier: ^1.2.0
+ version: 1.2.0(vitest@1.2.0)
+ '@vue/test-utils':
+ specifier: ^2.4.3
+ version: 2.4.3(vue@3.4.14)
+ '@vue/tsconfig':
+ specifier: ^0.5.1
+ version: 0.5.1
+ autoprefixer:
+ specifier: ^10.4.16
+ version: 10.4.16(postcss@8.4.33)
+ c8:
+ specifier: ^9.0.0
+ version: 9.1.0
+ commitizen:
+ specifier: ^4.3.0
+ version: 4.3.0(@types/node@20.11.5)(typescript@5.3.3)
+ cross-env:
+ specifier: ^7.0.3
+ version: 7.0.3
+ cz-conventional-changelog:
+ specifier: ^3.3.0
+ version: 3.3.0(@types/node@20.11.5)(typescript@5.3.3)
+ eslint:
+ specifier: ^8.56.0
+ version: 8.56.0
+ eslint-config-standard:
+ specifier: ^17.1.0
+ version: 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:
+ specifier: ^2.29.1
+ version: 2.29.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)
+ eslint-plugin-n:
+ specifier: ^16.6.2
+ version: 16.6.2(eslint@8.56.0)
+ eslint-plugin-promise:
+ specifier: ^6.1.1
+ version: 6.1.1(eslint@8.56.0)
+ eslint-plugin-vue:
+ specifier: ^9.20.1
+ version: 9.20.1(eslint@8.56.0)
+ jsdom:
+ specifier: ^23.2.0
+ version: 23.2.0
+ markdown-it-shikiji:
+ specifier: ^0.9.19
+ version: 0.9.19
+ postcss:
+ specifier: ^8.4.33
+ version: 8.4.33
+ postcss-html:
+ specifier: ^1.6.0
+ version: 1.6.0
+ rimraf:
+ specifier: ^5.0.5
+ version: 5.0.5
+ rollup-plugin-visualizer:
+ specifier: ^5.12.0
+ version: 5.12.0
+ sass:
+ specifier: ^1.69.7
+ version: 1.69.7
+ semantic-release:
+ specifier: ^22.0.12
+ version: 22.0.12(typescript@5.3.3)
+ shikiji:
+ specifier: ^0.9.19
+ version: 0.9.19
+ stylelint:
+ specifier: ^16.1.0
+ version: 16.1.0(typescript@5.3.3)
+ stylelint-config-html:
+ specifier: ^1.1.0
+ version: 1.1.0(postcss-html@1.6.0)(stylelint@16.1.0)
+ stylelint-config-recommended-scss:
+ specifier: ^14.0.0
+ version: 14.0.0(postcss@8.4.33)(stylelint@16.1.0)
+ stylelint-config-recommended-vue:
+ specifier: ^1.5.0
+ version: 1.5.0(postcss-html@1.6.0)(stylelint@16.1.0)
+ stylelint-order:
+ specifier: ^6.0.4
+ version: 6.0.4(stylelint@16.1.0)
+ ts-node:
+ specifier: ^10.9.2
+ version: 10.9.2(@types/node@20.11.5)(typescript@5.3.3)
+ tsc-alias:
+ specifier: ^1.8.8
+ version: 1.8.8
+ typescript:
+ specifier: ^5.3.3
+ version: 5.3.3
+ vite:
+ specifier: ^5.0.11
+ version: 5.0.11(@types/node@20.11.5)(sass@1.69.7)
+ vitest:
+ specifier: 1.2.0
+ version: 1.2.0(@types/node@20.11.5)(@vitest/ui@1.2.0)(jsdom@23.2.0)(sass@1.69.7)
+ vue:
+ specifier: ^3.4.12
+ version: 3.4.14(typescript@5.3.3)
+ vue-tsc:
+ specifier: ^1.8.27
+ version: 1.8.27(typescript@5.3.3)
+
+packages:
+
+ /@aashutoshrathi/word-wrap@1.2.6:
+ resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /@asamuzakjp/dom-selector@2.0.2:
+ resolution: {integrity: sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==}
+ dependencies:
+ bidi-js: 1.0.3
+ css-tree: 2.3.1
+ is-potential-custom-element-name: 1.0.1
+ 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/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
+
+ /@braintree/sanitize-url@6.0.4:
+ resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==}
+ dev: false
+
+ /@colors/colors@1.5.0:
+ resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
+ engines: {node: '>=0.1.90'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@commitlint/cli@18.4.4(@types/node@20.11.5)(typescript@5.3.3):
+ resolution: {integrity: sha512-Ro3wIo//fV3XiV1EkdpHog6huaEyNcUAVrSmtgKqYM5g982wOWmP4FXvEDFwRMVgz878CNBvvCc33dMZ5AQJ/g==}
+ engines: {node: '>=v18'}
+ hasBin: true
+ dependencies:
+ '@commitlint/format': 18.4.4
+ '@commitlint/lint': 18.4.4
+ '@commitlint/load': 18.4.4(@types/node@20.11.5)(typescript@5.3.3)
+ '@commitlint/read': 18.4.4
+ '@commitlint/types': 18.4.4
+ execa: 5.1.1
+ lodash.isfunction: 3.0.9
+ resolve-from: 5.0.0
+ resolve-global: 1.0.0
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+ dev: true
+
+ /@commitlint/config-conventional@18.4.4:
+ resolution: {integrity: sha512-Bz3sPQSboBN+Et/KyZrR+OJ3z9PrHDw7Bls0/hv94PmuHBtMq1dCGxS9XzTGzxeMNlytCC4kxF083tbhPljl3Q==}
+ engines: {node: '>=v18'}
+ dependencies:
+ conventional-changelog-conventionalcommits: 7.0.2
+ dev: true
+
+ /@commitlint/config-validator@18.4.4:
+ resolution: {integrity: sha512-/QI8KIg/h7O0Eus36fPcEcO3QPBcdXuGfZeCF5m15k0EB2bcU8s6pHNTNEa6xz9PrAefHCL+yzRJj7w20T6Mow==}
+ engines: {node: '>=v18'}
+ requiresBuild: true
+ dependencies:
+ '@commitlint/types': 18.4.4
+ ajv: 8.12.0
+ dev: true
+
+ /@commitlint/ensure@18.4.4:
+ resolution: {integrity: sha512-KjD19p6julB5WrQL+Cd8p+AePwpl1XzGAjB0jnuFMKWtji9L7ucCZUKDstGjlkBZGGzH/nvdB8K+bh5K27EVUg==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/types': 18.4.4
+ lodash.camelcase: 4.3.0
+ lodash.kebabcase: 4.1.1
+ lodash.snakecase: 4.1.1
+ lodash.startcase: 4.4.0
+ lodash.upperfirst: 4.3.1
+ dev: true
+
+ /@commitlint/execute-rule@18.4.4:
+ resolution: {integrity: sha512-a37Nd3bDQydtg9PCLLWM9ZC+GO7X5i4zJvrggJv5jBhaHsXeQ9ZWdO6ODYR+f0LxBXXNYK3geYXJrCWUCP8JEg==}
+ engines: {node: '>=v18'}
+ requiresBuild: true
+ dev: true
+
+ /@commitlint/format@18.4.4:
+ resolution: {integrity: sha512-2v3V5hVlv0R3pe7p66IX5F7cjeVvGM5JqITRIbBCFvGHPJ/CG74rjTkAu0RBEiIhlk3eOaLjVGq3d5falPkLBA==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/types': 18.4.4
+ chalk: 4.1.2
+ dev: true
+
+ /@commitlint/is-ignored@18.4.4:
+ resolution: {integrity: sha512-rXWes9owKBTjfTr6Od7YlflRg4N+ngkOH+dUZhk0qL/XQb26mHz0EgVgdixMVBac1OsohRwJaLmVHX+5F6vfmg==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/types': 18.4.4
+ semver: 7.5.4
+ dev: true
+
+ /@commitlint/lint@18.4.4:
+ resolution: {integrity: sha512-SoyQstVxMY5Z4GnFRtRzy+NWYb+yVseXgir+7BxnpB59oH05C9XztRrhDw6OnkNeXhjINTpi1HLnuY7So+CaAQ==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/is-ignored': 18.4.4
+ '@commitlint/parse': 18.4.4
+ '@commitlint/rules': 18.4.4
+ '@commitlint/types': 18.4.4
+ dev: true
+
+ /@commitlint/load@18.4.4(@types/node@20.11.5)(typescript@5.3.3):
+ resolution: {integrity: sha512-RaDIa9qwOw2xRJ3Jr2DBXd14rmnHJIX2XdZF4kmoF1rgsg/+7cvrExLSUNAkQUNimyjCn1b/bKX2Omm+GdY0XQ==}
+ engines: {node: '>=v18'}
+ requiresBuild: true
+ dependencies:
+ '@commitlint/config-validator': 18.4.4
+ '@commitlint/execute-rule': 18.4.4
+ '@commitlint/resolve-extends': 18.4.4
+ '@commitlint/types': 18.4.4
+ chalk: 4.1.2
+ cosmiconfig: 8.3.6(typescript@5.3.3)
+ cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.5)(cosmiconfig@8.3.6)(typescript@5.3.3)
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ lodash.uniq: 4.5.0
+ resolve-from: 5.0.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+ dev: true
+
+ /@commitlint/message@18.4.4:
+ resolution: {integrity: sha512-lHF95mMDYgAI1LBXveJUyg4eLaMXyOqJccCK3v55ZOEUsMPrDi8upqDjd/NmzWmESYihaOMBTAnxm+6oD1WoDQ==}
+ engines: {node: '>=v18'}
+ dev: true
+
+ /@commitlint/parse@18.4.4:
+ resolution: {integrity: sha512-99G7dyn/OoyNWXJni0Ki0K3aJd01pEb/Im/Id6y4X7PN+kGOahjz2z/cXYYHn7xDdooqFVdiVrVLeChfgpWZ2g==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/types': 18.4.4
+ conventional-changelog-angular: 7.0.0
+ conventional-commits-parser: 5.0.0
+ dev: true
+
+ /@commitlint/read@18.4.4:
+ resolution: {integrity: sha512-r58JbWky4gAFPea/CZmvlqP9Ehbs+8gSEUqhIJOojKzTc3xlxFnZUDVPcEnnaqzQEEoV6C69VW7xuzdcBlu/FQ==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/top-level': 18.4.4
+ '@commitlint/types': 18.4.4
+ git-raw-commits: 2.0.11
+ minimist: 1.2.8
+ dev: true
+
+ /@commitlint/resolve-extends@18.4.4:
+ resolution: {integrity: sha512-RRpIHSbRnFvmGifVk21Gqazf1QF/yeP+Kkg/e3PlkegcOKd/FGOXp/Kx9cvSO2K7ucSn4GD/oBvgasFoy+NCAw==}
+ engines: {node: '>=v18'}
+ requiresBuild: true
+ dependencies:
+ '@commitlint/config-validator': 18.4.4
+ '@commitlint/types': 18.4.4
+ import-fresh: 3.3.0
+ lodash.mergewith: 4.6.2
+ resolve-from: 5.0.0
+ resolve-global: 1.0.0
+ dev: true
+
+ /@commitlint/rules@18.4.4:
+ resolution: {integrity: sha512-6Uzlsnl/GljEI+80NWjf4ThOfR8NIsbm18IfXYuCEchlwMHSxiuYG4rHSK5DNmG/+MIo8eR5VdQ0gQyt7kWzAA==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/ensure': 18.4.4
+ '@commitlint/message': 18.4.4
+ '@commitlint/to-lines': 18.4.4
+ '@commitlint/types': 18.4.4
+ execa: 5.1.1
+ dev: true
+
+ /@commitlint/to-lines@18.4.4:
+ resolution: {integrity: sha512-mwe2Roa59NCz/krniAdCygFabg7+fQCkIhXqBHw00XQ8Y7lw4poZLLxeGI3p3bLpcEOXdqIDrEGLwHmG5lBdwQ==}
+ engines: {node: '>=v18'}
+ dev: true
+
+ /@commitlint/top-level@18.4.4:
+ resolution: {integrity: sha512-PBwW1drgeavl9CadB7IPRUk6rkUP/O8jEkxjlC+ofuh3pw0bzJdAT+Kw7M1Yc9KtTb9xTaqUB8uvRtaybHa/tQ==}
+ engines: {node: '>=v18'}
+ dependencies:
+ find-up: 5.0.0
+ dev: true
+
+ /@commitlint/types@18.4.4:
+ resolution: {integrity: sha512-/FykLtodD8gKs3+VNkAUwofu4LBHankclj+I8fB2jTRvG6PV7k/OUt4P+VbM7ip853qS4F0g7Z6hLNa6JeMcAQ==}
+ engines: {node: '>=v18'}
+ requiresBuild: true
+ dependencies:
+ chalk: 4.1.2
+ dev: true
+
+ /@cspotcode/source-map-support@0.8.1:
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+ dev: true
+
+ /@csstools/css-parser-algorithms@2.5.0(@csstools/css-tokenizer@2.2.3):
+ resolution: {integrity: sha512-abypo6m9re3clXA00eu5syw+oaPHbJTPapu9C4pzNsJ4hdZDzushT50Zhu+iIYXgEe1CxnRMn7ngsbV+MLrlpQ==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ '@csstools/css-tokenizer': ^2.2.3
+ dependencies:
+ '@csstools/css-tokenizer': 2.2.3
+ dev: true
+
+ /@csstools/css-tokenizer@2.2.3:
+ resolution: {integrity: sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==}
+ engines: {node: ^14 || ^16 || >=18}
+ dev: true
+
+ /@csstools/media-query-list-parser@2.1.7(@csstools/css-parser-algorithms@2.5.0)(@csstools/css-tokenizer@2.2.3):
+ resolution: {integrity: sha512-lHPKJDkPUECsyAvD60joYfDmp8UERYxHGkFfyLJFTVK/ERJe0sVlIFLXU5XFxdjNDTerp5L4KeaKG+Z5S94qxQ==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^2.5.0
+ '@csstools/css-tokenizer': ^2.2.3
+ dependencies:
+ '@csstools/css-parser-algorithms': 2.5.0(@csstools/css-tokenizer@2.2.3)
+ '@csstools/css-tokenizer': 2.2.3
+ dev: true
+
+ /@csstools/selector-specificity@3.0.1(postcss-selector-parser@6.0.15):
+ resolution: {integrity: sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ postcss-selector-parser: ^6.0.13
+ dependencies:
+ postcss-selector-parser: 6.0.15
+ dev: true
+
+ /@digitalroute/cz-conventional-changelog-for-jira@8.0.1(@types/node@20.11.5)(typescript@5.3.3):
+ resolution: {integrity: sha512-I7uNQ2R5LnDYVhQ01sfNvaxqe1PutXyDl8Kltj4L8uDa1LTYqQgWWp3yEj3XYDNjhUjsAheHW0lsmF1oiAjWVg==}
+ engines: {node: '>= 10'}
+ dependencies:
+ boxen: 5.1.2
+ chalk: 2.4.2
+ commitizen: 4.3.0(@types/node@20.11.5)(typescript@5.3.3)
+ cz-conventional-changelog: 3.3.0(@types/node@20.11.5)(typescript@5.3.3)
+ inquirer: 8.2.6
+ lodash.map: 4.6.0
+ longest: 2.0.1
+ right-pad: 1.0.1
+ word-wrap: 1.2.5
+ optionalDependencies:
+ '@commitlint/load': 18.4.4(@types/node@20.11.5)(typescript@5.3.3)
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+ dev: true
+
+ /@esbuild/android-arm64@0.19.9:
+ resolution: {integrity: sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm@0.19.9:
+ resolution: {integrity: sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-x64@0.19.9:
+ resolution: {integrity: sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-arm64@0.19.9:
+ resolution: {integrity: sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-x64@0.19.9:
+ resolution: {integrity: sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.19.9:
+ resolution: {integrity: sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-x64@0.19.9:
+ resolution: {integrity: sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm64@0.19.9:
+ resolution: {integrity: sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm@0.19.9:
+ resolution: {integrity: sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ia32@0.19.9:
+ resolution: {integrity: sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64@0.19.9:
+ resolution: {integrity: sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-mips64el@0.19.9:
+ resolution: {integrity: sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ppc64@0.19.9:
+ resolution: {integrity: sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-riscv64@0.19.9:
+ resolution: {integrity: sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-s390x@0.19.9:
+ resolution: {integrity: sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-x64@0.19.9:
+ resolution: {integrity: sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/netbsd-x64@0.19.9:
+ resolution: {integrity: sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/openbsd-x64@0.19.9:
+ resolution: {integrity: sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/sunos-x64@0.19.9:
+ resolution: {integrity: sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-arm64@0.19.9:
+ resolution: {integrity: sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-ia32@0.19.9:
+ resolution: {integrity: sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-x64@0.19.9:
+ resolution: {integrity: sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==}
+ 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
+
+ /@evilmartians/lefthook@1.6.0:
+ resolution: {integrity: sha512-vmpQuxYnimUkDEn4UzJsAJ32tNJ5OwQuWG9tX+/5F6OuBFDi62guqOLiflpLBiH7WFVBTOefCQ/DJgubjE8WrA==}
+ cpu: [x64, arm64, ia32]
+ os: [darwin, linux, win32]
+ hasBin: true
+ requiresBuild: true
+ dev: true
+
+ /@humanwhocodes/config-array@0.11.13:
+ resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 2.0.1
+ 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.1:
+ resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==}
+ dev: true
+
+ /@isaacs/cliui@8.0.2:
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: /string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: /strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: /wrap-ansi@7.0.0
+ dev: true
+
+ /@istanbuljs/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/resolve-uri@3.1.1:
+ resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/sourcemap-codec@1.4.15:
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+
+ /@jridgewell/trace-mapping@0.3.20:
+ resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+ dev: true
+
+ /@jridgewell/trace-mapping@0.3.9:
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+ dev: true
+
+ /@kong/design-tokens@1.12.4:
+ resolution: {integrity: sha512-ldBWJbpNLU34OR0d+ptErp/FJrwc8GK8nUZjUmu9zy69ebjztcNAoULgc8MXS+bjzwGZ8U/v8Vmbhh3WFQq0gA==}
+ dev: true
+
+ /@kong/icons@1.8.13(vue@3.4.14):
+ resolution: {integrity: sha512-ZALSRHW/vfimcpwu4D17Qosq+o5quYG6QB55by5aljtTDb7DNCjbnU1RIfevQXHGuRSoW3D+9y5gm+2aRBibRQ==}
+ engines: {node: '>=18.17.0'}
+ peerDependencies:
+ vue: '>= 3.3.4 < 4'
+ dependencies:
+ vue: 3.4.14(typescript@5.3.3)
+ dev: false
+
+ /@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.15.0
+ dev: true
+
+ /@octokit/auth-token@4.0.0:
+ resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==}
+ engines: {node: '>= 18'}
+ dev: true
+
+ /@octokit/core@5.0.2:
+ resolution: {integrity: sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/auth-token': 4.0.0
+ '@octokit/graphql': 7.0.2
+ '@octokit/request': 8.1.6
+ '@octokit/request-error': 5.0.1
+ '@octokit/types': 12.4.0
+ before-after-hook: 2.2.3
+ universal-user-agent: 6.0.1
+ dev: true
+
+ /@octokit/endpoint@9.0.4:
+ resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/types': 12.4.0
+ universal-user-agent: 6.0.1
+ dev: true
+
+ /@octokit/graphql@7.0.2:
+ resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/request': 8.1.6
+ '@octokit/types': 12.4.0
+ universal-user-agent: 6.0.1
+ dev: true
+
+ /@octokit/openapi-types@19.1.0:
+ resolution: {integrity: sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==}
+ dev: true
+
+ /@octokit/plugin-paginate-rest@9.1.5(@octokit/core@5.0.2):
+ resolution: {integrity: sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ '@octokit/core': '>=5'
+ dependencies:
+ '@octokit/core': 5.0.2
+ '@octokit/types': 12.4.0
+ dev: true
+
+ /@octokit/plugin-retry@6.0.1(@octokit/core@5.0.2):
+ resolution: {integrity: sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ '@octokit/core': '>=5'
+ dependencies:
+ '@octokit/core': 5.0.2
+ '@octokit/request-error': 5.0.1
+ '@octokit/types': 12.4.0
+ bottleneck: 2.19.5
+ dev: true
+
+ /@octokit/plugin-throttling@8.1.3(@octokit/core@5.0.2):
+ resolution: {integrity: sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ '@octokit/core': ^5.0.0
+ dependencies:
+ '@octokit/core': 5.0.2
+ '@octokit/types': 12.4.0
+ bottleneck: 2.19.5
+ dev: true
+
+ /@octokit/request-error@5.0.1:
+ resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/types': 12.4.0
+ deprecation: 2.3.1
+ once: 1.4.0
+ dev: true
+
+ /@octokit/request@8.1.6:
+ resolution: {integrity: sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/endpoint': 9.0.4
+ '@octokit/request-error': 5.0.1
+ '@octokit/types': 12.4.0
+ universal-user-agent: 6.0.1
+ dev: true
+
+ /@octokit/types@12.4.0:
+ resolution: {integrity: sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==}
+ dependencies:
+ '@octokit/openapi-types': 19.1.0
+ dev: true
+
+ /@one-ini/wasm@0.1.1:
+ resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
+ dev: true
+
+ /@pkgjs/parseargs@0.11.0:
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@pnpm/config.env-replace@1.1.0:
+ resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
+ engines: {node: '>=12.22.0'}
+ dev: true
+
+ /@pnpm/network.ca-file@1.0.2:
+ resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
+ engines: {node: '>=12.22.0'}
+ dependencies:
+ graceful-fs: 4.2.10
+ dev: true
+
+ /@pnpm/npm-conf@2.2.2:
+ resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@pnpm/config.env-replace': 1.1.0
+ '@pnpm/network.ca-file': 1.0.2
+ config-chain: 1.1.13
+ dev: true
+
+ /@polka/url@1.0.0-next.24:
+ resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==}
+ dev: true
+
+ /@rollup/rollup-android-arm-eabi@4.9.0:
+ resolution: {integrity: sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA==}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-android-arm64@4.9.0:
+ resolution: {integrity: sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A==}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-darwin-arm64@4.9.0:
+ resolution: {integrity: sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ==}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-darwin-x64@4.9.0:
+ resolution: {integrity: sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw==}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-arm-gnueabihf@4.9.0:
+ resolution: {integrity: sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg==}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-arm64-gnu@4.9.0:
+ resolution: {integrity: sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-arm64-musl@4.9.0:
+ resolution: {integrity: sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-riscv64-gnu@4.9.0:
+ resolution: {integrity: sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w==}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-x64-gnu@4.9.0:
+ resolution: {integrity: sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-x64-musl@4.9.0:
+ resolution: {integrity: sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-win32-arm64-msvc@4.9.0:
+ resolution: {integrity: sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q==}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-win32-ia32-msvc@4.9.0:
+ resolution: {integrity: sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q==}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-win32-x64-msvc@4.9.0:
+ resolution: {integrity: sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw==}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@semantic-release/changelog@6.0.3(semantic-release@22.0.12):
+ resolution: {integrity: sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==}
+ engines: {node: '>=14.17'}
+ peerDependencies:
+ semantic-release: '>=18.0.0'
+ dependencies:
+ '@semantic-release/error': 3.0.0
+ aggregate-error: 3.1.0
+ fs-extra: 11.2.0
+ lodash: 4.17.21
+ semantic-release: 22.0.12(typescript@5.3.3)
+ dev: true
+
+ /@semantic-release/commit-analyzer@11.1.0(semantic-release@22.0.12):
+ resolution: {integrity: sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==}
+ engines: {node: ^18.17 || >=20.6.1}
+ peerDependencies:
+ semantic-release: '>=20.1.0'
+ dependencies:
+ conventional-changelog-angular: 7.0.0
+ conventional-commits-filter: 4.0.0
+ conventional-commits-parser: 5.0.0
+ debug: 4.3.4
+ import-from-esm: 1.3.3
+ lodash-es: 4.17.21
+ micromatch: 4.0.5
+ semantic-release: 22.0.12(typescript@5.3.3)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@semantic-release/error@3.0.0:
+ resolution: {integrity: sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==}
+ engines: {node: '>=14.17'}
+ dev: true
+
+ /@semantic-release/error@4.0.0:
+ resolution: {integrity: sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /@semantic-release/git@10.0.1(semantic-release@22.0.12):
+ resolution: {integrity: sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==}
+ engines: {node: '>=14.17'}
+ peerDependencies:
+ semantic-release: '>=18.0.0'
+ dependencies:
+ '@semantic-release/error': 3.0.0
+ aggregate-error: 3.1.0
+ debug: 4.3.4
+ dir-glob: 3.0.1
+ execa: 5.1.1
+ lodash: 4.17.21
+ micromatch: 4.0.5
+ p-reduce: 2.1.0
+ semantic-release: 22.0.12(typescript@5.3.3)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@semantic-release/github@9.2.5(semantic-release@22.0.12):
+ resolution: {integrity: sha512-XWumFEOHiWllekymZjeVgkQCJ4YnD8020ZspAHYIIBNX8O4d/1ldeU5iNXu6NGkKlOCokyXh13KwVP0UEMm5kw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ semantic-release: '>=20.1.0'
+ dependencies:
+ '@octokit/core': 5.0.2
+ '@octokit/plugin-paginate-rest': 9.1.5(@octokit/core@5.0.2)
+ '@octokit/plugin-retry': 6.0.1(@octokit/core@5.0.2)
+ '@octokit/plugin-throttling': 8.1.3(@octokit/core@5.0.2)
+ '@semantic-release/error': 4.0.0
+ aggregate-error: 5.0.0
+ debug: 4.3.4
+ dir-glob: 3.0.1
+ globby: 14.0.0
+ http-proxy-agent: 7.0.0
+ https-proxy-agent: 7.0.2
+ issue-parser: 6.0.0
+ lodash-es: 4.17.21
+ mime: 4.0.0
+ p-filter: 3.0.0
+ semantic-release: 22.0.12(typescript@5.3.3)
+ url-join: 5.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@semantic-release/npm@11.0.2(semantic-release@22.0.12):
+ resolution: {integrity: sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==}
+ engines: {node: ^18.17 || >=20}
+ peerDependencies:
+ semantic-release: '>=20.1.0'
+ dependencies:
+ '@semantic-release/error': 4.0.0
+ aggregate-error: 5.0.0
+ execa: 8.0.1
+ fs-extra: 11.2.0
+ lodash-es: 4.17.21
+ nerf-dart: 1.0.0
+ normalize-url: 8.0.0
+ npm: 10.2.5
+ rc: 1.2.8
+ read-pkg: 9.0.1
+ registry-auth-token: 5.0.2
+ semantic-release: 22.0.12(typescript@5.3.3)
+ semver: 7.5.4
+ tempy: 3.1.0
+ dev: true
+
+ /@semantic-release/release-notes-generator@12.1.0(semantic-release@22.0.12):
+ resolution: {integrity: sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==}
+ engines: {node: ^18.17 || >=20.6.1}
+ peerDependencies:
+ semantic-release: '>=20.1.0'
+ dependencies:
+ conventional-changelog-angular: 7.0.0
+ conventional-changelog-writer: 7.0.1
+ conventional-commits-filter: 4.0.0
+ conventional-commits-parser: 5.0.0
+ debug: 4.3.4
+ get-stream: 7.0.1
+ import-from-esm: 1.3.3
+ into-stream: 7.0.0
+ lodash-es: 4.17.21
+ read-pkg-up: 11.0.0
+ semantic-release: 22.0.12(typescript@5.3.3)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@sinclair/typebox@0.27.8:
+ resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+ dev: true
+
+ /@sindresorhus/is@4.6.0:
+ resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /@sindresorhus/merge-streams@1.0.0:
+ resolution: {integrity: sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /@sindresorhus/slugify@2.2.1:
+ resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@sindresorhus/transliterate': 1.6.0
+ escape-string-regexp: 5.0.0
+ dev: false
+
+ /@sindresorhus/transliterate@1.6.0:
+ resolution: {integrity: sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ escape-string-regexp: 5.0.0
+ dev: false
+
+ /@tsconfig/node10@1.0.9:
+ resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
+ dev: true
+
+ /@tsconfig/node12@1.0.11:
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+ dev: true
+
+ /@tsconfig/node14@1.0.3:
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+ dev: true
+
+ /@tsconfig/node16@1.0.4:
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+ dev: true
+
+ /@types/d3-scale-chromatic@3.0.3:
+ resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==}
+ dev: false
+
+ /@types/d3-scale@4.0.8:
+ resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==}
+ dependencies:
+ '@types/d3-time': 3.0.3
+ dev: false
+
+ /@types/d3-time@3.0.3:
+ resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==}
+ dev: false
+
+ /@types/debug@4.1.12:
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+ dependencies:
+ '@types/ms': 0.7.34
+ dev: false
+
+ /@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/jsdom@21.1.6:
+ resolution: {integrity: sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==}
+ dependencies:
+ '@types/node': 20.11.5
+ '@types/tough-cookie': 4.0.5
+ parse5: 7.1.2
+ 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/linkify-it@3.0.5:
+ resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==}
+
+ /@types/markdown-it-attrs@4.1.3:
+ resolution: {integrity: sha512-1JsseFdHD6rQHsPcy4W3xx/whxvZ09Z+CqPpnOtrGtpmkFW07N11q7oM383//LtoKv54yn+HGnk6r4ZHUTHJVg==}
+ dependencies:
+ '@types/markdown-it': 13.0.7
+ dev: true
+
+ /@types/markdown-it-emoji@2.0.4:
+ resolution: {integrity: sha512-H6ulk/ZmbDxOayPwI/leJzrmoW1YKX1Z+MVSCHXuYhvqckV4I/c+hPTf6UiqJyn2avWugfj30XroheEb6/Ekqg==}
+ dependencies:
+ '@types/markdown-it': 13.0.7
+ dev: true
+
+ /@types/markdown-it-footnote@3.0.3:
+ resolution: {integrity: sha512-sMLBj0VcWo/4vi1J7jx3DNdup2w+14RwDMdQtcFJPabeDwt945ghc8sFBgsUfnEjcBOuKaELY22JwGb7KGmsVw==}
+ dependencies:
+ '@types/markdown-it': 13.0.7
+ dev: true
+
+ /@types/markdown-it@13.0.7:
+ resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==}
+ dependencies:
+ '@types/linkify-it': 3.0.5
+ '@types/mdurl': 1.0.5
+
+ /@types/mdast@3.0.15:
+ resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
+ dependencies:
+ '@types/unist': 2.0.10
+ dev: false
+
+ /@types/mdurl@1.0.5:
+ resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==}
+
+ /@types/minimist@1.2.5:
+ resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
+ dev: true
+
+ /@types/ms@0.7.34:
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+ dev: false
+
+ /@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
+
+ /@types/tough-cookie@4.0.5:
+ resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
+ dev: true
+
+ /@types/unist@2.0.10:
+ resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
+ dev: false
+
+ /@types/uuid@9.0.7:
+ resolution: {integrity: sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==}
+ dev: true
+
+ /@types/web-bluetooth@0.0.20:
+ resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
+ dev: false
+
+ /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3):
+ resolution: {integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==}
+ 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.1(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/scope-manager': 6.19.1
+ '@typescript-eslint/type-utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/visitor-keys': 6.19.1
+ 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.1(eslint@8.56.0)(typescript@5.3.3):
+ resolution: {integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==}
+ 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.1
+ '@typescript-eslint/types': 6.19.1
+ '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3)
+ '@typescript-eslint/visitor-keys': 6.19.1
+ debug: 4.3.4
+ eslint: 8.56.0
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/scope-manager@6.19.1:
+ resolution: {integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ dependencies:
+ '@typescript-eslint/types': 6.19.1
+ '@typescript-eslint/visitor-keys': 6.19.1
+ dev: true
+
+ /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3):
+ resolution: {integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==}
+ 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.1(typescript@5.3.3)
+ '@typescript-eslint/utils': 6.19.1(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.1:
+ resolution: {integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3):
+ resolution: {integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 6.19.1
+ '@typescript-eslint/visitor-keys': 6.19.1
+ 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.1(eslint@8.56.0)(typescript@5.3.3):
+ resolution: {integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==}
+ 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.1
+ '@typescript-eslint/types': 6.19.1
+ '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3)
+ eslint: 8.56.0
+ semver: 7.5.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/visitor-keys@6.19.1:
+ resolution: {integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ dependencies:
+ '@typescript-eslint/types': 6.19.1
+ 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.11)(vue@3.4.14):
+ 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.11(@types/node@20.11.5)(sass@1.69.7)
+ vue: 3.4.14(typescript@5.3.3)
+ dev: true
+
+ /@vitest/expect@1.2.0:
+ resolution: {integrity: sha512-H+2bHzhyvgp32o7Pgj2h9RTHN0pgYaoi26Oo3mE+dCi1PAqV31kIIVfTbqMO3Bvshd5mIrJLc73EwSRrbol9Lw==}
+ dependencies:
+ '@vitest/spy': 1.2.0
+ '@vitest/utils': 1.2.0
+ chai: 4.3.10
+ dev: true
+
+ /@vitest/runner@1.2.0:
+ resolution: {integrity: sha512-vaJkDoQaNUTroT70OhM0NPznP7H3WyRwt4LvGwCVYs/llLaqhoSLnlIhUClZpbF5RgAee29KRcNz0FEhYcgxqA==}
+ dependencies:
+ '@vitest/utils': 1.2.0
+ p-limit: 5.0.0
+ pathe: 1.1.1
+ dev: true
+
+ /@vitest/snapshot@1.2.0:
+ resolution: {integrity: sha512-P33EE7TrVgB3HDLllrjK/GG6WSnmUtWohbwcQqmm7TAk9AVHpdgf7M3F3qRHKm6vhr7x3eGIln7VH052Smo6Kw==}
+ dependencies:
+ magic-string: 0.30.5
+ pathe: 1.1.1
+ pretty-format: 29.7.0
+ dev: true
+
+ /@vitest/spy@1.2.0:
+ resolution: {integrity: sha512-MNxSAfxUaCeowqyyGwC293yZgk7cECZU9wGb8N1pYQ0yOn/SIr8t0l9XnGRdQZvNV/ZHBYu6GO/W3tj5K3VN1Q==}
+ dependencies:
+ tinyspy: 2.2.0
+ dev: true
+
+ /@vitest/ui@1.2.0(vitest@1.2.0):
+ resolution: {integrity: sha512-AFU8FBiSioYacEd0b8+2R/4GJJhxseD6bNIiEVntb505u1B/mcNMTVRepZql7r3RQJZQ7uijY9QyLdhlbh4XvA==}
+ peerDependencies:
+ vitest: ^1.0.0
+ dependencies:
+ '@vitest/utils': 1.2.0
+ 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
+ vitest: 1.2.0(@types/node@20.11.5)(@vitest/ui@1.2.0)(jsdom@23.2.0)(sass@1.69.7)
+ dev: true
+
+ /@vitest/utils@1.2.0:
+ resolution: {integrity: sha512-FyD5bpugsXlwVpTcGLDf3wSPYy8g541fQt14qtzo8mJ4LdEpDKZ9mQy2+qdJm2TZRpjY5JLXihXCgIxiRJgi5g==}
+ 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.14:
+ resolution: {integrity: sha512-ro4Zzl/MPdWs7XwxT7omHRxAjMbDFRZEEjD+2m3NBf8YzAe3HuoSEZosXQo+m1GQ1G3LQ1LdmNh1RKTYe+ssEg==}
+ dependencies:
+ '@babel/parser': 7.23.6
+ '@vue/shared': 3.4.14
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.0.2
+
+ /@vue/compiler-dom@3.4.14:
+ resolution: {integrity: sha512-nOZTY+veWNa0DKAceNWxorAbWm0INHdQq7cejFaWM1WYnoNSJbSEKYtE7Ir6lR/+mo9fttZpPVI9ZFGJ1juUEQ==}
+ dependencies:
+ '@vue/compiler-core': 3.4.14
+ '@vue/shared': 3.4.14
+
+ /@vue/compiler-sfc@3.4.14:
+ resolution: {integrity: sha512-1vHc9Kv1jV+YBZC/RJxQJ9JCxildTI+qrhtDh6tPkR1O8S+olBUekimY0km0ZNn8nG1wjtFAe9XHij+YLR8cRQ==}
+ dependencies:
+ '@babel/parser': 7.23.6
+ '@vue/compiler-core': 3.4.14
+ '@vue/compiler-dom': 3.4.14
+ '@vue/compiler-ssr': 3.4.14
+ '@vue/shared': 3.4.14
+ 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.14:
+ resolution: {integrity: sha512-bXT6+oAGlFjTYVOTtFJ4l4Jab1wjsC0cfSfOe2B4Z0N2vD2zOBSQ9w694RsCfhjk+bC2DY5Gubb1rHZVii107Q==}
+ dependencies:
+ '@vue/compiler-dom': 3.4.14
+ '@vue/shared': 3.4.14
+
+ /@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.14
+ '@vue/shared': 3.4.14
+ 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.15
+ dev: true
+
+ /@vue/reactivity@3.4.14:
+ resolution: {integrity: sha512-xRYwze5Q4tK7tT2J4uy4XLhK/AIXdU5EBUu9PLnIHcOKXO0uyXpNNMzlQKuq7B+zwtq6K2wuUL39pHA6ZQzObw==}
+ dependencies:
+ '@vue/shared': 3.4.14
+
+ /@vue/runtime-core@3.4.14:
+ resolution: {integrity: sha512-qu+NMkfujCoZL6cfqK5NOfxgXJROSlP2ZPs4CTcVR+mLrwl4TtycF5Tgo0QupkdBL+2kigc6EsJlTcuuZC1NaQ==}
+ dependencies:
+ '@vue/reactivity': 3.4.14
+ '@vue/shared': 3.4.14
+
+ /@vue/runtime-dom@3.4.14:
+ resolution: {integrity: sha512-B85XmcR4E7XsirEHVqhmy4HPbRT9WLFWV9Uhie3OapV9m1MEN9+Er6hmUIE6d8/l2sUygpK9RstFM2bmHEUigA==}
+ dependencies:
+ '@vue/runtime-core': 3.4.14
+ '@vue/shared': 3.4.14
+ csstype: 3.1.3
+
+ /@vue/server-renderer@3.4.14(vue@3.4.14):
+ resolution: {integrity: sha512-pwSKXQfYdJBTpvWHGEYI+akDE18TXAiLcGn+Q/2Fj8wQSHWztoo7PSvfMNqu6NDhp309QXXbPFEGCU5p85HqkA==}
+ peerDependencies:
+ vue: 3.4.14
+ dependencies:
+ '@vue/compiler-ssr': 3.4.14
+ '@vue/shared': 3.4.14
+ vue: 3.4.14(typescript@5.3.3)
+
+ /@vue/shared@3.4.14:
+ resolution: {integrity: sha512-nmi3BtLpvqXAWoRZ6HQ+pFJOHBU4UnH3vD3opgmwXac7vhaHKA9nj1VeGjMggdB9eLtW83eHyPCmOU1qzdsC7Q==}
+
+ /@vue/test-utils@2.4.3(vue@3.4.14):
+ resolution: {integrity: sha512-F4K7mF+ad++VlTrxMJVRnenKSJmO6fkQt2wpRDiKDesQMkfpniGWsqEi/JevxGBo2qEkwwjvTUAoiGJLNx++CA==}
+ peerDependencies:
+ '@vue/server-renderer': ^3.0.1
+ vue: ^3.0.1
+ peerDependenciesMeta:
+ '@vue/server-renderer':
+ optional: true
+ dependencies:
+ js-beautify: 1.14.11
+ vue: 3.4.14(typescript@5.3.3)
+ vue-component-type-helpers: 1.8.25
+ dev: true
+
+ /@vue/tsconfig@0.5.1:
+ resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==}
+ dev: true
+
+ /@vueuse/core@10.7.1(vue@3.4.14):
+ resolution: {integrity: sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==}
+ dependencies:
+ '@types/web-bluetooth': 0.0.20
+ '@vueuse/metadata': 10.7.1
+ '@vueuse/shared': 10.7.1(vue@3.4.14)
+ vue-demi: 0.14.6(vue@3.4.14)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+ dev: false
+
+ /@vueuse/metadata@10.7.1:
+ resolution: {integrity: sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw==}
+ dev: false
+
+ /@vueuse/shared@10.7.1(vue@3.4.14):
+ resolution: {integrity: sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==}
+ dependencies:
+ vue-demi: 0.14.6(vue@3.4.14)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+ dev: false
+
+ /JSONStream@1.3.5:
+ resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+ hasBin: true
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
+ dev: true
+
+ /abbrev@2.0.0:
+ resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ dev: true
+
+ /acorn-jsx@5.3.2(acorn@8.11.2):
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.11.2
+ dev: true
+
+ /acorn-walk@8.3.1:
+ resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /acorn@8.11.2:
+ resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /agent-base@7.1.0:
+ resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
+ engines: {node: '>= 14'}
+ dependencies:
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /aggregate-error@3.1.0:
+ resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+ engines: {node: '>=8'}
+ dependencies:
+ clean-stack: 2.2.0
+ indent-string: 4.0.0
+ dev: true
+
+ /aggregate-error@4.0.1:
+ resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==}
+ engines: {node: '>=12'}
+ dependencies:
+ clean-stack: 4.2.0
+ indent-string: 5.0.0
+ dev: true
+
+ /aggregate-error@5.0.0:
+ resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==}
+ engines: {node: '>=18'}
+ dependencies:
+ clean-stack: 5.2.0
+ indent-string: 5.0.0
+ 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
+
+ /ajv@8.12.0:
+ resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+ dev: true
+
+ /ansi-align@3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+
+ /ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.21.3
+ dev: true
+
+ /ansi-escapes@6.2.0:
+ resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ type-fest: 3.13.1
+ dev: true
+
+ /ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /ansi-regex@6.0.1:
+ resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+ 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
+
+ /ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /ansicolors@0.3.2:
+ resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==}
+ dev: true
+
+ /anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+ dev: true
+
+ /argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ /argv-formatter@1.0.0:
+ resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==}
+ 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-ify@1.0.0:
+ resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
+ 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.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
+
+ /astral-regex@2.0.0:
+ resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+ dev: true
+
+ /at-least-node@1.0.0:
+ resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
+ engines: {node: '>= 4.0.0'}
+ dev: true
+
+ /autoprefixer@10.4.16(postcss@8.4.33):
+ resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ browserslist: 4.22.2
+ caniuse-lite: 1.0.30001570
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.0.0
+ postcss: 8.4.33
+ postcss-value-parser: 4.2.0
+ 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
+
+ /balanced-match@2.0.0:
+ resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
+ dev: true
+
+ /base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ dev: true
+
+ /before-after-hook@2.2.3:
+ resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
+ dev: true
+
+ /bidi-js@1.0.3:
+ resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
+ dependencies:
+ require-from-string: 2.0.2
+ dev: true
+
+ /binary-extensions@2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ dev: true
+
+ /boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+ dev: true
+
+ /bottleneck@2.19.5:
+ resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==}
+ dev: true
+
+ /boxen@5.1.2:
+ resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ cli-boxes: 2.2.1
+ string-width: 4.2.3
+ type-fest: 0.20.2
+ widest-line: 3.1.0
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: true
+
+ /brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ dependencies:
+ balanced-match: 1.0.2
+ dev: true
+
+ /braces@3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+ dev: true
+
+ /browserslist@4.22.2:
+ resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001570
+ electron-to-chromium: 1.4.612
+ node-releases: 2.0.14
+ update-browserslist-db: 1.0.13(browserslist@4.22.2)
+ dev: true
+
+ /buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.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
+
+ /c8@9.1.0:
+ resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==}
+ engines: {node: '>=14.14.0'}
+ hasBin: true
+ dependencies:
+ '@bcoe/v8-coverage': 0.2.3
+ '@istanbuljs/schema': 0.1.3
+ find-up: 5.0.0
+ foreground-child: 3.1.1
+ istanbul-lib-coverage: 3.2.2
+ istanbul-lib-report: 3.0.1
+ istanbul-reports: 3.1.6
+ test-exclude: 6.0.0
+ v8-to-istanbul: 9.2.0
+ yargs: 17.7.2
+ yargs-parser: 21.1.1
+ dev: true
+
+ /cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /cachedir@2.3.0:
+ resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==}
+ engines: {node: '>=6'}
+ 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.1.1
+ dev: true
+
+ /callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ requiresBuild: true
+ 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
+
+ /camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /caniuse-lite@1.0.30001570:
+ resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==}
+ dev: true
+
+ /cardinal@2.1.1:
+ resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==}
+ hasBin: true
+ dependencies:
+ ansicolors: 0.3.2
+ redeyed: 2.1.1
+ dev: true
+
+ /chai@4.3.10:
+ resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==}
+ 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@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
+
+ /chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ dev: true
+
+ /char-regex@1.0.2:
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+ dev: false
+
+ /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
+
+ /chokidar@3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
+ /clean-stack@2.2.0:
+ resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /clean-stack@4.2.0:
+ resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==}
+ engines: {node: '>=12'}
+ dependencies:
+ escape-string-regexp: 5.0.0
+ dev: true
+
+ /clean-stack@5.2.0:
+ resolution: {integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ escape-string-regexp: 5.0.0
+ dev: true
+
+ /cli-boxes@2.2.1:
+ resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+ dependencies:
+ restore-cursor: 3.1.0
+ dev: true
+
+ /cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-table3@0.6.3:
+ resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==}
+ engines: {node: 10.* || >= 12.*}
+ dependencies:
+ string-width: 4.2.3
+ optionalDependencies:
+ '@colors/colors': 1.5.0
+ dev: true
+
+ /cli-width@3.0.0:
+ resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+ engines: {node: '>= 10'}
+ 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
+
+ /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
+
+ /colord@2.9.3:
+ resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+ dev: true
+
+ /combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ delayed-stream: 1.0.0
+ dev: true
+
+ /commander@10.0.1:
+ resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+ engines: {node: '>=14'}
+ dev: true
+
+ /commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+ dev: false
+
+ /commander@9.5.0:
+ resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
+ engines: {node: ^12.20.0 || >=14}
+ dev: true
+
+ /commitizen@4.3.0(@types/node@20.11.5)(typescript@5.3.3):
+ resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==}
+ engines: {node: '>= 12'}
+ hasBin: true
+ dependencies:
+ cachedir: 2.3.0
+ cz-conventional-changelog: 3.3.0(@types/node@20.11.5)(typescript@5.3.3)
+ dedent: 0.7.0
+ detect-indent: 6.1.0
+ find-node-modules: 2.1.3
+ find-root: 1.1.0
+ fs-extra: 9.1.0
+ glob: 7.2.3
+ inquirer: 8.2.5
+ is-utf8: 0.2.1
+ lodash: 4.17.21
+ minimist: 1.2.7
+ strip-bom: 4.0.0
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+ dev: true
+
+ /compare-func@2.0.0:
+ resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
+ dependencies:
+ array-ify: 1.0.0
+ dot-prop: 5.3.0
+ dev: true
+
+ /computeds@0.0.1:
+ resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==}
+ dev: true
+
+ /concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ dev: true
+
+ /config-chain@1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+ dev: true
+
+ /conventional-changelog-angular@7.0.0:
+ resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==}
+ engines: {node: '>=16'}
+ dependencies:
+ compare-func: 2.0.0
+ dev: true
+
+ /conventional-changelog-conventionalcommits@7.0.2:
+ resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==}
+ engines: {node: '>=16'}
+ dependencies:
+ compare-func: 2.0.0
+ dev: true
+
+ /conventional-changelog-writer@7.0.1:
+ resolution: {integrity: sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==}
+ engines: {node: '>=16'}
+ hasBin: true
+ dependencies:
+ conventional-commits-filter: 4.0.0
+ handlebars: 4.7.8
+ json-stringify-safe: 5.0.1
+ meow: 12.1.1
+ semver: 7.5.4
+ split2: 4.2.0
+ dev: true
+
+ /conventional-commit-types@3.0.0:
+ resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==}
+ dev: true
+
+ /conventional-commits-filter@4.0.0:
+ resolution: {integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==}
+ engines: {node: '>=16'}
+ dev: true
+
+ /conventional-commits-parser@5.0.0:
+ resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==}
+ engines: {node: '>=16'}
+ hasBin: true
+ dependencies:
+ JSONStream: 1.3.5
+ is-text-path: 2.0.0
+ meow: 12.1.1
+ split2: 4.2.0
+ dev: true
+
+ /convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ dev: true
+
+ /core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+ dev: true
+
+ /cose-base@1.0.3:
+ resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==}
+ dependencies:
+ layout-base: 1.0.2
+ dev: false
+
+ /cose-base@2.2.0:
+ resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==}
+ dependencies:
+ layout-base: 2.0.1
+ dev: false
+
+ /cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.5)(cosmiconfig@8.3.6)(typescript@5.3.3):
+ resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==}
+ engines: {node: '>=v16'}
+ requiresBuild: true
+ peerDependencies:
+ '@types/node': '*'
+ cosmiconfig: '>=8.2'
+ typescript: '>=4'
+ dependencies:
+ '@types/node': 20.11.5
+ cosmiconfig: 8.3.6(typescript@5.3.3)
+ jiti: 1.21.0
+ typescript: 5.3.3
+ dev: true
+
+ /cosmiconfig@8.3.6(typescript@5.3.3):
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ typescript: 5.3.3
+ dev: true
+
+ /cosmiconfig@9.0.0(typescript@5.3.3):
+ resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ env-paths: 2.2.1
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ typescript: 5.3.3
+ dev: true
+
+ /create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+ dev: true
+
+ /cross-env@7.0.3:
+ resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
+ engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
+ hasBin: true
+ dependencies:
+ cross-spawn: 7.0.3
+ 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
+
+ /crypto-random-string@4.0.0:
+ resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==}
+ engines: {node: '>=12'}
+ dependencies:
+ type-fest: 1.4.0
+ dev: true
+
+ /css-functions-list@3.2.1:
+ resolution: {integrity: sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==}
+ engines: {node: '>=12 || >=16'}
+ 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
+
+ /cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /cssstyle@4.0.1:
+ resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ rrweb-cssom: 0.6.0
+ dev: true
+
+ /csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ /cytoscape-cose-bilkent@4.1.0(cytoscape@3.28.0):
+ resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==}
+ peerDependencies:
+ cytoscape: ^3.2.0
+ dependencies:
+ cose-base: 1.0.3
+ cytoscape: 3.28.0
+ dev: false
+
+ /cytoscape-fcose@2.2.0(cytoscape@3.28.0):
+ resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==}
+ peerDependencies:
+ cytoscape: ^3.2.0
+ dependencies:
+ cose-base: 2.2.0
+ cytoscape: 3.28.0
+ dev: false
+
+ /cytoscape@3.28.0:
+ resolution: {integrity: sha512-x7+BHQXN90Audv5xXvdOECmiKuZdeKeoqOmDuYoht4zDKSdObC0Z9AdJXFkXEQvXU8UndI6WnTz47TRI7duReg==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ heap: 0.2.7
+ lodash: 4.17.21
+ dev: false
+
+ /cz-conventional-changelog@3.3.0(@types/node@20.11.5)(typescript@5.3.3):
+ resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==}
+ engines: {node: '>= 10'}
+ dependencies:
+ chalk: 2.4.2
+ commitizen: 4.3.0(@types/node@20.11.5)(typescript@5.3.3)
+ conventional-commit-types: 3.0.0
+ lodash.map: 4.6.0
+ longest: 2.0.1
+ word-wrap: 1.2.5
+ optionalDependencies:
+ '@commitlint/load': 18.4.4(@types/node@20.11.5)(typescript@5.3.3)
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+ dev: true
+
+ /d3-array@2.12.1:
+ resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==}
+ dependencies:
+ internmap: 1.0.1
+ dev: false
+
+ /d3-array@3.2.4:
+ resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
+ engines: {node: '>=12'}
+ dependencies:
+ internmap: 2.0.3
+ dev: false
+
+ /d3-axis@3.0.0:
+ resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-brush@3.0.0:
+ resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+ dev: false
+
+ /d3-chord@3.0.1:
+ resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-path: 3.1.0
+ dev: false
+
+ /d3-color@3.1.0:
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-contour@4.0.2:
+ resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ dev: false
+
+ /d3-delaunay@6.0.4:
+ resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==}
+ engines: {node: '>=12'}
+ dependencies:
+ delaunator: 5.0.0
+ dev: false
+
+ /d3-dispatch@3.0.1:
+ resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-drag@3.0.0:
+ resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-selection: 3.0.0
+ dev: false
+
+ /d3-dsv@3.0.1:
+ resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
+ engines: {node: '>=12'}
+ hasBin: true
+ dependencies:
+ commander: 7.2.0
+ iconv-lite: 0.6.3
+ rw: 1.3.3
+ dev: false
+
+ /d3-ease@3.0.1:
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-fetch@3.0.1:
+ resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dsv: 3.0.1
+ dev: false
+
+ /d3-force@3.0.0:
+ resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-timer: 3.0.1
+ dev: false
+
+ /d3-format@3.1.0:
+ resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-geo@3.1.0:
+ resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ dev: false
+
+ /d3-hierarchy@3.1.2:
+ resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-interpolate@3.0.1:
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-color: 3.1.0
+ dev: false
+
+ /d3-path@1.0.9:
+ resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==}
+ dev: false
+
+ /d3-path@3.1.0:
+ resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-polygon@3.0.1:
+ resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-quadtree@3.0.1:
+ resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-random@3.0.1:
+ resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-sankey@0.12.3:
+ resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==}
+ dependencies:
+ d3-array: 2.12.1
+ d3-shape: 1.3.7
+ dev: false
+
+ /d3-scale-chromatic@3.0.0:
+ resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-color: 3.1.0
+ d3-interpolate: 3.0.1
+ dev: false
+
+ /d3-scale@4.0.2:
+ resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ d3-format: 3.1.0
+ d3-interpolate: 3.0.1
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+ dev: false
+
+ /d3-selection@3.0.0:
+ resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-shape@1.3.7:
+ resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
+ dependencies:
+ d3-path: 1.0.9
+ dev: false
+
+ /d3-shape@3.2.0:
+ resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-path: 3.1.0
+ dev: false
+
+ /d3-time-format@4.1.0:
+ resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-time: 3.1.0
+ dev: false
+
+ /d3-time@3.1.0:
+ resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ dev: false
+
+ /d3-timer@3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-transition@3.0.1(d3-selection@3.0.0):
+ resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ d3-selection: 2 - 3
+ dependencies:
+ d3-color: 3.1.0
+ d3-dispatch: 3.0.1
+ d3-ease: 3.0.1
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-timer: 3.0.1
+ dev: false
+
+ /d3-zoom@3.0.0:
+ resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+ dev: false
+
+ /d3@7.8.5:
+ resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ d3-axis: 3.0.0
+ d3-brush: 3.0.0
+ d3-chord: 3.0.1
+ d3-color: 3.1.0
+ d3-contour: 4.0.2
+ d3-delaunay: 6.0.4
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-dsv: 3.0.1
+ d3-ease: 3.0.1
+ d3-fetch: 3.0.1
+ d3-force: 3.0.0
+ d3-format: 3.1.0
+ d3-geo: 3.1.0
+ d3-hierarchy: 3.1.2
+ d3-interpolate: 3.0.1
+ d3-path: 3.1.0
+ d3-polygon: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-random: 3.0.1
+ d3-scale: 4.0.2
+ d3-scale-chromatic: 3.0.0
+ d3-selection: 3.0.0
+ d3-shape: 3.2.0
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+ d3-timer: 3.0.1
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+ d3-zoom: 3.0.0
+ dev: false
+
+ /dagre-d3-es@7.0.10:
+ resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==}
+ dependencies:
+ d3: 7.8.5
+ lodash-es: 4.17.21
+ dev: false
+
+ /dargs@7.0.0:
+ resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /data-urls@5.0.0:
+ resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
+ engines: {node: '>=18'}
+ dependencies:
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.0.0
+ dev: true
+
+ /dayjs@1.11.10:
+ resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
+ dev: false
+
+ /de-indent@1.0.2:
+ resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+ 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
+
+ /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
+
+ /decimal.js@10.4.3:
+ resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
+ dev: true
+
+ /decode-named-character-reference@1.0.2:
+ resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+ dependencies:
+ character-entities: 2.0.2
+ dev: false
+
+ /dedent@0.7.0:
+ resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
+ dev: true
+
+ /deep-eql@4.1.3:
+ resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
+ engines: {node: '>=6'}
+ dependencies:
+ type-detect: 4.0.8
+ dev: true
+
+ /deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /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-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+ 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
+
+ /delaunator@5.0.0:
+ resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==}
+ dependencies:
+ robust-predicates: 3.0.2
+ dev: false
+
+ /delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /deprecation@2.3.1:
+ resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
+ dev: true
+
+ /dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /detect-file@1.0.0:
+ resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /detect-indent@6.1.0:
+ resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /diff-sequences@29.6.3:
+ resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
+ /diff@5.1.0:
+ resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
+ engines: {node: '>=0.3.1'}
+ dev: false
+
+ /dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: true
+
+ /doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+ dev: true
+
+ /domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+ dev: true
+
+ /domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+ dependencies:
+ domelementtype: 2.3.0
+ dev: true
+
+ /dompurify@3.0.6:
+ resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==}
+ dev: false
+
+ /domutils@3.1.0:
+ resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ dev: true
+
+ /dot-prop@5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-obj: 2.0.0
+ dev: true
+
+ /duplexer2@0.1.4:
+ resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==}
+ dependencies:
+ readable-stream: 2.3.8
+ dev: true
+
+ /eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+ dev: true
+
+ /editorconfig@1.0.4:
+ resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dependencies:
+ '@one-ini/wasm': 0.1.1
+ commander: 10.0.1
+ minimatch: 9.0.1
+ semver: 7.5.4
+ dev: true
+
+ /electron-to-chromium@1.4.612:
+ resolution: {integrity: sha512-dM8BMtXtlH237ecSMnYdYuCkib2QHq0kpWfUnavjdYsyr/6OsAwg5ZGUfnQ9KD1Ga4QgB2sqXlB2NT8zy2GnVg==}
+ dev: true
+
+ /elkjs@0.8.2:
+ resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==}
+ dev: false
+
+ /emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: true
+
+ /emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ dev: true
+
+ /emojilib@2.4.0:
+ resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==}
+ dev: true
+
+ /entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ /env-ci@10.0.0:
+ resolution: {integrity: sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==}
+ engines: {node: ^18.17 || >=20.6.1}
+ dependencies:
+ execa: 8.0.1
+ java-properties: 1.0.2
+ dev: true
+
+ /env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ dependencies:
+ is-arrayish: 0.2.1
+ dev: true
+
+ /es-abstract@1.22.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.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
+ 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.9:
+ resolution: {integrity: sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': 0.19.9
+ '@esbuild/android-arm64': 0.19.9
+ '@esbuild/android-x64': 0.19.9
+ '@esbuild/darwin-arm64': 0.19.9
+ '@esbuild/darwin-x64': 0.19.9
+ '@esbuild/freebsd-arm64': 0.19.9
+ '@esbuild/freebsd-x64': 0.19.9
+ '@esbuild/linux-arm': 0.19.9
+ '@esbuild/linux-arm64': 0.19.9
+ '@esbuild/linux-ia32': 0.19.9
+ '@esbuild/linux-loong64': 0.19.9
+ '@esbuild/linux-mips64el': 0.19.9
+ '@esbuild/linux-ppc64': 0.19.9
+ '@esbuild/linux-riscv64': 0.19.9
+ '@esbuild/linux-s390x': 0.19.9
+ '@esbuild/linux-x64': 0.19.9
+ '@esbuild/netbsd-x64': 0.19.9
+ '@esbuild/openbsd-x64': 0.19.9
+ '@esbuild/sunos-x64': 0.19.9
+ '@esbuild/win32-arm64': 0.19.9
+ '@esbuild/win32-ia32': 0.19.9
+ '@esbuild/win32-x64': 0.19.9
+ 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
+
+ /escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ /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-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.1)(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.1)(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.1(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.1)(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.1(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.1)(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-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.2(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.13
+ '@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.2
+ acorn-jsx: 5.3.2(acorn@8.11.2)
+ 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@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+
+ /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.1.0
+ onetime: 6.0.0
+ signal-exit: 4.1.0
+ strip-final-newline: 3.0.0
+ dev: true
+
+ /expand-tilde@2.0.2:
+ resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ homedir-polyfill: 1.0.3
+ 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
+
+ /fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ 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
+
+ /fastest-levenshtein@1.0.16:
+ resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
+ engines: {node: '>= 4.9.1'}
+ dev: true
+
+ /fastq@1.15.0:
+ resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /fflate@0.8.1:
+ resolution: {integrity: sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==}
+ dev: true
+
+ /figures@2.0.0:
+ resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==}
+ engines: {node: '>=4'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
+ /figures@3.2.0:
+ resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+ engines: {node: '>=8'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
+ /figures@6.0.1:
+ resolution: {integrity: sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ is-unicode-supported: 2.0.0
+ 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
+
+ /file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ flat-cache: 4.0.0
+ dev: true
+
+ /fill-range@7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: true
+
+ /find-node-modules@2.1.3:
+ resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==}
+ dependencies:
+ findup-sync: 4.0.0
+ merge: 2.1.1
+ dev: true
+
+ /find-root@1.1.0:
+ resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+ dev: true
+
+ /find-up-simple@1.0.0:
+ resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /find-up@2.1.0:
+ resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ locate-path: 2.0.0
+ 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-versions@5.1.0:
+ resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==}
+ engines: {node: '>=12'}
+ dependencies:
+ semver-regex: 4.0.5
+ dev: true
+
+ /findup-sync@4.0.0:
+ resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==}
+ engines: {node: '>= 8'}
+ dependencies:
+ detect-file: 1.0.0
+ is-glob: 4.0.3
+ micromatch: 4.0.5
+ resolve-dir: 1.0.1
+ 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
+
+ /flat-cache@4.0.0:
+ resolution: {integrity: sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==}
+ engines: {node: '>=16'}
+ dependencies:
+ flatted: 3.2.9
+ keyv: 4.5.4
+ rimraf: 5.0.5
+ 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
+
+ /foreground-child@3.1.1:
+ resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
+ engines: {node: '>=14'}
+ dependencies:
+ cross-spawn: 7.0.3
+ signal-exit: 4.1.0
+ dev: true
+
+ /form-data@4.0.0:
+ resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+ engines: {node: '>= 6'}
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+ dev: true
+
+ /fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+ dev: true
+
+ /from2@2.3.0:
+ resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==}
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+ dev: true
+
+ /fs-extra@11.2.0:
+ resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+ engines: {node: '>=14.14'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+ dev: true
+
+ /fs-extra@9.1.0:
+ resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ at-least-node: 1.0.0
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+ 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@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /get-stream@7.0.1:
+ resolution: {integrity: sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==}
+ engines: {node: '>=16'}
+ 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
+
+ /git-log-parser@1.2.0:
+ resolution: {integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==}
+ dependencies:
+ argv-formatter: 1.0.0
+ spawn-error-forwarder: 1.0.0
+ split2: 1.0.0
+ stream-combiner2: 1.1.1
+ through2: 2.0.5
+ traverse: 0.6.7
+ dev: true
+
+ /git-raw-commits@2.0.11:
+ resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ dargs: 7.0.0
+ lodash: 4.17.21
+ meow: 8.1.2
+ split2: 3.2.2
+ through2: 4.0.2
+ dev: true
+
+ /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@10.3.10:
+ resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+ dependencies:
+ foreground-child: 3.1.1
+ jackspeak: 2.3.6
+ minimatch: 9.0.3
+ minipass: 7.0.4
+ path-scurry: 1.10.1
+ dev: true
+
+ /glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
+ /global-dirs@0.1.1:
+ resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==}
+ engines: {node: '>=4'}
+ dependencies:
+ ini: 1.3.8
+ dev: true
+
+ /global-modules@1.0.0:
+ resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ global-prefix: 1.0.2
+ is-windows: 1.0.2
+ resolve-dir: 1.0.1
+ dev: true
+
+ /global-modules@2.0.0:
+ resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
+ engines: {node: '>=6'}
+ dependencies:
+ global-prefix: 3.0.0
+ dev: true
+
+ /global-prefix@1.0.2:
+ resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ expand-tilde: 2.0.2
+ homedir-polyfill: 1.0.3
+ ini: 1.3.8
+ is-windows: 1.0.2
+ which: 1.3.1
+ dev: true
+
+ /global-prefix@3.0.0:
+ resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
+ engines: {node: '>=6'}
+ dependencies:
+ ini: 1.3.8
+ kind-of: 6.0.3
+ which: 1.3.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
+
+ /globby@14.0.0:
+ resolution: {integrity: sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@sindresorhus/merge-streams': 1.0.0
+ fast-glob: 3.3.2
+ ignore: 5.3.0
+ path-type: 5.0.0
+ slash: 5.1.0
+ unicorn-magic: 0.1.0
+ dev: true
+
+ /globjoin@0.1.4:
+ resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
+ dev: true
+
+ /gopd@1.0.1:
+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+ dependencies:
+ get-intrinsic: 1.2.2
+ dev: true
+
+ /graceful-fs@4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+ dev: true
+
+ /graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ dev: true
+
+ /graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ dev: true
+
+ /handlebars@4.7.8:
+ resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
+ engines: {node: '>=0.4.7'}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ neo-async: 2.6.2
+ source-map: 0.6.1
+ wordwrap: 1.0.0
+ optionalDependencies:
+ uglify-js: 3.17.4
+ dev: true
+
+ /hard-rejection@2.1.0:
+ resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /has-bigints@1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ dev: true
+
+ /has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /has-property-descriptors@1.0.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
+
+ /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
+
+ /heap@0.2.7:
+ resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==}
+ dev: false
+
+ /homedir-polyfill@1.0.3:
+ resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ parse-passwd: 1.0.0
+ dev: true
+
+ /hook-std@3.0.0:
+ resolution: {integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /hosted-git-info@2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+ dev: true
+
+ /hosted-git-info@4.1.0:
+ resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
+ engines: {node: '>=10'}
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /hosted-git-info@7.0.1:
+ resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ lru-cache: 10.1.0
+ dev: true
+
+ /html-encoding-sniffer@4.0.0:
+ resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ whatwg-encoding: 3.1.1
+ dev: true
+
+ /html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+ dev: true
+
+ /html-format@1.1.6:
+ resolution: {integrity: sha512-Wcp82GgejyxNme62ozXnJ3BnlRlACVthFppGPDvdd7NK4Bn/NXsWndeVVfxA627m18L3KFc84wEvtzczTHT14Q==}
+ dev: false
+
+ /html-tags@3.3.1:
+ resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /htmlparser2@8.0.2:
+ resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ entities: 4.5.0
+ dev: true
+
+ /http-proxy-agent@7.0.0:
+ resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==}
+ engines: {node: '>= 14'}
+ dependencies:
+ agent-base: 7.1.0
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /https-proxy-agent@7.0.2:
+ resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==}
+ engines: {node: '>= 14'}
+ dependencies:
+ agent-base: 7.1.0
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+ 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
+
+ /iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+
+ /ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ dev: true
+
+ /ignore@5.3.0:
+ resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /immutable@4.3.4:
+ resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==}
+ 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-from-esm@1.3.3:
+ resolution: {integrity: sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==}
+ engines: {node: '>=16.20'}
+ dependencies:
+ debug: 4.3.4
+ import-meta-resolve: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /import-meta-resolve@4.0.0:
+ resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==}
+ 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
+
+ /indent-string@5.0.0:
+ resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /index-to-position@0.1.2:
+ resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==}
+ engines: {node: '>=18'}
+ 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
+
+ /ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: true
+
+ /inquirer@8.2.5:
+ resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==}
+ engines: {node: '>=12.0.0'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-width: 3.0.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 0.0.8
+ ora: 5.4.1
+ run-async: 2.4.1
+ rxjs: 7.8.1
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ through: 2.3.8
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /inquirer@8.2.6:
+ resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
+ engines: {node: '>=12.0.0'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-width: 3.0.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 0.0.8
+ ora: 5.4.1
+ run-async: 2.4.1
+ rxjs: 7.8.1
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ through: 2.3.8
+ wrap-ansi: 6.2.0
+ 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
+
+ /internmap@1.0.1:
+ resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==}
+ dev: false
+
+ /internmap@2.0.3:
+ resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /into-stream@7.0.0:
+ resolution: {integrity: sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==}
+ engines: {node: '>=12'}
+ dependencies:
+ from2: 2.3.0
+ p-is-promise: 3.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-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.2.0
+ dev: true
+
+ /is-boolean-object@1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.5
+ has-tostringtag: 1.0.0
+ 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-date-object@1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+ 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-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+ 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@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+ 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@5.0.0:
+ resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-potential-custom-element-name@1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+ dev: true
+
+ /is-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@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+ 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-symbol@1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: true
+
+ /is-text-path@2.0.0:
+ resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==}
+ engines: {node: '>=8'}
+ dependencies:
+ text-extensions: 2.4.0
+ 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-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /is-unicode-supported@2.0.0:
+ resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /is-utf8@0.2.1:
+ resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==}
+ 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
+
+ /is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+ 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
+
+ /issue-parser@6.0.0:
+ resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==}
+ engines: {node: '>=10.13'}
+ dependencies:
+ lodash.capitalize: 4.2.1
+ lodash.escaperegexp: 4.1.2
+ lodash.isplainobject: 4.0.6
+ lodash.isstring: 4.0.1
+ lodash.uniqby: 4.7.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-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
+
+ /jackspeak@2.3.6:
+ resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+ dev: true
+
+ /java-properties@1.0.2:
+ resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==}
+ engines: {node: '>= 0.6.0'}
+ dev: true
+
+ /jiti@1.21.0:
+ resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
+ hasBin: true
+ requiresBuild: true
+ dev: true
+
+ /js-beautify@1.14.11:
+ resolution: {integrity: sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dependencies:
+ config-chain: 1.1.13
+ editorconfig: 1.0.4
+ glob: 10.3.10
+ nopt: 7.2.0
+ dev: true
+
+ /js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ dev: true
+
+ /js-tokens@8.0.2:
+ resolution: {integrity: sha512-Olnt+V7xYdvGze9YTbGFZIfQXuGV4R3nQwwl8BrtgaPE/wq8UFpUHWuTNc05saowhSr1ZO6tx+V6RjE9D5YQog==}
+ dev: true
+
+ /js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: true
+
+ /jsdom@23.2.0:
+ resolution: {integrity: sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ canvas: ^2.11.2
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+ dependencies:
+ '@asamuzakjp/dom-selector': 2.0.2
+ cssstyle: 4.0.1
+ data-urls: 5.0.0
+ decimal.js: 10.4.3
+ form-data: 4.0.0
+ html-encoding-sniffer: 4.0.0
+ http-proxy-agent: 7.0.0
+ https-proxy-agent: 7.0.2
+ is-potential-custom-element-name: 1.0.1
+ parse5: 7.1.2
+ rrweb-cssom: 0.6.0
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 4.1.3
+ w3c-xmlserializer: 5.0.0
+ webidl-conversions: 7.0.0
+ whatwg-encoding: 3.1.1
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.0.0
+ ws: 8.16.0
+ xml-name-validator: 5.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+ dev: true
+
+ /json-parse-better-errors@1.0.2:
+ resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
+ dev: true
+
+ /json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+ dev: true
+
+ /json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: true
+
+ /json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ requiresBuild: true
+ dev: true
+
+ /json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
+
+ /json-stringify-safe@5.0.1:
+ resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+ dev: true
+
+ /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@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: true
+
+ /jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+ dev: true
+
+ /keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ dependencies:
+ json-buffer: 3.0.1
+ dev: true
+
+ /khroma@2.1.0:
+ resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
+ dev: false
+
+ /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: false
+
+ /known-css-properties@0.29.0:
+ resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==}
+ dev: true
+
+ /layout-base@1.0.2:
+ resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==}
+ dev: false
+
+ /layout-base@2.0.1:
+ resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==}
+ dev: false
+
+ /levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ dev: true
+
+ /linkify-it@5.0.0:
+ resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
+ dependencies:
+ uc.micro: 2.0.0
+
+ /load-json-file@4.0.0:
+ resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
+ engines: {node: '>=4'}
+ dependencies:
+ graceful-fs: 4.2.11
+ parse-json: 4.0.0
+ pify: 3.0.0
+ strip-bom: 3.0.0
+ dev: true
+
+ /local-pkg@0.5.0:
+ resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
+ engines: {node: '>=14'}
+ dependencies:
+ mlly: 1.4.2
+ pkg-types: 1.0.3
+ dev: true
+
+ /locate-path@2.0.0:
+ resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==}
+ engines: {node: '>=4'}
+ dependencies:
+ p-locate: 2.0.0
+ path-exists: 3.0.0
+ 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-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+ /lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+ dev: true
+
+ /lodash.capitalize@4.2.1:
+ resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==}
+ dev: true
+
+ /lodash.escaperegexp@4.1.2:
+ resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==}
+ dev: true
+
+ /lodash.isfunction@3.0.9:
+ resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==}
+ dev: true
+
+ /lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+ dev: true
+
+ /lodash.isstring@4.0.1:
+ resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
+ dev: true
+
+ /lodash.kebabcase@4.1.1:
+ resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
+ dev: true
+
+ /lodash.map@4.6.0:
+ resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==}
+ dev: true
+
+ /lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
+
+ /lodash.mergewith@4.6.2:
+ resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==}
+ requiresBuild: true
+ dev: true
+
+ /lodash.snakecase@4.1.1:
+ resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
+ dev: true
+
+ /lodash.startcase@4.4.0:
+ resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
+ dev: true
+
+ /lodash.truncate@4.4.2:
+ resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+ dev: true
+
+ /lodash.uniq@4.5.0:
+ resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+ requiresBuild: true
+ dev: true
+
+ /lodash.uniqby@4.7.0:
+ resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==}
+ dev: true
+
+ /lodash.upperfirst@4.3.1:
+ resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==}
+ dev: true
+
+ /lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ /log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+ dev: true
+
+ /longest@2.0.1:
+ resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /loupe@2.3.7:
+ resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+ dependencies:
+ get-func-name: 2.0.2
+ dev: true
+
+ /lru-cache@10.1.0:
+ resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==}
+ engines: {node: 14 || >=16.14}
+ 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
+
+ /make-dir@4.0.0:
+ resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+ engines: {node: '>=10'}
+ dependencies:
+ semver: 7.5.4
+ dev: true
+
+ /make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ 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
+
+ /markdown-it-abbr@2.0.0:
+ resolution: {integrity: sha512-of7C8pXSjXjDojW4neNP+jD7inUYH/DO0Ca+K/4FUEccg0oHAEX/nfscw0jfz66PJbYWOAT9U8mjO21X5p6aAw==}
+ dev: false
+
+ /markdown-it-anchor@8.6.7(@types/markdown-it@13.0.7)(markdown-it@14.0.0):
+ resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==}
+ peerDependencies:
+ '@types/markdown-it': '*'
+ markdown-it: '*'
+ dependencies:
+ '@types/markdown-it': 13.0.7
+ markdown-it: 14.0.0
+ dev: false
+
+ /markdown-it-attrs@4.1.6(markdown-it@14.0.0):
+ resolution: {integrity: sha512-O7PDKZlN8RFMyDX13JnctQompwrrILuz2y43pW2GagcwpIIElkAdfeek+erHfxUOlXWPsjFeWmZ8ch1xtRLWpA==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ markdown-it: '>= 9.0.0'
+ dependencies:
+ markdown-it: 14.0.0
+ dev: false
+
+ /markdown-it-deflist@3.0.0:
+ resolution: {integrity: sha512-OxPmQ/keJZwbubjiQWOvKLHwpV2wZ5I3Smc81OjhwbfJsjdRrvD5aLTQxmZzzePeO0kbGzAo3Krk4QLgA8PWLg==}
+ dev: false
+
+ /markdown-it-emoji@3.0.0:
+ resolution: {integrity: sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==}
+ dev: false
+
+ /markdown-it-footnote@4.0.0:
+ resolution: {integrity: sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==}
+ dev: false
+
+ /markdown-it-ins@4.0.0:
+ resolution: {integrity: sha512-sWbjK2DprrkINE4oYDhHdCijGT+MIDhEupjSHLXe5UXeVr5qmVxs/nTUVtgi0Oh/qtF+QKV0tNWDhQBEPxiMew==}
+ dev: false
+
+ /markdown-it-mark@4.0.0:
+ resolution: {integrity: sha512-YLhzaOsU9THO/cal0lUjfMjrqSMPjjyjChYM7oyj4DnyaXEzA8gnW6cVJeyCrCVeyesrY2PlEdUYJSPFYL4Nkg==}
+ dev: false
+
+ /markdown-it-shikiji@0.9.19:
+ resolution: {integrity: sha512-AjGg991Tge1VbQb4whEvJ0Xa8Dopjowd0Mxy0ntzkCAuRwjNUhriGqu0AZEjM8Caab5+324VD8eEkPD7ihUIMA==}
+ dependencies:
+ markdown-it: 14.0.0
+ shikiji: 0.9.19
+ dev: true
+
+ /markdown-it-sub@2.0.0:
+ resolution: {integrity: sha512-iCBKgwCkfQBRg2vApy9vx1C1Tu6D8XYo8NvevI3OlwzBRmiMtsJ2sXupBgEA7PPxiDwNni3qIUkhZ6j5wofDUA==}
+ dev: false
+
+ /markdown-it-sup@2.0.0:
+ resolution: {integrity: sha512-5VgmdKlkBd8sgXuoDoxMpiU+BiEt3I49GItBzzw7Mxq9CxvnhE/k09HFli09zgfFDRixDQDfDxi0mgBCXtaTvA==}
+ dev: false
+
+ /markdown-it-task-lists@2.1.1:
+ resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==}
+ dev: false
+
+ /markdown-it-textual-uml@0.17.1:
+ resolution: {integrity: sha512-Ym/xQ4TV4N3eiRMVoiKBCCMmWXSvc9WdWpWi5m+5JBQVukY+D7tPbuR4LcdKEJ9vFch/XlDefifyRheirqlRqQ==}
+ dependencies:
+ mermaid: 10.6.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /markdown-it@14.0.0:
+ resolution: {integrity: sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ entities: 4.5.0
+ linkify-it: 5.0.0
+ mdurl: 2.0.0
+ punycode.js: 2.3.1
+ uc.micro: 2.0.0
+
+ /marked-terminal@6.2.0(marked@9.1.6):
+ resolution: {integrity: sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ marked: '>=1 <12'
+ dependencies:
+ ansi-escapes: 6.2.0
+ cardinal: 2.1.1
+ chalk: 5.3.0
+ cli-table3: 0.6.3
+ marked: 9.1.6
+ node-emoji: 2.1.3
+ supports-hyperlinks: 3.0.0
+ dev: true
+
+ /marked@9.1.6:
+ resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==}
+ engines: {node: '>= 16'}
+ hasBin: true
+ dev: true
+
+ /mathml-tag-names@2.1.3:
+ resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
+ dev: true
+
+ /mdast-util-from-markdown@1.3.1:
+ resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.10
+ decode-named-character-reference: 1.0.2
+ mdast-util-to-string: 3.2.0
+ micromark: 3.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-decode-string: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ unist-util-stringify-position: 3.0.3
+ uvu: 0.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-to-string@3.2.0:
+ resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ dev: false
+
+ /mdn-data@2.0.30:
+ resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+ dev: true
+
+ /mdurl@2.0.0:
+ resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
+
+ /meow@12.1.1:
+ resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
+ engines: {node: '>=16.10'}
+ dev: true
+
+ /meow@13.1.0:
+ resolution: {integrity: sha512-o5R/R3Tzxq0PJ3v3qcQJtSvSE9nKOLSAaDuuoMzDVuGTwHdccMWcYomh9Xolng2tjT6O/Y83d+0coVGof6tqmA==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /meow@8.1.2:
+ resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==}
+ engines: {node: '>=10'}
+ 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: 3.0.3
+ read-pkg-up: 7.0.1
+ redent: 3.0.0
+ trim-newlines: 3.0.1
+ type-fest: 0.18.1
+ yargs-parser: 20.2.9
+ dev: true
+
+ /merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /merge@2.1.1:
+ resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==}
+ dev: true
+
+ /mermaid@10.6.1:
+ resolution: {integrity: sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A==}
+ dependencies:
+ '@braintree/sanitize-url': 6.0.4
+ '@types/d3-scale': 4.0.8
+ '@types/d3-scale-chromatic': 3.0.3
+ cytoscape: 3.28.0
+ cytoscape-cose-bilkent: 4.1.0(cytoscape@3.28.0)
+ cytoscape-fcose: 2.2.0(cytoscape@3.28.0)
+ d3: 7.8.5
+ d3-sankey: 0.12.3
+ dagre-d3-es: 7.0.10
+ dayjs: 1.11.10
+ dompurify: 3.0.6
+ elkjs: 0.8.2
+ khroma: 2.1.0
+ lodash-es: 4.17.21
+ mdast-util-from-markdown: 1.3.1
+ non-layered-tidy-tree-layout: 2.0.2
+ stylis: 4.3.0
+ ts-dedent: 2.2.0
+ uuid: 9.0.1
+ web-worker: 1.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /micromark-core-commonmark@1.1.0:
+ resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==}
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-factory-destination: 1.1.0
+ micromark-factory-label: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-factory-title: 1.1.0
+ micromark-factory-whitespace: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-classify-character: 1.1.0
+ micromark-util-html-tag-name: 1.2.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-factory-destination@1.1.0:
+ resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-label@1.1.0:
+ resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-factory-space@1.1.0:
+ resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-title@1.1.0:
+ resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==}
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-whitespace@1.1.0:
+ resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==}
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-character@1.2.0:
+ resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-chunked@1.1.0:
+ resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-classify-character@1.1.0:
+ resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-combine-extensions@1.1.0:
+ resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==}
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-decode-numeric-character-reference@1.1.0:
+ resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-decode-string@1.1.0:
+ resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==}
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-util-character: 1.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-encode@1.1.0:
+ resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==}
+ dev: false
+
+ /micromark-util-html-tag-name@1.2.0:
+ resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==}
+ dev: false
+
+ /micromark-util-normalize-identifier@1.1.0:
+ resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-resolve-all@1.1.0:
+ resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==}
+ dependencies:
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-sanitize-uri@1.2.0:
+ resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-encode: 1.1.0
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-subtokenize@1.1.0:
+ resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==}
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-util-symbol@1.1.0:
+ resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==}
+ dev: false
+
+ /micromark-util-types@1.1.0:
+ resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==}
+ dev: false
+
+ /micromark@3.2.0:
+ resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.3.4
+ decode-named-character-reference: 1.0.2
+ micromark-core-commonmark: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-combine-extensions: 1.1.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-encode: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /micromatch@4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+ dev: true
+
+ /mime@4.0.0:
+ resolution: {integrity: sha512-pzhgdeqU5pJ9t5WK9m4RT4GgGWqYJylxUf62Yb9datXRwdcw5MjiD1BYI5evF8AgTXN9gtKX3CFLvCUL5fAhEA==}
+ engines: {node: '>=16'}
+ hasBin: true
+ dev: true
+
+ /mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+ 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.1:
+ resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ brace-expansion: 2.0.1
+ 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.7:
+ resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
+ dev: true
+
+ /minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ dev: true
+
+ /minipass@7.0.4:
+ resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dev: true
+
+ /mlly@1.4.2:
+ resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==}
+ dependencies:
+ acorn: 8.11.2
+ pathe: 1.1.1
+ pkg-types: 1.0.3
+ ufo: 1.3.2
+ dev: true
+
+ /mri@1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /mrmime@2.0.0:
+ resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ /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
+
+ /mute-stream@0.0.8:
+ resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+ dev: true
+
+ /mylas@2.1.13:
+ resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==}
+ engines: {node: '>=12.0.0'}
+ dev: true
+
+ /nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ /natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
+
+ /neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+ dev: true
+
+ /nerf-dart@1.0.0:
+ resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==}
+ dev: true
+
+ /node-emoji@2.1.3:
+ resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@sindresorhus/is': 4.6.0
+ char-regex: 1.0.2
+ emojilib: 2.4.0
+ skin-tone: 2.0.0
+ dev: true
+
+ /node-releases@2.0.14:
+ resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
+ dev: true
+
+ /non-layered-tidy-tree-layout@2.0.2:
+ resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==}
+ dev: false
+
+ /nopt@7.2.0:
+ resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ hasBin: true
+ dependencies:
+ abbrev: 2.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
+
+ /normalize-package-data@3.0.3:
+ resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
+ engines: {node: '>=10'}
+ dependencies:
+ hosted-git-info: 4.1.0
+ is-core-module: 2.13.1
+ semver: 7.5.4
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-package-data@6.0.0:
+ resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ hosted-git-info: 7.0.1
+ is-core-module: 2.13.1
+ semver: 7.5.4
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize-url@8.0.0:
+ resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+
+ /npm-run-path@5.1.0:
+ resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ path-key: 4.0.0
+ dev: true
+
+ /npm@10.2.5:
+ resolution: {integrity: sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+ hasBin: true
+ dev: true
+ bundledDependencies:
+ - '@isaacs/string-locale-compare'
+ - '@npmcli/arborist'
+ - '@npmcli/config'
+ - '@npmcli/fs'
+ - '@npmcli/map-workspaces'
+ - '@npmcli/package-json'
+ - '@npmcli/promise-spawn'
+ - '@npmcli/run-script'
+ - '@sigstore/tuf'
+ - abbrev
+ - archy
+ - cacache
+ - chalk
+ - ci-info
+ - cli-columns
+ - cli-table3
+ - columnify
+ - fastest-levenshtein
+ - fs-minipass
+ - glob
+ - graceful-fs
+ - hosted-git-info
+ - ini
+ - init-package-json
+ - is-cidr
+ - json-parse-even-better-errors
+ - libnpmaccess
+ - libnpmdiff
+ - libnpmexec
+ - libnpmfund
+ - libnpmhook
+ - libnpmorg
+ - libnpmpack
+ - libnpmpublish
+ - libnpmsearch
+ - libnpmteam
+ - libnpmversion
+ - make-fetch-happen
+ - minimatch
+ - minipass
+ - minipass-pipeline
+ - ms
+ - node-gyp
+ - nopt
+ - normalize-package-data
+ - npm-audit-report
+ - npm-install-checks
+ - npm-package-arg
+ - npm-pick-manifest
+ - npm-profile
+ - npm-registry-fetch
+ - npm-user-validate
+ - npmlog
+ - p-map
+ - pacote
+ - parse-conflict-json
+ - proc-log
+ - qrcode-terminal
+ - read
+ - semver
+ - spdx-expression-parse
+ - ssri
+ - strip-ansi
+ - supports-color
+ - tar
+ - text-table
+ - tiny-relative-date
+ - treeverse
+ - validate-npm-package-name
+ - which
+ - write-file-atomic
+
+ /nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+ dependencies:
+ boolbase: 1.0.0
+ dev: true
+
+ /object-inspect@1.13.1:
+ resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
+ dev: true
+
+ /object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /object.assign@4.1.5:
+ resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.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.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@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+ 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
+
+ /open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.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
+
+ /ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.2
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+ dev: true
+
+ /os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /p-each-series@3.0.0:
+ resolution: {integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /p-filter@3.0.0:
+ resolution: {integrity: sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ p-map: 5.5.0
+ dev: true
+
+ /p-is-promise@3.0.0:
+ resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /p-limit@1.3.0:
+ resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==}
+ engines: {node: '>=4'}
+ dependencies:
+ p-try: 1.0.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@2.0.0:
+ resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==}
+ engines: {node: '>=4'}
+ dependencies:
+ p-limit: 1.3.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@5.5.0:
+ resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==}
+ engines: {node: '>=12'}
+ dependencies:
+ aggregate-error: 4.0.1
+ dev: true
+
+ /p-reduce@2.1.0:
+ resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /p-reduce@3.0.0:
+ resolution: {integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /p-try@1.0.0:
+ resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==}
+ engines: {node: '>=4'}
+ 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'}
+ requiresBuild: true
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /parse-json@4.0.0:
+ resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
+ engines: {node: '>=4'}
+ dependencies:
+ error-ex: 1.3.2
+ json-parse-better-errors: 1.0.2
+ dev: true
+
+ /parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/code-frame': 7.23.5
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+ dev: true
+
+ /parse-json@8.1.0:
+ resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@babel/code-frame': 7.23.5
+ index-to-position: 0.1.2
+ type-fest: 4.8.3
+ dev: true
+
+ /parse-passwd@1.0.0:
+ resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /parse5@7.1.2:
+ resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
+ dependencies:
+ entities: 4.5.0
+ dev: true
+
+ /path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+ dev: true
+
+ /path-exists@3.0.0:
+ resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-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-scurry@1.10.1:
+ resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ lru-cache: 10.1.0
+ minipass: 7.0.4
+ dev: true
+
+ /path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-type@5.0.0:
+ resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /pathe@1.1.1:
+ resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==}
+ 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@3.0.0:
+ resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /pkg-conf@2.1.0:
+ resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==}
+ engines: {node: '>=4'}
+ dependencies:
+ find-up: 2.1.0
+ load-json-file: 4.0.0
+ dev: true
+
+ /pkg-types@1.0.3:
+ resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+ dependencies:
+ jsonc-parser: 3.2.0
+ mlly: 1.4.2
+ pathe: 1.1.1
+ dev: true
+
+ /plimit-lit@1.6.1:
+ resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==}
+ engines: {node: '>=12'}
+ dependencies:
+ queue-lit: 1.5.2
+ dev: true
+
+ /postcss-html@1.6.0:
+ resolution: {integrity: sha512-OWgQ9/Pe23MnNJC0PL4uZp8k0EDaUvqpJFSiwFxOLClAhmD7UEisyhO3x5hVsD4xFrjReVTXydlrMes45dJ71w==}
+ engines: {node: ^12 || >=14}
+ dependencies:
+ htmlparser2: 8.0.2
+ js-tokens: 8.0.2
+ postcss: 8.4.33
+ postcss-safe-parser: 6.0.0(postcss@8.4.33)
+ dev: true
+
+ /postcss-media-query-parser@0.2.3:
+ resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
+ dev: true
+
+ /postcss-resolve-nested-selector@0.1.1:
+ resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==}
+ dev: true
+
+ /postcss-safe-parser@6.0.0(postcss@8.4.33):
+ resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.3.3
+ dependencies:
+ postcss: 8.4.33
+ dev: true
+
+ /postcss-safe-parser@7.0.0(postcss@8.4.33):
+ resolution: {integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ postcss: ^8.4.31
+ dependencies:
+ postcss: 8.4.33
+ dev: true
+
+ /postcss-scss@4.0.9(postcss@8.4.33):
+ resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.4.29
+ dependencies:
+ postcss: 8.4.33
+ 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-sorting@8.0.2(postcss@8.4.33):
+ resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==}
+ peerDependencies:
+ postcss: ^8.4.20
+ dependencies:
+ postcss: 8.4.33
+ dev: true
+
+ /postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+ 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
+
+ /prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+ 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
+
+ /process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+ dev: true
+
+ /proto-list@1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+ dev: true
+
+ /psl@1.9.0:
+ resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
+ dev: true
+
+ /punycode.js@2.3.1:
+ resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
+ engines: {node: '>=6'}
+
+ /punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /querystringify@2.2.0:
+ resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+ dev: true
+
+ /queue-lit@1.5.2:
+ resolution: {integrity: sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==}
+ engines: {node: '>=12'}
+ 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
+
+ /rc@1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+ dev: true
+
+ /react-is@18.2.0:
+ resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+ dev: true
+
+ /read-pkg-up@11.0.0:
+ resolution: {integrity: sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==}
+ engines: {node: '>=18'}
+ deprecated: Renamed to read-package-up
+ dependencies:
+ find-up-simple: 1.0.0
+ read-pkg: 9.0.1
+ type-fest: 4.8.3
+ 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-pkg@9.0.1:
+ resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@types/normalize-package-data': 2.4.4
+ normalize-package-data: 6.0.0
+ parse-json: 8.1.0
+ type-fest: 4.8.3
+ unicorn-magic: 0.1.0
+ dev: true
+
+ /readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+ 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
+
+ /readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ 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
+
+ /redeyed@2.1.1:
+ resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==}
+ dependencies:
+ esprima: 4.0.1
+ 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
+
+ /registry-auth-token@5.0.2:
+ resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@pnpm/npm-conf': 2.2.2
+ dev: true
+
+ /require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+ requiresBuild: true
+ dev: true
+
+ /requires-port@1.0.0:
+ resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+ dev: true
+
+ /resolve-dir@1.0.1:
+ resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ expand-tilde: 2.0.2
+ global-modules: 1.0.0
+ dev: true
+
+ /resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ requiresBuild: true
+ dev: true
+
+ /resolve-from@5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /resolve-global@1.0.0:
+ resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==}
+ engines: {node: '>=8'}
+ dependencies:
+ global-dirs: 0.1.1
+ dev: true
+
+ /resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+ dev: true
+
+ /resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.13.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ dev: true
+
+ /reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /right-pad@1.0.1:
+ resolution: {integrity: sha512-bYBjgxmkvTAfgIYy328fmkwhp39v8lwVgWhhrzxPV3yHtcSqyYKe9/XOhvW48UFjATg3VuJbpsp5822ACNvkmw==}
+ engines: {node: '>= 0.10'}
+ dev: true
+
+ /rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rimraf@5.0.5:
+ resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dependencies:
+ glob: 10.3.10
+ dev: true
+
+ /robust-predicates@3.0.2:
+ resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
+ dev: false
+
+ /rollup-plugin-visualizer@5.12.0:
+ resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+ peerDependencies:
+ rollup: 2.x || 3.x || 4.x
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ dependencies:
+ open: 8.4.2
+ picomatch: 2.3.1
+ source-map: 0.7.4
+ yargs: 17.7.2
+ dev: true
+
+ /rollup@4.9.0:
+ resolution: {integrity: sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.9.0
+ '@rollup/rollup-android-arm64': 4.9.0
+ '@rollup/rollup-darwin-arm64': 4.9.0
+ '@rollup/rollup-darwin-x64': 4.9.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.9.0
+ '@rollup/rollup-linux-arm64-gnu': 4.9.0
+ '@rollup/rollup-linux-arm64-musl': 4.9.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.9.0
+ '@rollup/rollup-linux-x64-gnu': 4.9.0
+ '@rollup/rollup-linux-x64-musl': 4.9.0
+ '@rollup/rollup-win32-arm64-msvc': 4.9.0
+ '@rollup/rollup-win32-ia32-msvc': 4.9.0
+ '@rollup/rollup-win32-x64-msvc': 4.9.0
+ fsevents: 2.3.3
+ dev: true
+
+ /rrweb-cssom@0.6.0:
+ resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
+ dev: true
+
+ /run-async@2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /rw@1.3.3:
+ resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
+ dev: false
+
+ /rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+ dependencies:
+ tslib: 2.6.2
+ dev: true
+
+ /sade@1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+ dependencies:
+ mri: 1.2.0
+ dev: false
+
+ /safe-array-concat@1.0.1:
+ resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
+ 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.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+ dev: true
+
+ /safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: true
+
+ /safe-regex-test@1.0.0:
+ resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+ dependencies:
+ call-bind: 1.0.5
+ get-intrinsic: 1.2.2
+ is-regex: 1.1.4
+ dev: true
+
+ /safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ /sass@1.69.7:
+ resolution: {integrity: sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+ dependencies:
+ chokidar: 3.5.3
+ immutable: 4.3.4
+ source-map-js: 1.0.2
+ dev: true
+
+ /saxes@6.0.0:
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
+ dependencies:
+ xmlchars: 2.2.0
+ dev: true
+
+ /semantic-release@22.0.12(typescript@5.3.3):
+ resolution: {integrity: sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==}
+ engines: {node: ^18.17 || >=20.6.1}
+ hasBin: true
+ dependencies:
+ '@semantic-release/commit-analyzer': 11.1.0(semantic-release@22.0.12)
+ '@semantic-release/error': 4.0.0
+ '@semantic-release/github': 9.2.5(semantic-release@22.0.12)
+ '@semantic-release/npm': 11.0.2(semantic-release@22.0.12)
+ '@semantic-release/release-notes-generator': 12.1.0(semantic-release@22.0.12)
+ aggregate-error: 5.0.0
+ cosmiconfig: 8.3.6(typescript@5.3.3)
+ debug: 4.3.4
+ env-ci: 10.0.0
+ execa: 8.0.1
+ figures: 6.0.1
+ find-versions: 5.1.0
+ get-stream: 6.0.1
+ git-log-parser: 1.2.0
+ hook-std: 3.0.0
+ hosted-git-info: 7.0.1
+ import-from-esm: 1.3.3
+ lodash-es: 4.17.21
+ marked: 9.1.6
+ marked-terminal: 6.2.0(marked@9.1.6)
+ micromatch: 4.0.5
+ p-each-series: 3.0.0
+ p-reduce: 3.0.0
+ read-pkg-up: 11.0.0
+ resolve-from: 5.0.0
+ semver: 7.5.4
+ semver-diff: 4.0.0
+ signale: 1.4.0
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /semver-diff@4.0.0:
+ resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==}
+ engines: {node: '>=12'}
+ dependencies:
+ semver: 7.5.4
+ dev: true
+
+ /semver-regex@4.0.5:
+ resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==}
+ engines: {node: '>=12'}
+ 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-function-length@1.1.1:
+ resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.1
+ 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
+
+ /shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /shikiji-core@0.9.19:
+ resolution: {integrity: sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw==}
+ dev: true
+
+ /shikiji@0.9.19:
+ resolution: {integrity: sha512-Kw2NHWktdcdypCj1GkKpXH4o6Vxz8B8TykPlPuLHOGSV8VkhoCLcFOH4k19K4LXAQYRQmxg+0X/eM+m2sLhAkg==}
+ dependencies:
+ shikiji-core: 0.9.19
+ 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
+
+ /signale@1.4.0:
+ resolution: {integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==}
+ engines: {node: '>=6'}
+ dependencies:
+ chalk: 2.4.2
+ figures: 2.0.0
+ pkg-conf: 2.1.0
+ 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
+
+ /skin-tone@2.0.0:
+ resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==}
+ engines: {node: '>=8'}
+ dependencies:
+ unicode-emoji-modifier-base: 1.0.0
+ dev: true
+
+ /slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /slash@5.1.0:
+ resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /slice-ansi@4.0.0:
+ resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+ dev: true
+
+ /source-map-js@1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /spawn-error-forwarder@1.0.0:
+ resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==}
+ 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
+
+ /split2@1.0.0:
+ resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==}
+ dependencies:
+ through2: 2.0.5
+ dev: true
+
+ /split2@3.2.2:
+ resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==}
+ dependencies:
+ readable-stream: 3.6.2
+ dev: true
+
+ /split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+ dev: true
+
+ /stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+ dev: true
+
+ /std-env@3.6.0:
+ resolution: {integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==}
+ dev: true
+
+ /stream-combiner2@1.1.1:
+ resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==}
+ dependencies:
+ duplexer2: 0.1.4
+ readable-stream: 2.3.8
+ dev: true
+
+ /string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+ dev: true
+
+ /string.prototype.trim@1.2.8:
+ resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.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.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+ dependencies:
+ safe-buffer: 5.1.2
+ 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@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+ dev: true
+
+ /strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-regex: 6.0.1
+ dev: true
+
+ /strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /strip-bom@4.0.0:
+ resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /strip-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@2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /strip-literal@1.3.0:
+ resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==}
+ dependencies:
+ acorn: 8.11.2
+ dev: true
+
+ /stylelint-config-html@1.1.0(postcss-html@1.6.0)(stylelint@16.1.0):
+ resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==}
+ engines: {node: ^12 || >=14}
+ peerDependencies:
+ postcss-html: ^1.0.0
+ stylelint: '>=14.0.0'
+ dependencies:
+ postcss-html: 1.6.0
+ stylelint: 16.1.0(typescript@5.3.3)
+ dev: true
+
+ /stylelint-config-recommended-scss@14.0.0(postcss@8.4.33)(stylelint@16.1.0):
+ resolution: {integrity: sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ postcss: ^8.3.3
+ stylelint: ^16.0.2
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ dependencies:
+ postcss: 8.4.33
+ postcss-scss: 4.0.9(postcss@8.4.33)
+ stylelint: 16.1.0(typescript@5.3.3)
+ stylelint-config-recommended: 14.0.0(stylelint@16.1.0)
+ stylelint-scss: 6.0.0(stylelint@16.1.0)
+ dev: true
+
+ /stylelint-config-recommended-vue@1.5.0(postcss-html@1.6.0)(stylelint@16.1.0):
+ resolution: {integrity: sha512-65TAK/clUqkNtkZLcuytoxU0URQYlml+30Nhop7sRkCZ/mtWdXt7T+spPSB3KMKlb+82aEVJ4OrcstyDBdbosg==}
+ engines: {node: ^12 || >=14}
+ peerDependencies:
+ postcss-html: ^1.0.0
+ stylelint: '>=14.0.0'
+ dependencies:
+ postcss-html: 1.6.0
+ semver: 7.5.4
+ stylelint: 16.1.0(typescript@5.3.3)
+ stylelint-config-html: 1.1.0(postcss-html@1.6.0)(stylelint@16.1.0)
+ stylelint-config-recommended: 14.0.0(stylelint@16.1.0)
+ dev: true
+
+ /stylelint-config-recommended@14.0.0(stylelint@16.1.0):
+ resolution: {integrity: sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ stylelint: ^16.0.0
+ dependencies:
+ stylelint: 16.1.0(typescript@5.3.3)
+ dev: true
+
+ /stylelint-order@6.0.4(stylelint@16.1.0):
+ resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==}
+ peerDependencies:
+ stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1
+ dependencies:
+ postcss: 8.4.33
+ postcss-sorting: 8.0.2(postcss@8.4.33)
+ stylelint: 16.1.0(typescript@5.3.3)
+ dev: true
+
+ /stylelint-scss@6.0.0(stylelint@16.1.0):
+ resolution: {integrity: sha512-N1xV/Ef5PNRQQt9E45unzGvBUN1KZxCI8B4FgN/pMfmyRYbZGVN4y9qWlvOMdScU17c8VVCnjIHTVn38Bb6qSA==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ stylelint: ^16.0.2
+ dependencies:
+ known-css-properties: 0.29.0
+ postcss-media-query-parser: 0.2.3
+ postcss-resolve-nested-selector: 0.1.1
+ postcss-selector-parser: 6.0.15
+ postcss-value-parser: 4.2.0
+ stylelint: 16.1.0(typescript@5.3.3)
+ dev: true
+
+ /stylelint@16.1.0(typescript@5.3.3):
+ resolution: {integrity: sha512-Sh1rRV0lN1qxz/QsuuooLWsIZ/ona7NKw/fRZd6y6PyXYdD2W0EAzJ8yJcwSx4Iw/muz0CF09VZ+z4EiTAcKmg==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
+ dependencies:
+ '@csstools/css-parser-algorithms': 2.5.0(@csstools/css-tokenizer@2.2.3)
+ '@csstools/css-tokenizer': 2.2.3
+ '@csstools/media-query-list-parser': 2.1.7(@csstools/css-parser-algorithms@2.5.0)(@csstools/css-tokenizer@2.2.3)
+ '@csstools/selector-specificity': 3.0.1(postcss-selector-parser@6.0.15)
+ balanced-match: 2.0.0
+ colord: 2.9.3
+ cosmiconfig: 9.0.0(typescript@5.3.3)
+ css-functions-list: 3.2.1
+ css-tree: 2.3.1
+ debug: 4.3.4
+ fast-glob: 3.3.2
+ fastest-levenshtein: 1.0.16
+ file-entry-cache: 8.0.0
+ global-modules: 2.0.0
+ globby: 11.1.0
+ globjoin: 0.1.4
+ html-tags: 3.3.1
+ ignore: 5.3.0
+ imurmurhash: 0.1.4
+ is-plain-object: 5.0.0
+ known-css-properties: 0.29.0
+ mathml-tag-names: 2.1.3
+ meow: 13.1.0
+ micromatch: 4.0.5
+ normalize-path: 3.0.0
+ picocolors: 1.0.0
+ postcss: 8.4.33
+ postcss-resolve-nested-selector: 0.1.1
+ postcss-safe-parser: 7.0.0(postcss@8.4.33)
+ postcss-selector-parser: 6.0.15
+ postcss-value-parser: 4.2.0
+ resolve-from: 5.0.0
+ string-width: 4.2.3
+ strip-ansi: 7.1.0
+ supports-hyperlinks: 3.0.0
+ svg-tags: 1.0.0
+ table: 6.8.1
+ write-file-atomic: 5.0.1
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /stylis@4.3.0:
+ resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==}
+ dev: false
+
+ /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-hyperlinks@3.0.0:
+ resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==}
+ engines: {node: '>=14.18'}
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+ dev: true
+
+ /supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /svg-tags@1.0.0:
+ resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
+ dev: true
+
+ /symbol-tree@3.2.4:
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+ dev: true
+
+ /table@6.8.1:
+ resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ ajv: 8.12.0
+ lodash.truncate: 4.4.2
+ slice-ansi: 4.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /temp-dir@3.0.0:
+ resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /tempy@3.1.0:
+ resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ is-stream: 3.0.0
+ temp-dir: 3.0.0
+ type-fest: 2.19.0
+ unique-string: 3.0.0
+ 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-extensions@2.4.0:
+ resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
+
+ /through2@2.0.5:
+ resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==}
+ dependencies:
+ readable-stream: 2.3.8
+ xtend: 4.0.2
+ dev: true
+
+ /through2@4.0.2:
+ resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==}
+ dependencies:
+ readable-stream: 3.6.2
+ dev: true
+
+ /through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+ dev: true
+
+ /tinybench@2.5.1:
+ resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==}
+ dev: true
+
+ /tinypool@0.8.1:
+ resolution: {integrity: sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==}
+ 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-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: true
+
+ /totalist@3.0.1:
+ resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /tough-cookie@4.1.3:
+ resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==}
+ engines: {node: '>=6'}
+ dependencies:
+ psl: 1.9.0
+ punycode: 2.3.1
+ universalify: 0.2.0
+ url-parse: 1.5.10
+ dev: true
+
+ /tr46@5.0.0:
+ resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
+ engines: {node: '>=18'}
+ dependencies:
+ punycode: 2.3.1
+ dev: true
+
+ /traverse@0.6.7:
+ resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==}
+ 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
+
+ /ts-dedent@2.2.0:
+ resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
+ engines: {node: '>=6.10'}
+ dev: false
+
+ /ts-node@10.9.2(@types/node@20.11.5)(typescript@5.3.3):
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.9
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 20.11.5
+ acorn: 8.11.2
+ acorn-walk: 8.3.1
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.3.3
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ dev: true
+
+ /tsc-alias@1.8.8:
+ resolution: {integrity: sha512-OYUOd2wl0H858NvABWr/BoSKNERw3N9GTi3rHPK8Iv4O1UyUXIrTTOAZNHsjlVpXFOhpJBVARI1s+rzwLivN3Q==}
+ hasBin: true
+ dependencies:
+ chokidar: 3.5.3
+ commander: 9.5.0
+ globby: 11.1.0
+ mylas: 2.1.13
+ normalize-path: 3.0.0
+ plimit-lit: 1.6.1
+ 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
+
+ /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.18.1:
+ resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.6.0:
+ resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type-fest@0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type-fest@1.4.0:
+ resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+ dev: true
+
+ /type-fest@3.13.1:
+ resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /type-fest@4.8.3:
+ resolution: {integrity: sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==}
+ engines: {node: '>=16'}
+ 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
+
+ /uc.micro@2.0.0:
+ resolution: {integrity: sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==}
+
+ /ufo@1.3.2:
+ resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==}
+ dev: true
+
+ /uglify-js@3.17.4:
+ resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==}
+ engines: {node: '>=0.8.0'}
+ hasBin: true
+ requiresBuild: true
+ dev: true
+ optional: 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
+
+ /unicode-emoji-modifier-base@1.0.0:
+ resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /unicorn-magic@0.1.0:
+ resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /unique-string@3.0.0:
+ resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ crypto-random-string: 4.0.0
+ dev: true
+
+ /unist-util-stringify-position@3.0.3:
+ resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==}
+ dependencies:
+ '@types/unist': 2.0.10
+ dev: false
+
+ /universal-user-agent@6.0.1:
+ resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
+ dev: true
+
+ /universalify@0.2.0:
+ resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
+ engines: {node: '>= 4.0.0'}
+ dev: true
+
+ /universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+ dev: true
+
+ /update-browserslist-db@1.0.13(browserslist@4.22.2):
+ resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.22.2
+ escalade: 3.1.1
+ picocolors: 1.0.0
+ dev: true
+
+ /uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.3.1
+ dev: true
+
+ /url-join@5.0.0:
+ resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /url-parse@1.5.10:
+ resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+ dependencies:
+ querystringify: 2.2.0
+ requires-port: 1.0.0
+ dev: true
+
+ /util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ dev: true
+
+ /uuid@9.0.1:
+ resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+ hasBin: true
+ dev: false
+
+ /uvu@0.5.6:
+ resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ dequal: 2.0.3
+ diff: 5.1.0
+ kleur: 4.1.5
+ sade: 1.8.1
+ dev: false
+
+ /v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+ dev: true
+
+ /v8-to-istanbul@9.2.0:
+ resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==}
+ engines: {node: '>=10.12.0'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.20
+ '@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
+
+ /vite-node@1.2.0(@types/node@20.11.5)(sass@1.69.7):
+ resolution: {integrity: sha512-ETnQTHeAbbOxl7/pyBck9oAPZZZo+kYnFt1uQDD+hPReOc+wCjXw4r4jHriBRuVDB5isHmPXxrfc1yJnfBERqg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ dependencies:
+ cac: 6.7.14
+ debug: 4.3.4
+ pathe: 1.1.1
+ picocolors: 1.0.0
+ vite: 5.0.11(@types/node@20.11.5)(sass@1.69.7)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ dev: true
+
+ /vite@5.0.11(@types/node@20.11.5)(sass@1.69.7):
+ resolution: {integrity: sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==}
+ 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.9
+ postcss: 8.4.33
+ rollup: 4.9.0
+ sass: 1.69.7
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
+ /vitest@1.2.0(@types/node@20.11.5)(@vitest/ui@1.2.0)(jsdom@23.2.0)(sass@1.69.7):
+ resolution: {integrity: sha512-Ixs5m7BjqvLHXcibkzKRQUvD/XLw0E3rvqaCMlrm/0LMsA0309ZqYvTlPzkhh81VlEyVZXFlwWnkhb6/UMtcaQ==}
+ 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.0
+ '@vitest/runner': 1.2.0
+ '@vitest/snapshot': 1.2.0
+ '@vitest/spy': 1.2.0
+ '@vitest/ui': 1.2.0(vitest@1.2.0)
+ '@vitest/utils': 1.2.0
+ acorn-walk: 8.3.1
+ cac: 6.7.14
+ chai: 4.3.10
+ debug: 4.3.4
+ execa: 8.0.1
+ jsdom: 23.2.0
+ local-pkg: 0.5.0
+ magic-string: 0.30.5
+ pathe: 1.1.1
+ picocolors: 1.0.0
+ std-env: 3.6.0
+ strip-literal: 1.3.0
+ tinybench: 2.5.1
+ tinypool: 0.8.1
+ vite: 5.0.11(@types/node@20.11.5)(sass@1.69.7)
+ vite-node: 1.2.0(@types/node@20.11.5)(sass@1.69.7)
+ why-is-node-running: 2.2.2
+ transitivePeerDependencies:
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ dev: true
+
+ /vue-component-type-helpers@1.8.25:
+ resolution: {integrity: sha512-NCA6sekiJIMnMs4DdORxATXD+/NRkQpS32UC+I1KQJUasx+Z7MZUb3Y+MsKsFmX+PgyTYSteb73JW77AibaCCw==}
+ dev: true
+
+ /vue-demi@0.14.6(vue@3.4.14):
+ resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ '@vue/composition-api': ^1.0.0-rc.1
+ vue: ^3.0.0-0 || ^2.6.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+ dependencies:
+ vue: 3.4.14(typescript@5.3.3)
+ dev: false
+
+ /vue-eslint-parser@9.4.2(eslint@8.56.0):
+ resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==}
+ 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.15:
+ resolution: {integrity: sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==}
+ 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.14(typescript@5.3.3):
+ resolution: {integrity: sha512-Rop5Al/ZcBbBz+KjPZaZDgHDX0kUP4duEzDbm+1o91uxYUNmJrZSBuegsNIJvUGy+epLevNRNhLjm08VKTgGyw==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@vue/compiler-dom': 3.4.14
+ '@vue/compiler-sfc': 3.4.14
+ '@vue/runtime-dom': 3.4.14
+ '@vue/server-renderer': 3.4.14(vue@3.4.14)
+ '@vue/shared': 3.4.14
+ typescript: 5.3.3
+
+ /w3c-xmlserializer@5.0.0:
+ resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+ engines: {node: '>=18'}
+ dependencies:
+ xml-name-validator: 5.0.0
+ dev: true
+
+ /wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ dependencies:
+ defaults: 1.0.4
+ dev: true
+
+ /web-worker@1.2.0:
+ resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==}
+ dev: false
+
+ /webidl-conversions@7.0.0:
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /whatwg-encoding@3.1.1:
+ resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ iconv-lite: 0.6.3
+ dev: true
+
+ /whatwg-mimetype@4.0.0:
+ resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /whatwg-url@14.0.0:
+ resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==}
+ engines: {node: '>=18'}
+ dependencies:
+ tr46: 5.0.0
+ webidl-conversions: 7.0.0
+ dev: true
+
+ /which-boxed-primitive@1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ dependencies:
+ is-bigint: 1.0.4
+ is-boolean-object: 1.1.2
+ is-number-object: 1.0.7
+ is-string: 1.0.7
+ is-symbol: 1.0.4
+ 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
+
+ /widest-line@3.1.0:
+ resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
+ engines: {node: '>=8'}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+
+ /word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /wordwrap@1.0.0:
+ resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
+ 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
+
+ /wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+ dev: true
+
+ /wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ dev: true
+
+ /write-file-atomic@5.0.1:
+ resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 4.1.0
+ dev: true
+
+ /ws@8.16.0:
+ resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dev: true
+
+ /xml-name-validator@4.0.0:
+ resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /xml-name-validator@5.0.0:
+ resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /xmlchars@2.2.0:
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+ dev: true
+
+ /xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+ dev: true
+
+ /y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
+
+ /yargs-parser@20.2.9:
+ resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /yargs@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
+
+ /yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yocto-queue@1.0.0:
+ resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
+ engines: {node: '>=12.20'}
+ dev: true
diff --git a/renovate.json b/renovate.json
index beb40d5..3e6ff05 100644
--- a/renovate.json
+++ b/renovate.json
@@ -2,9 +2,6 @@
"extends": [
"github>Kong/public-shared-renovate:kong-frontend-config.json"
],
- "baseBranches": [
- "alpha"
- ],
"packageRules": [
{
"groupName": "node engines range",
@@ -16,6 +13,14 @@
"engines"
],
"enabled": false
+ },
+ {
+ "automerge": true,
+ "groupName": "all shikiji dependencies",
+ "groupSlug": "all-shikiji-dependencies",
+ "matchPackagePatterns": [
+ "^(.*)?shikiji"
+ ]
}
]
}
diff --git a/sandbox/App.vue b/sandbox/App.vue
new file mode 100644
index 0000000..af1936a
--- /dev/null
+++ b/sandbox/App.vue
@@ -0,0 +1,131 @@
+
+
+
+
+ This page contains a static markdown document as well as an interactive markdown editor.
+
+ Begin by clicking the Edit button on the right.
+
+
+ Make changes to the document and see the rendered markdown in the preview pane. For a better editing experience, try enabling the Fullscreen editor.
+
+
+
+
+
+
+
+
+
+
diff --git a/sandbox/index.html b/sandbox/index.html
new file mode 100644
index 0000000..e2d43c6
--- /dev/null
+++ b/sandbox/index.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Kong Markdown
+
+
+
+
+
+
+
+
+
diff --git a/sandbox/index.ts b/sandbox/index.ts
new file mode 100644
index 0000000..52668a0
--- /dev/null
+++ b/sandbox/index.ts
@@ -0,0 +1,6 @@
+import { createApp } from 'vue'
+import App from './App.vue'
+
+const app = createApp(App)
+
+app.mount('#app')
diff --git a/sandbox/mock-document-response.ts b/sandbox/mock-document-response.ts
new file mode 100644
index 0000000..f886bea
--- /dev/null
+++ b/sandbox/mock-document-response.ts
@@ -0,0 +1,8 @@
+export default {
+ id: 'da315607-4d04-4a54-810d-45156b575932',
+ // eslint-disable-next-line no-template-curly-in-string
+ content: "# Markdown UI\n\nA markdown renderer and edit UI.\n\n## Formatting types\n\n### Code block and inline code\n\n```typescript\n/**\n * Combine a first name and last name into a single string.\n * @param {string} firstName - The first name.\n * @param {string} lastName - The last name.\n * @returns {string} The combined full name.\n */\nconst combineNames = (firstName: string, lastName: string): string => {\n return `${firstName} ${lastName}`\n}\n\nconst name = combineNames('Marty', 'McFly')\n\nconsole.log(name)\n\n// Marty McFly\n```\n\nThis sentence has `inlineCode` in the middle.\n\n### Links\n\n[GitHub source](https://github.com/Kong/markdown)\n[Docs](https://github.com/Kong/markdown)\n\n### Lists\n\n#### Unordered lists\n\n- A list item\n- Another item in the list\n - This one is indented\n - So is this one\n- But this one is not\n\n#### Ordered lists\n\n1. A list item\n2. Another item in the list\n 1. This one is indented\n 2. So is this one\n3. But this one is not\n\n#### Task lists\n\n- [X] A completed task\n- [ ] An incomplete task\n\n### Emoji\n\n:smile: :rocket: :tada:\n\n### Tables\n\n| Header | Header | Header |\n| :--- | :--- | :--- |\n| Cell | Cell | Cell |\n\n---\n\n### Diagrams\n\n#### Mermaid\n\n```mermaid\ngitGraph\n commit\n commit\n branch develop\n checkout develop\n commit\n commit\n checkout main\n merge develop\n commit\n commit\n```\n\n#### Plantuml\n\n```plantuml\nBob -> Alice : hello\n```\n\n#### DOT\n\n```dot\ndigraph example1 {\n 1 -> 2 -> { 4, 5 };\n 1 -> 3 -> { 6, 7 };\n}\n```\n",
+ parent_document_id: null,
+ slug: 'markdown',
+ title: 'markdown',
+}
diff --git a/sandbox/public/favicon.ico b/sandbox/public/favicon.ico
new file mode 100644
index 0000000..99f9353
Binary files /dev/null and b/sandbox/public/favicon.ico differ
diff --git a/sandbox/tsconfig.json b/sandbox/tsconfig.json
new file mode 100644
index 0000000..1ff7e79
--- /dev/null
+++ b/sandbox/tsconfig.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "baseUrl": "."
+ },
+ "include": [
+ "**/*.ts",
+ "**/*.vue",
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/src/assets/_mixins.scss b/src/assets/_mixins.scss
new file mode 100644
index 0000000..b84c0aa
--- /dev/null
+++ b/src/assets/_mixins.scss
@@ -0,0 +1,69 @@
+@mixin toolbar-button {
+ align-items: center;
+ background-color: var(--kui-color-background-transparent, $kui-color-background-transparent);
+ border: var(--kui-border-width-10, $kui-border-width-10) solid
+ var(--kui-color-border-transparent, $kui-color-border-transparent);
+ border-radius: var(--kui-border-radius-20, $kui-border-radius-20);
+ color: var(--kui-color-text-neutral, $kui-color-text-neutral);
+ cursor: pointer;
+ display: inline-flex;
+ font-family: var(--kui-font-family-text, $kui-font-family-text);
+ font-size: var(--kui-font-size-30, $kui-font-size-30);
+ font-weight: var(--kui-font-weight-medium, $kui-font-weight-medium);
+ gap: var(--kui-space-20, $kui-space-20);
+ justify-content: center;
+ padding: var(--kui-space-10, $kui-space-10);
+ // Remove tap color highlight on mobile Safari
+ -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
+ text-decoration: none;
+ transition:
+ background-color 0.2s ease-in-out,
+ color 0.2s ease-in-out,
+ border-color 0.2s ease-in-out;
+ user-select: none;
+ vertical-align: middle;
+ white-space: nowrap;
+
+ &:hover:not(:disabled):not(:focus):not(:active) {
+ background-color: var(--kui-color-background-neutral-weaker, $kui-color-background-neutral-weaker);
+ }
+
+ &:focus {
+ background-color: var(--kui-color-background-neutral-weaker, $kui-color-background-neutral-weaker);
+ }
+
+ &:active {
+ background-color: var(--kui-color-background-neutral-weak, $kui-color-background-neutral-weak);
+ }
+
+ &:disabled,
+ &[disabled] {
+ background-color: var(--kui-color-background-disabled, $kui-color-background-disabled);
+ box-shadow: none;
+ color: var(--kui-color-text-disabled, $kui-color-text-disabled);
+ cursor: not-allowed;
+ }
+
+ &:focus,
+ &:active,
+ &:focus-visible {
+ outline: none;
+ }
+
+ &:focus-visible {
+ // Same as $kui-shadow-focus with 2px instead of 4px
+ box-shadow: 0px 0px 0px 2px rgba(0, 68, 244, 0.2);
+ }
+}
+
+@mixin sr-only {
+ border-width: 0;
+ clip: rect(0, 0, 0, 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ white-space: nowrap;
+ width: 1px;
+}
diff --git a/src/components/MarkdownContent.spec.ts b/src/components/MarkdownContent.spec.ts
new file mode 100644
index 0000000..82c9412
--- /dev/null
+++ b/src/components/MarkdownContent.spec.ts
@@ -0,0 +1,65 @@
+import { describe, it, expect } from 'vitest'
+import { ref } from 'vue'
+import { mount } from '@vue/test-utils'
+import MarkdownContent from './MarkdownContent.vue'
+import { MODE_INJECTION_KEY } from '@/injection-keys'
+import type { MarkdownMode } from '@/types'
+
+// Provide data to be received in the `setup` function via `inject`
+// Defaults are provided
+const setProvideData = (
+ { mode = 'read' }:
+ { mode?: MarkdownMode },
+) => ({
+ // Bind the Symbol() as dynamic keys
+ [MODE_INJECTION_KEY]: ref(mode), // Note: split mode will be automatically switched to edit basd on the viewport
+})
+
+describe(' ', () => {
+ it('renders the `content` prop as html', async () => {
+ const title = 'Markdown Header'
+ const sentence = 'This is markdown content'
+ const content = `${title}
+ ${sentence}
+ `
+
+ const wrapper = mount(MarkdownContent, {
+ global: {
+ provide: setProvideData({
+ mode: 'read',
+ }),
+ },
+ props: {
+ content,
+ },
+ })
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.find('h1').text()).toEqual(title)
+ expect(wrapper.findTestId('paragraph-1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('paragraph-1').text()).toEqual(sentence)
+ })
+
+ // Loop through each mode
+ for (const mode of ['read', 'edit', 'split', 'preview']) {
+ it(`adds the 'mode-${mode}' class`, async () => {
+ const title = 'Markdown Header'
+ const content = `${title} `
+
+ const wrapper = mount(MarkdownContent, {
+ global: {
+ provide: setProvideData({
+ mode: mode as MarkdownMode,
+ }),
+ },
+ props: {
+ content,
+ },
+ })
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').classes(`mode-${mode}`)).toBe(true)
+ expect(wrapper.find('h1').text()).toEqual(title)
+ })
+ }
+})
diff --git a/src/components/MarkdownContent.vue b/src/components/MarkdownContent.vue
new file mode 100644
index 0000000..d7b44b7
--- /dev/null
+++ b/src/components/MarkdownContent.vue
@@ -0,0 +1,345 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/MarkdownUi.spec.ts b/src/components/MarkdownUi.spec.ts
new file mode 100644
index 0000000..39dd6d0
--- /dev/null
+++ b/src/components/MarkdownUi.spec.ts
@@ -0,0 +1,727 @@
+import { vi, describe, it, expect, beforeEach } from 'vitest'
+import { mount, flushPromises } from '@vue/test-utils'
+import { ref } from 'vue'
+import MarkdownUi from './MarkdownUi.vue'
+import { InlineFormatWrapper, MARKDOWN_TEMPLATE_CODEBLOCK, MARKDOWN_TEMPLATE_TASK, MARKDOWN_TEMPLATE_UL, MARKDOWN_TEMPLATE_OL, MARKDOWN_TEMPLATE_BLOCKQUOTE, MARKDOWN_TEMPLATE_TABLE, MARKDOWN_TEMPLATE_LINK } from '@/constants'
+import { KUI_BREAKPOINT_PHABLET } from '@kong/design-tokens'
+import type { Theme, MarkdownTemplate } from '@/types'
+
+// Default markdown content
+const defaultText = 'Markdown Content'
+const defaultContent = `# ${defaultText}`
+
+/**
+ * The markdown content takes roughly 400ms to initialize `markdown-it` and render, so await this function in each test immediately after calling `mount()` that is not in `edit` mode. **Important**: you must provide at least 1 initial character in the editor for this to properly resolve.
+ * @param wrapper The component wrapper
+ * @example await waitForMarkdownRender(wrapper)
+ */
+const waitForMarkdownRender = async (wrapper: any): Promise => {
+ await vi.waitUntil(
+ () => wrapper.findTestId('markdown-content').element.innerHTML.length > 0,
+ {
+ timeout: 1000,
+ interval: 20,
+ },
+ )
+
+ expect(wrapper.findTestId('markdown-content').element.innerHTML.length).toBeGreaterThan(0)
+}
+
+/**
+ * When text is entered into the editor, the `update:modelValue` event is fired on a debounce. This function waits for the event to be emitted before continuing
+ * @param wrapper The component wrapper
+ * @param {string} emit The name of the emitted event to wait for
+ * @example await waitForEmittedEvent(wrapper, 'update:modelValue')
+ */
+const waitForEmittedEvent = async (wrapper: any, emit: string): Promise => {
+ if (!emit) {
+ throw new Error('waitForEmittedEvent: `emit` string param is required')
+ }
+
+ await vi.waitFor(async () => {
+ expect(wrapper.emitted()).toHaveProperty(emit)
+ },
+ {
+ timeout: 1000,
+ interval: 50,
+ })
+}
+
+// Stub the return value for useMediaQuery to determine if browser is at least phablet width
+const mediaQuerySpy = ({
+ isPhabletWidth = true,
+}: {
+ isPhabletWidth?: boolean,
+ theme?: Theme,
+}) => vi.spyOn(global.window, 'matchMedia').mockImplementation((query: string): MediaQueryList => {
+ let matches = false
+ if (query.includes(`min-width: ${KUI_BREAKPOINT_PHABLET}`)) {
+ matches = isPhabletWidth
+ }
+
+ // @ts-ignore
+ return {
+ matches,
+ media: query,
+ addListener: () => {}, // Mocking addListener method
+ removeListener: () => {}, // Mocking removeListener method
+ }
+})
+
+describe(' ', () => {
+ beforeEach(() => {
+ // Emulate a larger browser
+ mediaQuerySpy({})
+ })
+
+ describe('modes', () => {
+ describe('read', () => {
+ it('displays markdown content in read mode', async () => {
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'read',
+ editable: false,
+ modelValue: defaultContent,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ // Ensure markdown is rendered into tags and content
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+ // Elements should not exist
+ expect(wrapper.findTestId('edit').exists()).toBe(false)
+ expect(wrapper.findTestId('toolbar').exists()).toBe(false)
+ })
+
+ it('displays the Edit button read mode when `editable` is true', async () => {
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'read',
+ editable: true,
+ modelValue: defaultContent,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ // Ensure markdown is rendered into tags and content
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+ // Edit button should be visible
+ expect(wrapper.findTestId('edit').isVisible()).toBe(true)
+ // Elements should not exist
+ expect(wrapper.findTestId('toolbar').exists()).toBe(false)
+ })
+ })
+
+ describe('edit', () => {
+ it('does not show edit mode when `editable` prop is false', async () => {
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'edit',
+ editable: false,
+ modelValue: defaultText,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').text()).toContain(defaultText)
+ // Elements should not exist
+ expect(wrapper.findTestId('edit').exists()).toBe(false)
+ expect(wrapper.findTestId('toolbar').exists()).toBe(false)
+ })
+
+ it('updates the v-model when the editor content is changed', async () => {
+ const text = '# Starter content'
+ const newText = '# This is the new content'
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'edit',
+ editable: true,
+ modelValue: text,
+ 'onUpdate:modelValue': (e: any) => wrapper.setProps({ modelValue: e }),
+ },
+ })
+
+ // No need to wait in edit mode
+
+ expect(wrapper.findTestId('toolbar').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ // Expect original text
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(text)
+ // Elements should not exist
+ expect(wrapper.findTestId('markdown-content').exists()).toBe(false)
+ expect(wrapper.findTestId('edit').exists()).toBe(false)
+
+ // Set the new text
+ await wrapper.findTestId('markdown-editor-textarea').setValue(newText)
+
+ await flushPromises()
+
+ const eventName = 'update:modelValue'
+
+ // Verify event is emitted
+ await waitForEmittedEvent(wrapper, eventName)
+
+ // Verify the emitted event
+ expect(wrapper.emitted(eventName) || []).toHaveLength(1)
+ expect(wrapper.emitted(eventName)![0]).toEqual([newText])
+
+ // Expect new text
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(newText)
+ })
+ })
+
+ describe('split', () => {
+ it('displays both the editor and preview panes with correct content', async () => {
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'split',
+ editable: true,
+ modelValue: defaultContent,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('toolbar').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ // Expect text
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(defaultContent)
+ // Ensure markdown is rendered into tags and content
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+ // Elements should not exist
+ expect(wrapper.findTestId('edit').exists()).toBe(false)
+ })
+ })
+
+ describe('preview', () => {
+ it('displays only the preview pane correct content', async () => {
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'preview',
+ editable: true,
+ modelValue: defaultContent,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('toolbar').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ // Ensure markdown is rendered into tags and content
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+ // Elements should not exist
+ expect(wrapper.findTestId('markdown-editor-textarea').exists()).toBe(false)
+ expect(wrapper.findTestId('edit').exists()).toBe(false)
+ })
+ })
+ })
+
+ describe('actions', () => {
+ it('copies code block text to the clipboard via the copy button', async () => {
+ const copiedText = ref('')
+ // Stub the navigator.clipboard.writeText method
+ window.navigator = {
+ // @ts-ignore
+ clipboard: {
+ writeText: vi.fn(async (text: string) => {
+ copiedText.value = text
+ }),
+ },
+ }
+
+ const codeContent = "const name: string = 'Marty McFly'"
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'read',
+ editable: false,
+ modelValue: '```typescript\n' + codeContent + '\n```',
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').text()).toContain(codeContent)
+ // Copy button should be visible
+ expect(wrapper.findTestId('copy-code-button').isVisible()).toBe(true)
+ // Ensure the copy text is empty before clicking the copy button
+ expect(copiedText.value).toEqual('')
+
+ await wrapper.findTestId('copy-code-button').element.click()
+
+ // Verify the text was copied
+ expect(copiedText.value).toEqual(codeContent)
+ })
+
+ it('can change modes via all action buttons when editing is enabled', async () => {
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'read',
+ editable: true,
+ modelValue: defaultContent,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ // Ensure markdown is rendered into tags and content
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+ // Elements should not exist
+ expect(wrapper.findTestId('toolbar').exists()).toBe(false)
+ expect(wrapper.findTestId('markdown-editor-textarea').exists()).toBe(false)
+ expect(wrapper.findTestId('save').exists()).toBe(false)
+ expect(wrapper.findTestId('cancel').exists()).toBe(false)
+ // Edit button should exist in read mode
+ expect(wrapper.findTestId('edit').isVisible()).toBe(true)
+
+ // Click the Edit button
+ await wrapper.findTestId('edit').element.click()
+
+ // Mode event should be emitted
+ expect(wrapper.emitted()).toHaveProperty('mode')
+
+ // Verify the emitted event
+ expect(wrapper.emitted('mode') || []).toHaveLength(1)
+ expect(wrapper.emitted('mode')![0]).toEqual(['split'])
+
+ // Both panes should be visible
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(defaultContent)
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+
+ // Toolbar should now be visible
+ expect(wrapper.findTestId('toolbar').exists()).toBe(true)
+ expect(wrapper.findTestId('save').isVisible()).toBe(true)
+ expect(wrapper.findTestId('cancel').isVisible()).toBe(true)
+
+ // We should now be in split mode since on a larger screen
+ expect(wrapper.findTestId('split-mode-button').isVisible()).toBe(true)
+ expect(wrapper.findTestId('split-mode-button').classes('active')).toBe(true)
+ // Ensure the other mode buttons are also visible
+ expect(wrapper.findTestId('edit-mode-button').isVisible()).toBe(true)
+ expect(wrapper.findTestId('preview-mode-button').isVisible()).toBe(true)
+
+ // Click the Edit mode button
+ await wrapper.findTestId('edit-mode-button').element.click()
+
+ // Mode event should be emitted again
+ expect(wrapper.emitted('mode') || []).toHaveLength(2)
+ expect(wrapper.emitted('mode')![1]).toEqual(['edit'])
+
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ // Expect original text
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(defaultContent)
+ // Elements should not exist
+ expect(wrapper.findTestId('markdown-content').exists()).toBe(false)
+ expect(wrapper.findTestId('edit').exists()).toBe(false)
+
+ // Click the Preview mode button
+ await wrapper.findTestId('preview-mode-button').element.click()
+
+ // Mode event should be emitted again
+ expect(wrapper.emitted('mode') || []).toHaveLength(3)
+ expect(wrapper.emitted('mode')![2]).toEqual(['preview'])
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+ // Textarea should not exist
+ expect(wrapper.findTestId('markdown-editor-textarea').exists()).toBe(false)
+
+ // Click the Save button
+ await wrapper.findTestId('save').element.click()
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ // Ensure markdown is rendered into tags and content
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+ // Elements should not exist
+ expect(wrapper.findTestId('toolbar').exists()).toBe(false)
+ expect(wrapper.findTestId('markdown-editor-textarea').exists()).toBe(false)
+ expect(wrapper.findTestId('save').exists()).toBe(false)
+ expect(wrapper.findTestId('cancel').exists()).toBe(false)
+ // Edit button should exist in read mode
+ expect(wrapper.findTestId('edit').isVisible()).toBe(true)
+ })
+
+ it('toggles fullscreen when the fullscreen button is clicked', async () => {
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'split',
+ editable: true,
+ modelValue: defaultContent,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ // Ensure the wrapper class does not exist
+ expect(wrapper.findTestId('markdown-ui').classes('fullscreen')).toBe(false)
+
+ // Both panes should be visible
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(defaultContent)
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+
+ // Ensure the starting mode is active
+ expect(wrapper.findTestId('split-mode-button').classes('active')).toBe(true)
+
+ expect(wrapper.findTestId('toggle-fullscreen').isVisible()).toBe(true)
+
+ // Click the Fullscreen button
+ await wrapper.findTestId('toggle-fullscreen').element.click()
+
+ // Ensure the event was emitted
+ expect(wrapper.emitted()).toHaveProperty('fullscreen')
+ expect(wrapper.emitted('fullscreen') || []).toHaveLength(1)
+ expect(wrapper.emitted('fullscreen')![0]).toEqual([true])
+
+ // Ensure the wrapper class is added
+ expect(wrapper.findTestId('markdown-ui').classes('fullscreen')).toBe(true)
+ })
+
+ it('toggles the html preview when the html preview button is clicked', async () => {
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'split',
+ editable: true,
+ modelValue: defaultContent,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ // Ensure the wrapper class does not exist
+ expect(wrapper.findTestId('markdown-content').classes('html-preview')).toBe(false)
+ // Ensure the HTML preview does not exist
+ expect(wrapper.find('pre > code.language-html').exists()).toBe(false)
+ expect(wrapper.findTestId('copy-code-button').exists()).toBe(false)
+
+ // Both panes should be visible
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(defaultContent)
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+
+ // Ensure the starting mode is active
+ expect(wrapper.findTestId('split-mode-button').classes('active')).toBe(true)
+
+ expect(wrapper.findTestId('toggle-html-preview').isVisible()).toBe(true)
+
+ // Click the Fullscreen button
+ await wrapper.findTestId('toggle-html-preview').element.click()
+
+ // Ensure the wrapper class is added
+ expect(wrapper.findTestId('markdown-content').classes('html-preview')).toBe(true)
+
+ expect(wrapper.find('pre > code.language-html').isVisible()).toBe(true)
+ expect(wrapper.findTestId('copy-code-button').isVisible()).toBe(true)
+ })
+
+ describe('format buttons', () => {
+ // Loop through enabled format buttons
+ for (const format of Object.keys(InlineFormatWrapper)) {
+ // Skip the format options that are not currently enabled
+ if (['subscript', 'superscript', 'mark'].includes(format)) {
+ continue
+ }
+ it(`formats text as ${format}`, async () => {
+ const textStart = 'This is a sentence that needs '
+ const textMiddle = `${format} text`
+ const textEnd = ' in the middle.'
+ const sentence = textStart + textMiddle + textEnd
+
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'split',
+ editable: true,
+ modelValue: sentence,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('toolbar').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ // Expect text
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(sentence)
+ // Ensure markdown is rendered into tags and content
+ expect(wrapper.findTestId('markdown-content').find('p').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('p').text()).toEqual(sentence)
+
+ await wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.focus()
+ // Start the text selection after the start text
+ wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.selectionStart = textStart.length
+ // End the text selection after the middle text
+ wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.selectionEnd = textStart.length + textMiddle.length
+
+ // Click the formatting button
+ await wrapper.findTestId(`format-option-${format}`).element.click()
+
+ // Verify event is emitted
+ const eventName = 'update:modelValue'
+ await waitForEmittedEvent(wrapper, eventName)
+
+ expect(wrapper.emitted(eventName) || []).toHaveLength(1)
+ // @ts-ignore - referencing enum properties
+ expect(wrapper.emitted(eventName)![0]).toEqual([`${textStart}${InlineFormatWrapper[format]}${textMiddle}${InlineFormatWrapper[format]}${textEnd}`])
+
+ let htmlTag: string = ''
+
+ switch (format) {
+ case 'bold':
+ htmlTag = 'strong'
+ break
+ case 'italic':
+ htmlTag = 'em'
+ break
+ case 'underline':
+ htmlTag = 'ins'
+ break
+ case 'strikethrough':
+ htmlTag = 's'
+ break
+ case 'subscript':
+ htmlTag = 'sub'
+ break
+ case 'superscript':
+ htmlTag = 'sup'
+ break
+ case 'code':
+ htmlTag = 'code'
+ break
+ }
+
+ expect(wrapper.findTestId('markdown-content').find(htmlTag).isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find(htmlTag).text()).toContain(textMiddle)
+ })
+ }
+
+ describe('formats text as links', () => {
+ it('inserts the link template at the cursor position when clicked', async () => {
+ const content = 'This is a sentence of text.'
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'split',
+ editable: true,
+ modelValue: content,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('toolbar').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ // Both panes should be visible
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(content)
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('p').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('p').text()).toEqual(content)
+
+ await wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.focus()
+
+ // Move the cursor
+ wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.selectionEnd = 5 // place the cursor after the first word
+
+ // Click the formatting button
+ await wrapper.findTestId('format-option-link').element.click()
+
+ // Verify event is emitted
+ const eventName = 'update:modelValue'
+ await waitForEmittedEvent(wrapper, eventName)
+
+ expect(wrapper.emitted(eventName) || []).toHaveLength(1)
+ expect(wrapper.emitted(eventName)![0][0]).toContain([MARKDOWN_TEMPLATE_LINK.replace(/text/, '')])
+ })
+
+ it('wraps the selected text with the link template', async () => {
+ const linkText = 'link'
+ const content = `This ${linkText} is in the middle.`
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'split',
+ editable: true,
+ modelValue: content,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('toolbar').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ // Both panes should be visible
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(content)
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('p').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('p').text()).toEqual(content)
+
+ await wrapper.findTestId('markdown-editor-textarea').setValue(content)
+ await wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.focus()
+
+ // Select the text `link`
+ const selectStart = 5
+ wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.selectionStart = selectStart
+ wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.selectionEnd = selectStart + linkText.length
+
+ // Click the formatting button
+ await wrapper.findTestId('format-option-link').element.click()
+
+ // Verify event is emitted
+ const eventName = 'update:modelValue'
+ await waitForEmittedEvent(wrapper, eventName)
+
+ expect(wrapper.emitted(eventName) || []).toHaveLength(1)
+ expect(wrapper.emitted(eventName)![0][0]).toContain([MARKDOWN_TEMPLATE_LINK.replace(/text/, linkText)])
+ })
+
+ it('wraps the selected URL with the link template', async () => {
+ const linkUrl = 'https://github.com/Kong/markdown'
+ const content = `This ${linkUrl} is in the middle.`
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'split',
+ editable: true,
+ modelValue: content,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('toolbar').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ // Both panes should be visible
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(content)
+
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('p').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('p').text()).toEqual(content)
+
+ await wrapper.findTestId('markdown-editor-textarea').setValue(content)
+ await wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.focus()
+
+ // Select the text `link`
+ const selectStart = 5
+ wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.selectionStart = selectStart
+ wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.selectionEnd = selectStart + linkUrl.length
+
+ // Click the formatting button
+ await wrapper.findTestId('format-option-link').element.click()
+
+ // Verify event is emitted
+ const eventName = 'update:modelValue'
+ await waitForEmittedEvent(wrapper, eventName)
+
+ expect(wrapper.emitted(eventName) || []).toHaveLength(1)
+ expect(wrapper.emitted(eventName)![0][0]).toContain([MARKDOWN_TEMPLATE_LINK.replace(/text/, '').replace(/url/, linkUrl)])
+ })
+ })
+ })
+
+ describe('template buttons', () => {
+ // Loop through enabled template buttons
+ const templates: MarkdownTemplate[] = ['table', 'codeblock', 'task', 'unordered-list', 'ordered-list', 'blockquote']
+ for (const template of templates) {
+ it(`inserts a '${template}' template`, async () => {
+ const wrapper = mount(MarkdownUi, {
+ props: {
+ mode: 'split',
+ editable: true,
+ modelValue: defaultContent,
+ },
+ })
+
+ await waitForMarkdownRender(wrapper)
+
+ expect(wrapper.findTestId('toolbar').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-editor-textarea').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').isVisible()).toBe(true)
+ // Expect text
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(defaultContent)
+ // Ensure markdown is rendered into tags and content
+ expect(wrapper.findTestId('markdown-content').find('h1').isVisible()).toBe(true)
+ expect(wrapper.findTestId('markdown-content').find('h1').text()).toEqual(defaultText)
+
+ // Clear the textarea
+ await wrapper.findTestId('markdown-editor-textarea').setValue('')
+
+ // Click the insert template button
+ await wrapper.findTestId(`template-option-${template}`).element.click()
+
+ // Verify event is emitted
+ const eventName = 'update:modelValue'
+ await waitForEmittedEvent(wrapper, eventName)
+
+ expect(wrapper.emitted(eventName) || []).toHaveLength(1)
+
+ let templateText: string = ''
+ let markdownSelector: string = ''
+ switch (template) {
+ case 'table':
+ templateText = MARKDOWN_TEMPLATE_TABLE
+ markdownSelector = 'table'
+ break
+ case 'codeblock':
+ templateText = MARKDOWN_TEMPLATE_CODEBLOCK
+ markdownSelector = 'pre'
+ break
+ case 'task':
+ templateText = MARKDOWN_TEMPLATE_TASK
+ // List doesn't receive the `.contains-task-list` class until content is added
+ markdownSelector = 'ul'
+ break
+ case 'unordered-list':
+ templateText = MARKDOWN_TEMPLATE_UL
+ markdownSelector = 'ul'
+ break
+ case 'ordered-list':
+ templateText = MARKDOWN_TEMPLATE_OL
+ markdownSelector = 'ol'
+ break
+ case 'blockquote':
+ templateText = MARKDOWN_TEMPLATE_BLOCKQUOTE
+ markdownSelector = 'blockquote'
+ break
+ }
+
+ // Assert template is included in emitted content
+ expect(wrapper.emitted(eventName)![0]).toEqual([templateText])
+
+ // Ensure template is in editor
+ expect(wrapper.findTestId<'textarea'>('markdown-editor-textarea').element.value).toEqual(templateText)
+
+ // Ensure template is rendered as HTML
+ expect(wrapper.findTestId('markdown-content').find(markdownSelector).isVisible()).toBe(true)
+ })
+ }
+ })
+ })
+})
diff --git a/src/components/MarkdownUi.vue b/src/components/MarkdownUi.vue
new file mode 100644
index 0000000..abc22ed
--- /dev/null
+++ b/src/components/MarkdownUi.vue
@@ -0,0 +1,815 @@
+
+
+
currentMode = mode"
+ @format-selection="formatSelection"
+ @insert-template="insertTemplate"
+ @toggle-fullscreen="toggleFullscreen"
+ @toggle-html-preview="toggleHtmlPreview"
+ >
+
+
+
+
+
+
+
+ Cancel
+
+
+ Save
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Download
+
+
+
+
+
+
+
+ Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/toolbar/InfoTooltip.spec.ts b/src/components/toolbar/InfoTooltip.spec.ts
new file mode 100644
index 0000000..3703091
--- /dev/null
+++ b/src/components/toolbar/InfoTooltip.spec.ts
@@ -0,0 +1,111 @@
+import { describe, it, expect } from 'vitest'
+import { mount } from '@vue/test-utils'
+import { h } from 'vue'
+import InfoTooltip from './InfoTooltip.vue'
+
+describe(' ', () => {
+ it('renders the default slot content when no tooltip exists', async () => {
+ const slotContent = 'This is the button text'
+
+ const wrapper = mount(InfoTooltip, {
+ slots: {
+ default: h('button', {}, slotContent),
+ },
+ })
+
+ expect(wrapper.find('button').isVisible()).toBe(true)
+ expect(wrapper.find('button').text()).toEqual(slotContent)
+
+ // Hover button
+ await wrapper.find('button').trigger('mouseover')
+
+ // Tooltip should not exist
+ expect(wrapper.find('.tooltip-content').exists()).toBe(false)
+ })
+
+ describe('props', () => {
+ it('renders the default slot content when the text prop is provided', async () => {
+ const slotContent = 'This is the button text'
+ const tooltip = 'This is the tooltip text'
+
+ const wrapper = mount(InfoTooltip, {
+ props: {
+ text: tooltip,
+ },
+ slots: {
+ default: h('button', {}, slotContent),
+ },
+ })
+
+ expect(wrapper.find('button').isVisible()).toBe(true)
+ expect(wrapper.find('button').text()).toEqual(slotContent)
+
+ // Tooltip should exist, even though not hovered
+ expect(wrapper.find('.tooltip-content').exists()).toBe(true)
+ })
+
+ it('shows the tooltip when the text prop is provided when hovered', async () => {
+ const slotContent = 'This is the button text'
+ const tooltip = 'This is the tooltip text'
+
+ const wrapper = mount(InfoTooltip, {
+ props: {
+ text: tooltip,
+ },
+ slots: {
+ default: h('button', {}, slotContent),
+ },
+ })
+
+ expect(wrapper.find('button').isVisible()).toBe(true)
+ expect(wrapper.find('button').text()).toEqual(slotContent)
+
+ // Hover button
+ await wrapper.find('button').trigger('mouseover')
+
+ expect(wrapper.find('.tooltip-content').isVisible()).toBe(true)
+ expect(wrapper.find('.tooltip-content').text()).toEqual(tooltip)
+ })
+ })
+
+ describe('slots', () => {
+ it('renders the default slot content when the tooltip slot is provided', async () => {
+ const slotContent = 'This is the button text'
+ const tooltip = 'This is the tooltip text'
+
+ const wrapper = mount(InfoTooltip, {
+ slots: {
+ default: h('button', {}, slotContent),
+ tooltip: h('div', {}, tooltip),
+ },
+ })
+
+ expect(wrapper.find('button').isVisible()).toBe(true)
+ expect(wrapper.find('button').text()).toEqual(slotContent)
+
+ // Tooltip should exist, even though not hovered
+ expect(wrapper.find('.tooltip-content').exists()).toBe(true)
+ })
+
+ it('shows the tooltip when the text prop is provided when hovered', async () => {
+ const slotContent = 'This is the button text'
+ const tooltip = 'This is the tooltip text'
+
+ const wrapper = mount(InfoTooltip, {
+ slots: {
+ default: h('button', {}, slotContent),
+ tooltip: h('div', {}, tooltip),
+ },
+ })
+
+ expect(wrapper.find('button').isVisible()).toBe(true)
+ expect(wrapper.find('button').text()).toEqual(slotContent)
+
+ // Hover button
+ await wrapper.find('button').trigger('mouseover')
+
+ expect(wrapper.find('.tooltip-content').isVisible()).toBe(true)
+ expect(wrapper.find('.tooltip-content').text()).toEqual(tooltip)
+ })
+ })
+})
diff --git a/src/components/toolbar/InfoTooltip.vue b/src/components/toolbar/InfoTooltip.vue
new file mode 100644
index 0000000..785f439
--- /dev/null
+++ b/src/components/toolbar/InfoTooltip.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
diff --git a/src/components/toolbar/MarkdownToolbar.spec.ts b/src/components/toolbar/MarkdownToolbar.spec.ts
new file mode 100644
index 0000000..c1f0ad6
--- /dev/null
+++ b/src/components/toolbar/MarkdownToolbar.spec.ts
@@ -0,0 +1,350 @@
+import { describe, it, expect } from 'vitest'
+import { ref, h } from 'vue'
+import { mount } from '@vue/test-utils'
+import MarkdownToolbar from './MarkdownToolbar.vue'
+import { MODE_INJECTION_KEY, EDITABLE_INJECTION_KEY, FULLSCREEN_INJECTION_KEY, HTML_PREVIEW_INJECTION_KEY } from '@/injection-keys'
+import type { MarkdownMode, FormatOption, TemplateOption } from '@/types'
+
+// Provide data to be received in the `setup` function via `inject`
+// Defaults are provided
+const setProvideData = (
+ { mode = 'read', editable = true, fullscreen = false, htmlPreview = false }:
+ { mode?: MarkdownMode, editable?: boolean, fullscreen?: boolean, htmlPreview?: boolean },
+) => ({
+ // Bind the Symbol() as dynamic keys
+ [MODE_INJECTION_KEY]: ref(mode), // Note: split mode will be automatically switched to edit basd on the viewport
+ [EDITABLE_INJECTION_KEY]: ref(editable),
+ [FULLSCREEN_INJECTION_KEY]: ref(fullscreen),
+ [HTML_PREVIEW_INJECTION_KEY]: ref(htmlPreview),
+})
+
+const formatOptions: Partial[] = [
+ { label: 'Bold', action: 'bold', keys: ['B'] },
+ { label: 'Italic', action: 'italic', keys: ['I'] },
+ { label: 'Underline', action: 'underline', keys: ['U'] },
+ { label: 'Strikethrough', action: 'strikethrough', keys: ['Shift', 'X'] },
+ { label: 'Code', action: 'code', keys: ['Shift', 'C'] },
+ { label: 'Link', action: 'link' },
+]
+
+const templateOptions: Partial[] = [
+ { label: 'Unordered List', action: 'unordered-list' },
+ { label: 'Ordered List', action: 'ordered-list' },
+ { label: 'Tasklist', action: 'task' },
+ { label: 'Codeblock', action: 'codeblock' },
+ { label: 'Table', action: 'table' },
+ { label: 'Blockquote', action: 'blockquote' },
+]
+
+describe(' ', () => {
+ describe('mode switcher', () => {
+ // Loop through each mode
+ for (const mode of ['read', 'edit', 'split', 'preview']) {
+ describe(`${mode}-mode`, () => {
+
+ it(`is ${mode === 'read' ? 'hidden' : 'visible'} in '${mode}' mode`, async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: mode as MarkdownMode,
+ }),
+ },
+ })
+
+ expect(wrapper.find('.markdown-ui-toolbar').exists()).toBe(mode !== 'read')
+ })
+
+ // Tests when not in `read` mode
+ if (mode !== 'read') {
+ it('displays the mode selection buttons', async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: mode as MarkdownMode,
+ editable: true,
+ }),
+ },
+ })
+
+ // Ensure each mode radio button is visible
+ expect(wrapper.findTestId(`${mode}-mode-button`).classes('active')).toBe(true)
+ expect(wrapper.findTestId('edit-mode-button').isVisible()).toBe(true)
+ expect(wrapper.findTestId('split-mode-button').isVisible()).toBe(true)
+ expect(wrapper.findTestId('preview-mode-button').isVisible()).toBe(true)
+ })
+ }
+ })
+ }
+ })
+
+ describe('toolbar-buttons', () => {
+ // Loop through the iterable buttons
+ for (const button of [...formatOptions, ...templateOptions]) {
+ it(`'${button.label}' button is visible`, async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'edit',
+ editable: true,
+ }),
+ },
+ })
+
+ expect(wrapper.find(`[data-testid$="-option-${button.action}"]`).isVisible()).toBe(true)
+ })
+ }
+
+ // Now test the standalone buttons
+
+ it("'Fullscreen' button is visible", async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'edit',
+ editable: true,
+ }),
+ },
+ })
+
+ expect(wrapper.findTestId('toggle-fullscreen').isVisible()).toBe(true)
+ })
+
+ it("'HTML Preview' button is visible", async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'preview', // must be in preview or split mode
+ editable: true,
+ }),
+ },
+ })
+
+ expect(wrapper.findTestId('toggle-html-preview').isVisible()).toBe(true)
+ })
+
+ it("'HTML Preview' button is not visible in edit mode", async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'edit', // must be in preview or split mode
+ editable: true,
+ }),
+ },
+ })
+
+ expect(wrapper.findTestId('toggle-html-preview').exists()).toBe(false)
+ })
+ })
+
+ describe('emit events', () => {
+ describe('change-mode', () => {
+ it('changes the mode when one of the mode radio buttons is clicked', async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'edit',
+ editable: true,
+ }),
+ },
+ })
+
+ // Ensure the starting mode is active
+ expect(wrapper.findTestId('edit-mode-button').classes('active')).toBe(true)
+ expect(wrapper.findTestId('split-mode-button').classes('active')).toBe(false)
+ expect(wrapper.findTestId('preview-mode-button').classes('active')).toBe(false)
+
+ expect(wrapper.findTestId('split-mode-button').isVisible()).toBe(true)
+
+ // Click the Split mode button
+ await wrapper.findTestId('split-mode-button').element.click()
+
+ // Ensure the event was emitted
+ expect(wrapper.emitted()).toHaveProperty('change-mode')
+
+ // Grab the emitted event
+ const clickEvent = wrapper.emitted('change-mode') || []
+
+ expect(clickEvent).toHaveLength(1)
+ expect(clickEvent[0]).toEqual(['split'])
+ })
+ })
+
+ describe('format-selection', () => {
+ // Loop through the format options
+ for (const option of formatOptions) {
+ it(`emits the '${option.action}' payload when the '${option.label}' button is clicked`, async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'edit',
+ editable: true,
+ }),
+ },
+ })
+
+ expect(wrapper.findTestId(`format-option-${option.action}`).isVisible()).toBe(true)
+
+ // Click the button
+ await wrapper.findTestId(`format-option-${option.action}`).element.click()
+
+ // Ensure the event was emitted
+ expect(wrapper.emitted()).toHaveProperty('format-selection')
+
+ // Grab the emitted event
+ const clickEvent = wrapper.emitted('format-selection') || []
+
+ expect(clickEvent).toHaveLength(1)
+ expect(clickEvent[0]).toEqual([option.action])
+ })
+ }
+ })
+
+ describe('insert-template', () => {
+ // Loop through the template options
+ for (const option of templateOptions) {
+ it(`emits the '${option.action}' payload when the '${option.label}' button is clicked`, async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'edit',
+ editable: true,
+ }),
+ },
+ })
+
+ expect(wrapper.findTestId(`template-option-${option.action}`).isVisible()).toBe(true)
+
+ // Click the button
+ await wrapper.findTestId(`template-option-${option.action}`).element.click()
+
+ // Ensure the event was emitted
+ expect(wrapper.emitted()).toHaveProperty('insert-template')
+
+ // Grab the emitted event
+ const clickEvent = wrapper.emitted('insert-template') || []
+
+ expect(clickEvent).toHaveLength(1)
+ expect(clickEvent[0]).toEqual([option.action])
+ })
+ }
+ })
+
+ describe('toggle-fullscreen', () => {
+ it('toggles fullscreen when the fullscreen button is clicked', async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'edit',
+ editable: true,
+ fullscreen: false,
+ }),
+ },
+ })
+
+ // Ensure the starting mode is active
+ expect(wrapper.findTestId('edit-mode-button').classes('active')).toBe(true)
+
+ expect(wrapper.findTestId('toggle-fullscreen').isVisible()).toBe(true)
+
+ // Click the Fullscreen button
+ await wrapper.findTestId('toggle-fullscreen').element.click()
+
+ // Ensure the event was emitted
+ expect(wrapper.emitted()).toHaveProperty('toggle-fullscreen')
+
+ // Grab the emitted event
+ const clickEvent = wrapper.emitted('toggle-fullscreen') || []
+
+ expect(clickEvent).toHaveLength(1)
+ // We don't check the value here because the toolbar emits an event with no payload
+ })
+ })
+
+ describe('toggle-html-preview', () => {
+ it('toggles the html preview when the html preview button is clicked', async () => {
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'preview', // must be in preview or split mode
+ editable: true,
+ htmlPreview: false,
+ }),
+ },
+ })
+
+ // Ensure the starting mode is active
+ expect(wrapper.findTestId('preview-mode-button').classes('active')).toBe(true)
+
+ expect(wrapper.findTestId('toggle-html-preview').isVisible()).toBe(true)
+
+ // Click the Fullscreen button
+ await wrapper.findTestId('toggle-html-preview').element.click()
+
+ // Ensure the event was emitted
+ expect(wrapper.emitted()).toHaveProperty('toggle-html-preview')
+
+ // Grab the emitted event
+ const clickEvent = wrapper.emitted('toggle-html-preview') || []
+
+ expect(clickEvent).toHaveLength(1)
+ // We don't check the value here because the toolbar emits an event with no payload
+ })
+ })
+ })
+
+ describe('slots', () => {
+ // We cannot test the default slot content from this component since it is provided by the parent `MarkdownUi.vue` component
+ describe('editor-actions', () => {
+ it('displays slot content if provided', async () => {
+ const saveButtonText = 'Save changes'
+ const cancelButtonText = 'Cancel changes'
+
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'edit',
+ editable: true,
+ }),
+ },
+ slots: {
+ 'editor-actions': [
+ h('button', { 'data-testid': 'save' }, saveButtonText),
+ h('button', { 'data-testid': 'cancel' }, cancelButtonText),
+ ],
+ },
+ })
+
+ expect(wrapper.findTestId('slot-editor-actions').isVisible()).toBe(true)
+ // Slotted Save button
+ expect(wrapper.findTestId('save').isVisible()).toBe(true)
+ expect(wrapper.findTestId('save').text()).toEqual(saveButtonText)
+ // Slotted Cancel button
+ expect(wrapper.findTestId('cancel').isVisible()).toBe(true)
+ expect(wrapper.findTestId('cancel').text()).toEqual(cancelButtonText)
+ })
+ })
+
+ describe('toolbar-right', () => {
+ it('displays slot content if provided', async () => {
+ const buttonText = 'Custom toolbar button'
+
+ const wrapper = mount(MarkdownToolbar, {
+ global: {
+ provide: setProvideData({
+ mode: 'edit',
+ editable: true,
+ }),
+ },
+ slots: {
+ 'toolbar-right': h('button', { 'data-testid': 'custom' }, buttonText),
+ },
+ })
+
+ expect(wrapper.findTestId('slot-toolbar-right').isVisible()).toBe(true)
+ // Slotted button
+ expect(wrapper.findTestId('custom').isVisible()).toBe(true)
+ expect(wrapper.findTestId('custom').text()).toEqual(buttonText)
+ })
+ })
+ })
+})
diff --git a/src/components/toolbar/MarkdownToolbar.vue b/src/components/toolbar/MarkdownToolbar.vue
new file mode 100644
index 0000000..82a585f
--- /dev/null
+++ b/src/components/toolbar/MarkdownToolbar.vue
@@ -0,0 +1,443 @@
+
+
+
+
+
+
+
diff --git a/src/components/toolbar/ToolbarButton.spec.ts b/src/components/toolbar/ToolbarButton.spec.ts
new file mode 100644
index 0000000..57fb007
--- /dev/null
+++ b/src/components/toolbar/ToolbarButton.spec.ts
@@ -0,0 +1,67 @@
+import { describe, it, expect } from 'vitest'
+import { mount } from '@vue/test-utils'
+import { h } from 'vue'
+import ToolbarButton from './ToolbarButton.vue'
+
+describe(' ', () => {
+ it('renders the default button', async () => {
+ const slotContent = 'This is the button text'
+
+ const wrapper = mount(ToolbarButton, {
+ slots: {
+ default: h('button', {}, slotContent),
+ },
+ })
+
+ expect(wrapper.find('button.toolbar-button').isVisible()).toBe(true)
+ expect(wrapper.find('button.toolbar-button').attributes('tabindex')).toEqual('0')
+ expect(wrapper.find('button.toolbar-button').attributes('type')).toEqual('button')
+ expect(wrapper.find('button.toolbar-button').classes('primary')).toBe(false)
+ expect(wrapper.find('button.toolbar-button').classes('secondary')).toBe(true)
+ expect(wrapper.find('button.toolbar-button').classes('has-text')).toBe(false)
+ expect(wrapper.find('button').text()).toEqual(slotContent)
+ })
+
+ describe('props', () => {
+ it('renders the non-icon button', async () => {
+ const slotContent = 'This is the button text'
+
+ const wrapper = mount(ToolbarButton, {
+ props: {
+ icon: false,
+ },
+ slots: {
+ default: h('button', {}, slotContent),
+ },
+ })
+
+ expect(wrapper.find('button.toolbar-button').isVisible()).toBe(true)
+ expect(wrapper.find('button.toolbar-button').attributes('tabindex')).toEqual('0')
+ expect(wrapper.find('button.toolbar-button').attributes('type')).toEqual('button')
+ expect(wrapper.find('button.toolbar-button').classes('has-text')).toBe(true)
+ expect(wrapper.find('button').text()).toEqual(slotContent)
+ })
+
+ it('renders the `primary` appearance', async () => {
+ const slotContent = 'This is the button text'
+
+ const wrapper = mount(ToolbarButton, {
+ props: {
+ icon: false,
+ appearance: 'primary',
+ },
+ slots: {
+ default: h('button', {}, slotContent),
+ },
+ })
+
+ expect(wrapper.find('button.toolbar-button').isVisible()).toBe(true)
+ expect(wrapper.find('button.toolbar-button').attributes('tabindex')).toEqual('0')
+ expect(wrapper.find('button.toolbar-button').attributes('type')).toEqual('button')
+ expect(wrapper.find('button.toolbar-button').classes('primary')).toBe(true)
+ expect(wrapper.find('button.toolbar-button').classes('secondary')).toBe(false)
+ expect(wrapper.find('button.toolbar-button').classes('has-text')).toBe(true)
+ expect(wrapper.find('button').text()).toEqual(slotContent)
+ })
+ })
+})
diff --git a/src/components/toolbar/ToolbarButton.vue b/src/components/toolbar/ToolbarButton.vue
new file mode 100644
index 0000000..d6999b7
--- /dev/null
+++ b/src/components/toolbar/ToolbarButton.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/toolbar/TooltipShortcut.spec.ts b/src/components/toolbar/TooltipShortcut.spec.ts
new file mode 100644
index 0000000..bb27288
--- /dev/null
+++ b/src/components/toolbar/TooltipShortcut.spec.ts
@@ -0,0 +1,63 @@
+import { describe, it, expect } from 'vitest'
+import { mount } from '@vue/test-utils'
+import TooltipShortcut from './TooltipShortcut.vue'
+
+describe(' ', () => {
+ it('renders the shortcut with no keys', async () => {
+ const text = 'Shortcut name'
+
+ const wrapper = mount(TooltipShortcut, {
+ props: {
+ text,
+ },
+ })
+
+ expect(wrapper.find('.tooltip-shortcut').isVisible()).toBe(true)
+ expect(wrapper.findTestId('shortcut-text').text()).toContain(text)
+ expect(wrapper.findTestId('keys').exists()).toBe(false)
+ })
+
+ it('does not render the shortcut if the `text` prop does not have a value', async () => {
+ const wrapper = mount(TooltipShortcut, {
+ props: {
+ text: '',
+ },
+ })
+
+ expect(wrapper.find('.tooltip-shortcut').exists()).toBe(false)
+ })
+
+ it('displays the shortcut text along with a single key', async () => {
+ const text = 'Bold'
+ const keys = ['B']
+
+ const wrapper = mount(TooltipShortcut, {
+ props: {
+ text,
+ keys,
+ },
+ })
+
+ expect(wrapper.find('.tooltip-shortcut').exists()).toBe(true)
+ expect(wrapper.findTestId('shortcut-text').text()).toContain(text)
+ expect(wrapper.findAll('.meta-key').length).toEqual(1)
+ expect(wrapper.findAll('kbd').length).toEqual(keys.length + 1)
+ })
+
+ it('displays the shortcut text along with multiple keys', async () => {
+ const text = 'Strikethrough'
+ const keys = ['Shift', 'X']
+
+ const wrapper = mount(TooltipShortcut, {
+ props: {
+ text,
+ keys,
+ },
+ })
+
+ expect(wrapper.find('.tooltip-shortcut').exists()).toBe(true)
+ expect(wrapper.findTestId('shortcut-text').text()).toContain(text)
+ expect(wrapper.findAll('.meta-key').length).toEqual(1)
+ expect(wrapper.findAll('kbd').length).toEqual(keys.length + 1)
+ })
+})
diff --git a/src/components/toolbar/TooltipShortcut.vue b/src/components/toolbar/TooltipShortcut.vue
new file mode 100644
index 0000000..4e48d77
--- /dev/null
+++ b/src/components/toolbar/TooltipShortcut.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
diff --git a/src/composables/index.ts b/src/composables/index.ts
new file mode 100644
index 0000000..4da2598
--- /dev/null
+++ b/src/composables/index.ts
@@ -0,0 +1,15 @@
+import useDebounce from './useDebounce'
+import useKeyboardShortcuts from './useKeyboardShortcuts'
+import useMarkdownActions from './useMarkdownActions'
+import useMarkdownIt from './useMarkdownIt'
+import useShikiji from './useShikiji'
+import useSyncScroll from './useSyncScroll'
+
+export default {
+ useDebounce,
+ useKeyboardShortcuts,
+ useMarkdownActions,
+ useMarkdownIt,
+ useShikiji,
+ useSyncScroll,
+}
diff --git a/src/composables/useDebounce.ts b/src/composables/useDebounce.ts
new file mode 100644
index 0000000..22d1fe2
--- /dev/null
+++ b/src/composables/useDebounce.ts
@@ -0,0 +1,27 @@
+export default function useDebounce() {
+ /**
+ * Returns a function, that, as long as it continues to be invoked, will not be triggered. The initial function will be called after the debounced function stops being called for a certain number of milliseconds.
+ *
+ * @param initialFunction Initial function to debounce
+ * @param delay Time to wait for recurring bounces
+ * @returns the debounced function.
+ */
+ const debounce = (initialFunction: (...args: any) => any, delay: number): (...args: any) => void => {
+ // Store timeout ID outside the returned function.
+ let timeoutId: number
+
+ return (...args) => {
+ // If the debounced function was already invoked before, this will cancel the earlier timeout; thus, its callback will not be invoked.
+ clearTimeout(timeoutId)
+
+ // Starts a new timer which will call the initial function after the specified wait time unless the debounced function is called again.
+ timeoutId = window?.setTimeout(() => {
+ initialFunction(...args)
+ }, delay)
+ }
+ }
+
+ return {
+ debounce,
+ }
+}
diff --git a/src/composables/useKeyboardShortcuts.ts b/src/composables/useKeyboardShortcuts.ts
new file mode 100644
index 0000000..0cf588c
--- /dev/null
+++ b/src/composables/useKeyboardShortcuts.ts
@@ -0,0 +1,108 @@
+import { computed } from 'vue'
+import type { Ref } from 'vue'
+import useMarkdownActions from '@/composables/useMarkdownActions'
+import { useActiveElement, useMagicKeys } from '@vueuse/core'
+import type { InlineFormat } from '@/types'
+
+/**
+ * Utilize keyboard shortcuts in the markdown editor. Must be called at the root of the `setup` function.
+ * @param {Ref} textareaRef The textarea Vue template ref
+ * @param {Ref} rawMarkdown A Vue ref containing the raw markdown content from the textarea.
+ * @param {Ref} tabSize The current tab size
+ * @param {Function} onEditCallback A function to call after toggling the inline text formatting.
+ * @returns
+ */
+export default function useKeyboardShortcuts(
+ textareaRef: Ref,
+ rawMarkdown: Ref,
+ tabSize: Ref,
+ onEditCallback: () => void,
+) {
+ // The document.activeElement
+ const activeElement = useActiveElement()
+ const textareaIsActive = computed((): boolean => !!activeElement.value?.id && activeElement.value?.id === textareaRef.value?.id)
+ const { toggleInlineFormatting, insertNewLine, getTextSelection, selectedText, toggleTab } = useMarkdownActions(textareaRef, rawMarkdown)
+
+ const getFormatForKeyEvent = (evt: any): InlineFormat | undefined => {
+ let format: InlineFormat | undefined
+
+ // Find mapped keys
+ switch (evt.key) {
+ // Bold
+ case 'b':
+ format = 'bold'
+ break
+ // Italic
+ case 'i':
+ format = 'italic'
+ break
+ // Underline
+ case 'u':
+ format = 'underline'
+ break
+ // Strikethrough (also requires shift modifier)
+ case 'x':
+ if (evt.shiftKey) {
+ format = 'strikethrough'
+ }
+ break
+ // Inline code (also requires shift modifier)
+ case 'c':
+ if (evt.shiftKey) {
+ format = 'code'
+ }
+ break
+ }
+
+ return format
+ }
+
+ // Bind keyboard events
+ useMagicKeys({
+ passive: false,
+ onEventFired(e) {
+ // Exit if the textarea is not active or not a `keydown` event
+ if (!textareaIsActive.value || e.type !== 'keydown') {
+ return
+ }
+
+ // If Control or Meta (Command) is pressed
+ if (e.key && (e.ctrlKey || e.metaKey)) {
+ const format = getFormatForKeyEvent(e)
+ // If the format is set, toggle the formatting
+ if (format) {
+ e.preventDefault()
+ toggleInlineFormatting(format)
+ // Always fire the callback
+ onEditCallback()
+ }
+ }
+
+ // Enter key
+ if (e.key && e.key === 'Enter' && !e.shiftKey) {
+ e.preventDefault()
+ insertNewLine()
+ // Always fire the callback
+ onEditCallback()
+ }
+
+ // Tab key, and Shift + Tab
+ if (e.key && e.key === 'Tab') {
+ getTextSelection()
+
+ // Require an active text selection to bind a tab or shift+tab
+ // This configuration passes the ["no keyboard trap"](https://www.w3.org/TR/WCAG21/#no-keyboard-trap) criterion of the W3C Web Content Accessibility Guidelines
+ if (selectedText.text) {
+ e.preventDefault()
+ if (e.shiftKey) {
+ toggleTab('remove', tabSize.value)
+ } else {
+ toggleTab('add', tabSize.value)
+ }
+ // Always fire the callback
+ onEditCallback()
+ }
+ }
+ },
+ })
+}
diff --git a/src/composables/useMarkdownActions.ts b/src/composables/useMarkdownActions.ts
new file mode 100644
index 0000000..34208d4
--- /dev/null
+++ b/src/composables/useMarkdownActions.ts
@@ -0,0 +1,601 @@
+import { reactive, nextTick } from 'vue'
+import type { Ref } from 'vue'
+import { InlineFormatWrapper, DEFAULT_CODEBLOCK_LANGUAGE, MARKDOWN_TEMPLATE_CODEBLOCK, MARKDOWN_TEMPLATE_TASK, MARKDOWN_TEMPLATE_TASK_COMPLETED, MARKDOWN_TEMPLATE_UL, MARKDOWN_TEMPLATE_OL, MARKDOWN_TEMPLATE_BLOCKQUOTE, MARKDOWN_TEMPLATE_TABLE, NEW_LINE_CHARACTER, MARKDOWN_TEMPLATE_LINK } from '@/constants'
+import type { InlineFormat, MarkdownTemplate } from '@/types'
+
+/**
+ * Utilize the markdown editor actions.
+ * @param {Ref} textareaRef The textarea Vue template ref
+ * @param {Ref} rawMarkdown A Vue ref containing the raw markdown content from the textarea.
+ */
+export default function useMarkdownActions(
+ textareaRef: Ref,
+ rawMarkdown: Ref,
+) {
+ // A reactive object to keep track of the textarea's selection
+ const selectedText = reactive({
+ start: 0,
+ end: 0,
+ text: '',
+ })
+
+ /** Utilize the textareaRef to obtain a reference to the textarea element */
+ const getTextarea = (): HTMLTextAreaElement | null => {
+ if (!textareaRef.value) {
+ throw new Error('getTextarea: Could not find the textarea template ref')
+ }
+
+ return textareaRef.value
+ }
+
+ /** Get the selection within the textarea */
+ const getTextSelection = (): void => {
+ try {
+ const textarea = getTextarea()
+
+ if (!textarea) {
+ return
+ }
+
+ selectedText.start = textarea.selectionStart || 0
+ selectedText.end = textarea.selectionEnd || 0
+ selectedText.text = textarea.value.substring(
+ textarea.selectionStart,
+ textarea.selectionEnd,
+ ) || ''
+ } catch (err) {
+ console.warn('getTextSelection', err)
+ selectedText.start = 0
+ selectedText.end = 0
+ selectedText.text = ''
+ }
+ }
+
+ /** Focus on the textarea and wait a virtual DOM cycle */
+ const focusTextarea = async (): Promise => {
+ const textarea = getTextarea()
+
+ // If no element, exit early
+ if (!textarea) {
+ return
+ }
+
+ // Always focus back on the textarea
+ textarea.focus()
+ // Wait for the DOM to cycle
+ await nextTick()
+ }
+
+ /**
+ * Toggle inline formatting within the textarea. Can be used with and without an active selection.
+ * @param {InlineFormat} format The inline format being added/removed, e.g. 'bold'
+ * @returns {Promise}
+ */
+ const toggleInlineFormatting = async (format: InlineFormat): Promise => {
+ try {
+ const textarea = getTextarea()
+
+ let wrapper: string = ''
+
+ switch (format) {
+ case 'bold':
+ wrapper = InlineFormatWrapper.bold
+ break
+ case 'italic':
+ wrapper = InlineFormatWrapper.italic
+ break
+ case 'underline':
+ wrapper = InlineFormatWrapper.underline
+ break
+ case 'strikethrough':
+ wrapper = InlineFormatWrapper.strikethrough
+ break
+ case 'subscript':
+ wrapper = InlineFormatWrapper.subscript
+ break
+ case 'superscript':
+ wrapper = InlineFormatWrapper.superscript
+ break
+ case 'mark':
+ wrapper = InlineFormatWrapper.mark
+ break
+ case 'code':
+ wrapper = InlineFormatWrapper.code
+ break
+ }
+
+ // If no element or wrapper, exit early
+ if (!textarea || !wrapper) {
+ return
+ }
+
+ // Update the selected text object
+ getTextSelection()
+
+ // Store the length of the `wrapper`
+ const wrapperLength = wrapper.length
+
+ // Get the text before and after the cursor
+ const startText = rawMarkdown.value.substring(0, selectedText.start)
+ const endText = rawMarkdown.value.substring(selectedText.end)
+
+ // If no text is selected, insert the `wrapper` on both sides of the cursor
+ if (selectedText.text.length === 0) {
+ // If the `wrapper` text is to the left and right of the cursor
+ if (startText.endsWith(wrapper) && endText.startsWith(wrapper)) {
+ // Remove the empty wrapper
+ rawMarkdown.value = startText.substring(0, startText.length - wrapperLength) + endText.substring(wrapperLength)
+
+ // Always focus back on the textarea
+ await focusTextarea()
+
+ // Set the cursor position
+ textarea.selectionEnd = selectedText.start - wrapperLength
+
+ return
+ } else {
+ // If the `wrapper` text does not exist to the left and right of the cursor
+ rawMarkdown.value = rawMarkdown.value.substring(0, selectedText.start) + wrapper + wrapper + rawMarkdown.value.substring(selectedText.end)
+
+ // Always focus back on the textarea
+ await focusTextarea()
+
+ // Move the cursor between the `wrapper`
+ textarea.selectionEnd = selectedText.start + wrapperLength
+
+ return
+ }
+ }
+
+ let isWrapped = false
+ const wrapSelected = selectedText.text.startsWith(wrapper) && selectedText.text.endsWith(wrapper)
+ const wrapNotSelected = startText.endsWith(wrapper) && endText.startsWith(wrapper)
+
+ // Check if the selected text is already wrapped with the `wrapper`
+ if (wrapSelected || wrapNotSelected) {
+ isWrapped = true
+ }
+
+ let newText = selectedText.text
+
+ if (!isWrapped) {
+ // Selection is not wrapped
+ newText = wrapper + selectedText.text + wrapper
+ } else if (isWrapped && wrapSelected) {
+ // Selection is wrapped and the wrapper is inside the selection
+ newText = selectedText.text.slice(wrapperLength, -wrapperLength)
+ } else if (isWrapped && wrapNotSelected) {
+ // Selection is wrapped and the wrapper is outside the selection
+ // No changes needed
+ }
+
+ // Replace the selected text with the formatted text
+ if (isWrapped && wrapNotSelected) {
+ rawMarkdown.value = rawMarkdown.value.substring(0, selectedText.start - wrapperLength) + newText + rawMarkdown.value.substring(selectedText.end + wrapperLength)
+ } else {
+ rawMarkdown.value = rawMarkdown.value.substring(0, selectedText.start) + newText + rawMarkdown.value.substring(selectedText.end)
+ }
+
+ // Always focus back on the textarea
+ await focusTextarea()
+
+ // Adjust the selection position
+ if (!isWrapped) {
+ // Selection is not wrapped
+ textarea.setSelectionRange(selectedText.start, selectedText.end + (wrapperLength * 2))
+ } else if (isWrapped && wrapSelected) {
+ // Selection is wrapped and the wrapper is inside the selection
+ textarea.setSelectionRange(selectedText.start, selectedText.end - (wrapperLength * 2))
+ } else if (isWrapped && wrapNotSelected) {
+ // Selection is wrapped and the wrapper is outside the selection
+ textarea.setSelectionRange(selectedText.start - wrapperLength, selectedText.end - wrapperLength)
+ }
+ } catch (err) {
+ console.warn('toggleInlineFormatting', err)
+ }
+ }
+
+ /**
+ * Toggle a tab in the editor at the current cursor position, or for all selected lines.
+ * @param {'add' | 'remove'} action The action being taken in the textarea. One of 'add' or 'remove'.
+ * @param {number} tabSize The value of props.tabSize
+ * @returns {Promise}
+ */
+ const toggleTab = async (action: 'add' | 'remove', tabSize: number): Promise => {
+ try {
+ const textarea = getTextarea()
+
+ if (!textarea) {
+ return
+ }
+
+ // Update the selected text object
+ getTextSelection()
+
+ let spaces = ''
+ Array.from(Array(tabSize).keys()).forEach(() => (spaces += ' '))
+ let lineBreakCount = 0
+
+ const startText = rawMarkdown.value.substring(0, selectedText.start)
+
+ // When removing tabs, ensure string starts with two spaces; or a list item that is already indented. If not, exit
+ if (
+ action === 'remove' &&
+ !startText.endsWith(spaces) &&
+ // Not an unordered list
+ !startText.endsWith(' ' + MARKDOWN_TEMPLATE_UL) &&
+ // Not an ordered list
+ !/ {2}\d{1,}\. $/.test(startText)
+ ) {
+ return
+ }
+
+ // If some text is selected
+ if (selectedText.text.length !== 0) {
+ // Count number of line breaks in selection. Only include a single `\n` or the last of `\n\n`
+ lineBreakCount = (selectedText.text.match(/\n(?!\n)/g) || []).length
+ // If text is selected
+ if (action === 'add') {
+ rawMarkdown.value = startText + spaces + selectedText.text.replace(/\n(?!\n)/g, `${NEW_LINE_CHARACTER}${spaces}`) + rawMarkdown.value.substring(selectedText.end)
+ } else {
+ rawMarkdown.value = rawMarkdown.value.substring(0, selectedText.start - spaces.length) + selectedText.text.replaceAll(`${NEW_LINE_CHARACTER}${spaces}`, NEW_LINE_CHARACTER) + rawMarkdown.value.substring(selectedText.end)
+ }
+ } else {
+ // If text is not selected
+
+ // If text starts with an inline template
+ if (startText.endsWith(MARKDOWN_TEMPLATE_UL)) {
+ rawMarkdown.value = action === 'add' ? rawMarkdown.value.substring(0, selectedText.start - MARKDOWN_TEMPLATE_UL.length) + spaces + MARKDOWN_TEMPLATE_UL + rawMarkdown.value.substring(selectedText.end) : rawMarkdown.value.substring(0, selectedText.start - spaces.length - MARKDOWN_TEMPLATE_UL.length) + MARKDOWN_TEMPLATE_UL + rawMarkdown.value.substring(selectedText.end)
+ } else if (/\d{1,}\. $/.test(startText.split(NEW_LINE_CHARACTER).pop() || '')) {
+ // Remove the `1` in the ordered list template
+ const numberSuffix = MARKDOWN_TEMPLATE_OL.replace('1', '')
+
+ const listNumber = Number((startText.split(NEW_LINE_CHARACTER).at(-2) || startText.split(NEW_LINE_CHARACTER).pop() || '').trimStart().split(numberSuffix)[0]) + 1
+
+ rawMarkdown.value = action === 'add' ? rawMarkdown.value.substring(0, selectedText.start - MARKDOWN_TEMPLATE_OL.length) + spaces + MARKDOWN_TEMPLATE_OL + rawMarkdown.value.substring(selectedText.end) : rawMarkdown.value.substring(0, selectedText.start - spaces.length - (listNumber + numberSuffix).length) + (listNumber + numberSuffix) + rawMarkdown.value.substring(selectedText.end)
+ } else {
+ rawMarkdown.value = action === 'add' ? startText + spaces + rawMarkdown.value.substring(selectedText.end) : rawMarkdown.value.substring(0, selectedText.start - spaces.length) + rawMarkdown.value.substring(selectedText.end)
+ }
+ }
+
+ // Always focus back on the textarea
+ await focusTextarea()
+
+ // Move the cursor and selected text
+ if (selectedText.text.length !== 0) {
+ // Calculate length of selection from line breaks that were replaces
+ const appendedSpacesLength = tabSize + (lineBreakCount * tabSize)
+ // Move the cursor to keep the selected text in the selection
+ textarea.selectionStart = action === 'add' ? selectedText.start + spaces.length : selectedText.start - spaces.length
+ textarea.selectionEnd = action === 'add' ? selectedText.end + appendedSpacesLength : selectedText.end - appendedSpacesLength
+ } else {
+ // Move the cursor to the start of the tabbed text
+ textarea.selectionEnd = action === 'add' ? selectedText.start + spaces.length : selectedText.start - spaces.length
+ }
+ } catch (err) {
+ console.warn('toggleTab', err)
+ }
+ }
+
+ /** Check if the single line template already exists on the line */
+ const singleLineTemplateExists = (startText: string, template: string) => {
+ // Special handling for ordered list items
+ if (template === MARKDOWN_TEMPLATE_OL) {
+ // If the startText begins with `{number}. `
+ return /^\d{1,}\. /.test(String(startText?.split(NEW_LINE_CHARACTER)?.pop() || ''))
+ }
+ // All other templates
+ return String(startText?.split(NEW_LINE_CHARACTER)?.pop() || '').endsWith(template)
+ }
+
+ /**
+ * Insert a markdown template at the current cursor position.
+ * @param {MarkdownTemplate} template The type of markdown template to insert at the current cursor position.
+ * @returns {Promise}
+ */
+ const insertMarkdownTemplate = async (template: MarkdownTemplate): Promise => {
+ try {
+ const textarea = getTextarea()
+
+ if (!textarea || !template) {
+ return
+ }
+
+ // Update the selected text object
+ getTextSelection()
+
+ if (selectedText.text.length !== 0) {
+ return
+ }
+
+ const startText = rawMarkdown.value.substring(0, selectedText.start)
+ // If the previous line is not empty and doesn't already have an empty line above it (if so, empty string)
+ // If the line does not start with a new line, insert two, otherwise, insert one new line
+ const needsNewLine: string = startText.length === 0 || startText.endsWith(`${NEW_LINE_CHARACTER}${NEW_LINE_CHARACTER}`) ? '' : /(.*)?[^\n]$/.test(startText) ? `${NEW_LINE_CHARACTER}${NEW_LINE_CHARACTER}` : NEW_LINE_CHARACTER
+
+ let markdownTemplate: string = ''
+
+ switch (template) {
+ case 'task':
+ // Do nothing if the template already exists
+ if (singleLineTemplateExists(startText, MARKDOWN_TEMPLATE_TASK)) {
+ await focusTextarea()
+ return
+ }
+ // needsNewLine not needed here
+ markdownTemplate =
+ needsNewLine +
+ MARKDOWN_TEMPLATE_TASK
+ break
+ case 'unordered-list':
+ // Do nothing if the template already exists
+ if (singleLineTemplateExists(startText, MARKDOWN_TEMPLATE_UL)) {
+ await focusTextarea()
+ return
+ }
+ // needsNewLine not needed here
+ markdownTemplate =
+ needsNewLine +
+ MARKDOWN_TEMPLATE_UL
+ break
+ case 'ordered-list':
+ // Do nothing if the template already exists
+ if (singleLineTemplateExists(startText, MARKDOWN_TEMPLATE_OL)) {
+ await focusTextarea()
+ return
+ }
+ // needsNewLine not needed here
+ markdownTemplate =
+ needsNewLine +
+ MARKDOWN_TEMPLATE_OL
+ break
+ case 'blockquote':
+ // Do nothing if the template already exists
+ if (singleLineTemplateExists(startText, MARKDOWN_TEMPLATE_BLOCKQUOTE)) {
+ await focusTextarea()
+ return
+ }
+ // needsNewLine not needed here
+ markdownTemplate =
+ needsNewLine +
+ MARKDOWN_TEMPLATE_BLOCKQUOTE
+ break
+ case 'codeblock':
+ markdownTemplate =
+ needsNewLine +
+ MARKDOWN_TEMPLATE_CODEBLOCK
+ break
+ case 'table':
+ markdownTemplate =
+ needsNewLine +
+ MARKDOWN_TEMPLATE_TABLE
+ break
+ }
+
+ // If no template was found, exit
+ if (!markdownTemplate) {
+ return
+ }
+
+ rawMarkdown.value = startText + markdownTemplate + rawMarkdown.value.substring(selectedText.end)
+
+ // Always focus back on the textarea
+ await focusTextarea()
+
+ switch (template) {
+ case 'codeblock':
+ // Move the cursor to the language string of the codeblock
+ // (needsNewLine.length + 3 characters for codeblock ```)
+ textarea.selectionStart = selectedText.start + (needsNewLine.length + 3)
+ // Move the end of the selection to the end of the default language so it is selected
+ textarea.selectionEnd = selectedText.start + (needsNewLine.length + 3) + DEFAULT_CODEBLOCK_LANGUAGE.length
+ break
+ default:
+ // Move the cursor to the end of the table markdown
+ textarea.selectionEnd = selectedText.start + markdownTemplate.length
+ break
+ }
+ } catch (err) {
+ console.warn('insertMarkdownTemplate', err)
+ }
+ }
+
+ /**
+ * Insert a markdown link at the current cursor position.
+ * @returns {Promise}
+ */
+ const insertLink = async (): Promise => {
+ try {
+ const textarea = getTextarea()
+
+ if (!textarea) {
+ return
+ }
+
+ // Update the selected text object
+ getTextSelection()
+
+ // Get the text before and after the cursor
+ const startText = rawMarkdown.value.substring(0, selectedText.start)
+ const endText = rawMarkdown.value.substring(selectedText.end)
+ let newContent: string = ''
+
+ // If text is selected, check the type of selected text and insert the link template around it
+ if (selectedText.text.length !== 0) {
+ // If the user tries to click the button twice (with `url` selected) exit early
+ if (selectedText.text === 'url' && startText.endsWith('(') && endText.startsWith(')')) {
+ await focusTextarea()
+ return
+ }
+
+ // Check if the selected text is a URL
+ const isUrl = /^http(s)?:\/\//.test(selectedText.text)
+ // Prepare the content
+ newContent = isUrl ? MARKDOWN_TEMPLATE_LINK.replace(/text/, '').replace(/url/, selectedText.text) : MARKDOWN_TEMPLATE_LINK.replace(/text/, selectedText.text)
+
+ // Update the markdown
+ rawMarkdown.value = startText + newContent + endText
+
+ // Always focus back on the textarea
+ await focusTextarea()
+
+ // Set the cursor position
+ if (isUrl) {
+ textarea.selectionEnd = selectedText.start + 1
+ } else {
+ textarea.selectionStart = startText.length + selectedText.text.length + 3
+ textarea.selectionEnd = startText.length + selectedText.text.length + 6
+ }
+ } else {
+ // No text is selected
+
+ // If the user tries to click the button twice (with the cursor in between the brackets) exit early
+ if (startText.endsWith(MARKDOWN_TEMPLATE_LINK.split('text')[0]) && /^\]\((.*)+\)/.test(endText)) {
+ await focusTextarea()
+ return
+ }
+
+ // Prepare the content
+ newContent = MARKDOWN_TEMPLATE_LINK.replace(/text/, '')
+
+ let cursorPosition = 1
+
+ // Check if we need a space before or after the template
+ if (/\w+$/.test(startText)) {
+ newContent = ' ' + newContent
+ cursorPosition++
+ } else if (/^\w+/.test(endText)) {
+ newContent += ' '
+ }
+
+ // Update the markdown
+ rawMarkdown.value = startText + newContent + endText
+
+ // Always focus back on the textarea
+ await focusTextarea()
+
+ // Set the cursor position
+ textarea.selectionEnd = selectedText.start + cursorPosition
+ }
+ } catch (err) {
+ console.warn('insertLink', err)
+ }
+ }
+
+ /**
+ * Insert a new line in the editor.
+ * Conditionally addor remove inline templates if the previous line also started with one.
+ * @returns {Promise}
+ */
+ const insertNewLine = async (): Promise => {
+ try {
+ const textarea = getTextarea()
+
+ if (!textarea) {
+ return
+ }
+
+ // Update the selected text object
+ getTextSelection()
+
+ // Check the current line to see if we're within another format block (e.g. list, code, etc.)
+ const startText = rawMarkdown.value.substring(0, selectedText.start)
+ // Grab the last line before the cursor
+ const lastLine = startText?.split(NEW_LINE_CHARACTER)?.pop() || ''
+
+ let newLineContent = NEW_LINE_CHARACTER
+
+ // Should we remove the new line template on second Enter keypress
+ let removeNewLineTemplate = false
+ let templateLength = 0
+
+ const newLineTemplates = [
+ MARKDOWN_TEMPLATE_TASK, // Task template **must** be processed before UL template since they share starting chars
+ MARKDOWN_TEMPLATE_UL,
+ MARKDOWN_TEMPLATE_OL,
+ MARKDOWN_TEMPLATE_BLOCKQUOTE,
+ ]
+
+ // Loop through the new line templates.
+ // If the last line before the \n starts with any formatting templates, also inject the template into the next line
+ for (const template of newLineTemplates) {
+ // Special handling for Ordered Lists
+ if (template === MARKDOWN_TEMPLATE_OL) {
+ if (/^\d{1,}\. /.test(lastLine.trimStart())) {
+ // Remove the `1` in the ordered list template
+ const numberSuffix = MARKDOWN_TEMPLATE_OL.replace('1', '')
+ // Split the line by the `. ` string after the number, and get the first entry (which should be the list number)
+ const listNumber = Number(lastLine.trimStart().split(numberSuffix)[0])
+ if (!isNaN(listNumber) && listNumber > 0) {
+ // Increment the number for the next list item
+ const newLineNumber: number = listNumber + 1
+ // Get the template length
+ templateLength = String(newLineNumber + numberSuffix).length
+
+ // If the last list item is empty, remove the template instead
+ if (/^\d{1,}\. $/.test(lastLine.trimStart())) {
+ removeNewLineTemplate = true
+ } else {
+ // Add a new line appended with the same template with indentation, if applicable
+ newLineContent += lastLine.split(listNumber + numberSuffix)[0] + newLineNumber + numberSuffix
+ }
+ }
+ // We found a match, so exit the loop
+ break
+ }
+ } else {
+ // All other templates (other than ordered list)
+
+ // Check if completed task item
+ const isCompletedTask = template === MARKDOWN_TEMPLATE_TASK && lastLine.trimStart().toLowerCase().startsWith(MARKDOWN_TEMPLATE_TASK_COMPLETED.toLowerCase())
+
+ if (lastLine.trimStart().startsWith(template) || isCompletedTask) {
+ templateLength = template.length
+ // If the last list item is empty, remove the template instead
+ if (lastLine.trimStart() === template) {
+ removeNewLineTemplate = true
+ } else {
+ // Add a new line appended with the same template with indentation, if applicable
+ if (isCompletedTask) {
+ newLineContent += lastLine.toLowerCase().split(MARKDOWN_TEMPLATE_TASK_COMPLETED.toLowerCase())[0] + template
+ } else {
+ newLineContent += lastLine.split(template)[0] + template
+ }
+ }
+ // We found a match, so exit the loop
+ break
+ }
+ }
+ }
+
+ let indentationSpaces = ''
+ // If newline template is not needed, check if we should keep the indentation level
+ if (newLineContent === NEW_LINE_CHARACTER) {
+ Array.from(Array(lastLine.length - lastLine.trimStart().length).keys()).forEach(() => (indentationSpaces += ' '))
+ }
+
+ // Update the raw markdown content
+ rawMarkdown.value = removeNewLineTemplate
+ ? rawMarkdown.value.substring(0, selectedText.start - lastLine.length) + rawMarkdown.value.substring(selectedText.end)
+ : (startText + newLineContent + indentationSpaces + rawMarkdown.value.substring(selectedText.end))
+
+ // Always focus back on the textarea
+ await focusTextarea()
+
+ // Update the cursor position
+ textarea.selectionEnd = removeNewLineTemplate ? selectedText.start - templateLength : selectedText.start + newLineContent.length + indentationSpaces.length
+ } catch (err) {
+ console.warn('insertNewLine', err)
+ }
+ }
+
+ return {
+ selectedText,
+ getTextSelection,
+ toggleInlineFormatting,
+ toggleTab,
+ insertMarkdownTemplate,
+ insertLink,
+ insertNewLine,
+ }
+}
diff --git a/src/composables/useMarkdownIt.ts b/src/composables/useMarkdownIt.ts
new file mode 100644
index 0000000..b077ae0
--- /dev/null
+++ b/src/composables/useMarkdownIt.ts
@@ -0,0 +1,134 @@
+import { ref } from 'vue'
+import useShikiji from '@/composables/useShikiji'
+import { NEW_LINE_CHARACTER, COPY_ICON_SVG, HEADER_LINK_ICON_SVG } from '@/constants'
+import type { Theme } from '@/types'
+
+// markdown-it
+import MarkdownIt from 'markdown-it'
+import abbreviation from 'markdown-it-abbr'
+import anchor from 'markdown-it-anchor'
+import attrs from 'markdown-it-attrs'
+import deflist from 'markdown-it-deflist'
+// @ts-ignore - export does exist
+import { full as emoji } from 'markdown-it-emoji'
+import footnote from 'markdown-it-footnote'
+import insert from 'markdown-it-ins'
+import mark from 'markdown-it-mark'
+import subscript from 'markdown-it-sub'
+import superscript from 'markdown-it-sup'
+import tasklists from 'markdown-it-task-lists'
+import markdownItTextualUml from 'markdown-it-textual-uml'
+import slugify from '@sindresorhus/slugify'
+
+// MarkdownIt instance
+const md = ref()
+
+export default function useMarkdownIt() {
+ /** Initialize markdown-it - ideally called in the `onBeforeMount` hook */
+ const init = async (theme: Theme = 'light'): Promise => {
+ const { MarkdownItShikiji } = useShikiji()
+
+ md.value = MarkdownIt({
+ html: false, // Keep disabled to prevent XSS
+ xhtmlOut: true, // Use '/' to close single tags ( )
+ linkify: true, // Autoconvert URL-like text to links
+ breaks: true, // Convert '\n' in paragraphs into
+ typographer: true, // Enable some language-neutral replacement + quotes beautification
+ quotes: '“”‘’',
+ })
+ .use(await MarkdownItShikiji(theme))
+ .use(anchor, {
+ level: 2,
+ slugify: s => slugify(s),
+ permalink: anchor.permalink.ariaHidden({
+ placement: 'before',
+ class: 'header-anchor', // The class applied to the anchor tag; allows for styling
+ // Utilize an SVG icon instead of a `#` string
+ symbol: HEADER_LINK_ICON_SVG,
+ }),
+ })
+ .use(abbreviation)
+ .use(attrs, {
+ // optional, these are default options
+ leftDelimiter: '{{', // Do not use single curly, it will conflict with code line syntax highlighting
+ rightDelimiter: '}}', // Do not use single curly, it will conflict with code line syntax highlighting
+ allowedAttributes: ['id', 'class', 'style', 'target', 'rel', /^data.*$/], // allow-list
+ })
+ .use(markdownItTextualUml)
+ .use(deflist)
+ .use(emoji)
+ .use(footnote)
+ .use(insert)
+ .use(mark)
+ .use(subscript)
+ .use(superscript)
+ .use(tasklists, {
+ label: true,
+ enabled: false, // Not enabled since checking the box doesn't update the markdown
+ })
+
+ // disable converting email to link
+ md.value.linkify.set({ fuzzyLink: false })
+
+ // Customize table element
+ md.value.renderer.rules.table_open = () => '' + NEW_LINE_CHARACTER
+ md.value.renderer.rules.table_close = () => '
' + NEW_LINE_CHARACTER
+
+ const getDefaultRenderer = (original: any): Function => {
+ return original || function(tokens: Record[], idx: number, options: Record, env: any, self: Record) {
+ return self.renderToken(tokens, idx, options)
+ }
+ }
+
+ // Configure custom external links
+ const defaultLinkRenderer = getDefaultRenderer(md.value.renderer.rules.link_open)
+ const externalAnchorAttributes: Record = { target: '_blank' }
+ md.value.renderer.rules.link_open = (tokens: Record[], idx: number, options: Record, env: any, self: Record) => {
+ Object.keys(externalAnchorAttributes).forEach((attribute: string) => {
+ const aIndex = tokens[idx].attrIndex(attribute)
+ const value = externalAnchorAttributes[attribute]
+ if (tokens[idx].attrs?.length && String(tokens[idx].attrs[0] || '').includes('http')) {
+ if (aIndex < 0) {
+ tokens[idx].attrPush([attribute, value]) // add new attribute
+ } else {
+ tokens[idx].attrs[aIndex][1] = value
+ }
+ }
+ })
+ return defaultLinkRenderer(tokens, idx, options, env, self)
+ }
+
+ // Configure custom code blocks
+ const defaultCodeblockRenderer = getDefaultRenderer(md.value.renderer.rules.fence)
+ md.value.renderer.rules.fence = (tokens: Record[], idx: number, options: Record, env: any, self: Record) => {
+ const content: string = tokens[idx].content
+ // Strip out double-quote characters
+ .replace(/"/g, '"')
+ // Strip out single-quote characters
+ .replace(/'/g, ''')
+ // Remove a trailing new line character, if it exists
+ .replace(/\n$/, '')
+ const originalContent = defaultCodeblockRenderer(tokens, idx, options, env, self)
+
+ if (content.length === 0) {
+ return originalContent
+ }
+
+ // Styles injected from `src/components/MarkdownContent.vue`
+ // The event is bound to an element with `.kong-markdown-code-block-copy[data-copytext]`
+ return `
+
+ ${originalContent}
+
+ ${COPY_ICON_SVG}
+
+
+ `
+ }
+ }
+
+ return {
+ md,
+ init,
+ }
+}
diff --git a/src/composables/useShikiji.ts b/src/composables/useShikiji.ts
new file mode 100644
index 0000000..ec32d54
--- /dev/null
+++ b/src/composables/useShikiji.ts
@@ -0,0 +1,199 @@
+import { fromHighlighter } from 'markdown-it-shikiji/core'
+import { getHighlighterCore } from 'shikiji/core'
+import { getWasmInlined } from 'shikiji/wasm'
+import type { Theme } from '@/types'
+
+export default function useShikiji() {
+ const MarkdownItShikiji = async (theme: Theme = 'light') => {
+ const highlighter = await getHighlighterCore({
+ themes: [
+ import('shikiji/themes/material-theme-lighter.mjs'),
+ import('shikiji/themes/material-theme-palenight.mjs'),
+ ],
+ // TODO: For now, I'm including all languages but this bumps up the package size ~6MB
+ langs: [
+ import('shikiji/langs/abap.mjs'),
+ import('shikiji/langs/actionscript-3.mjs'),
+ import('shikiji/langs/ada.mjs'),
+ import('shikiji/langs/apache.mjs'),
+ import('shikiji/langs/apex.mjs'),
+ import('shikiji/langs/apl.mjs'),
+ import('shikiji/langs/applescript.mjs'),
+ import('shikiji/langs/ara.mjs'),
+ import('shikiji/langs/asm.mjs'),
+ import('shikiji/langs/astro.mjs'),
+ import('shikiji/langs/awk.mjs'),
+ import('shikiji/langs/ballerina.mjs'),
+ import('shikiji/langs/bat.mjs'),
+ import('shikiji/langs/beancount.mjs'),
+ import('shikiji/langs/berry.mjs'),
+ import('shikiji/langs/bibtex.mjs'),
+ import('shikiji/langs/bicep.mjs'),
+ import('shikiji/langs/blade.mjs'),
+ import('shikiji/langs/c.mjs'),
+ import('shikiji/langs/cadence.mjs'),
+ import('shikiji/langs/clarity.mjs'),
+ import('shikiji/langs/clojure.mjs'),
+ import('shikiji/langs/cmake.mjs'),
+ import('shikiji/langs/cobol.mjs'),
+ import('shikiji/langs/codeql.mjs'),
+ import('shikiji/langs/coffee.mjs'),
+ import('shikiji/langs/cpp.mjs'),
+ import('shikiji/langs/crystal.mjs'),
+ import('shikiji/langs/csharp.mjs'),
+ import('shikiji/langs/css.mjs'),
+ import('shikiji/langs/csv.mjs'),
+ import('shikiji/langs/cue.mjs'),
+ import('shikiji/langs/cypher.mjs'),
+ import('shikiji/langs/d.mjs'),
+ import('shikiji/langs/dart.mjs'),
+ import('shikiji/langs/dax.mjs'),
+ import('shikiji/langs/diff.mjs'),
+ import('shikiji/langs/docker.mjs'),
+ import('shikiji/langs/dream-maker.mjs'),
+ import('shikiji/langs/elixir.mjs'),
+ import('shikiji/langs/elm.mjs'),
+ import('shikiji/langs/erb.mjs'),
+ import('shikiji/langs/erlang.mjs'),
+ import('shikiji/langs/fish.mjs'),
+ import('shikiji/langs/fsharp.mjs'),
+ import('shikiji/langs/gdresource.mjs'),
+ import('shikiji/langs/gdscript.mjs'),
+ import('shikiji/langs/gdshader.mjs'),
+ import('shikiji/langs/gherkin.mjs'),
+ import('shikiji/langs/git-commit.mjs'),
+ import('shikiji/langs/git-rebase.mjs'),
+ import('shikiji/langs/glimmer-js.mjs'),
+ import('shikiji/langs/glimmer-ts.mjs'),
+ import('shikiji/langs/glsl.mjs'),
+ import('shikiji/langs/gnuplot.mjs'),
+ import('shikiji/langs/go.mjs'),
+ import('shikiji/langs/graphql.mjs'),
+ import('shikiji/langs/groovy.mjs'),
+ import('shikiji/langs/hack.mjs'),
+ import('shikiji/langs/haml.mjs'),
+ import('shikiji/langs/handlebars.mjs'),
+ import('shikiji/langs/haskell.mjs'),
+ import('shikiji/langs/hcl.mjs'),
+ import('shikiji/langs/hjson.mjs'),
+ import('shikiji/langs/hlsl.mjs'),
+ import('shikiji/langs/html.mjs'),
+ import('shikiji/langs/imba.mjs'),
+ import('shikiji/langs/ini.mjs'),
+ import('shikiji/langs/java.mjs'),
+ import('shikiji/langs/javascript.mjs'),
+ import('shikiji/langs/jinja.mjs'),
+ import('shikiji/langs/jison.mjs'),
+ import('shikiji/langs/json.mjs'),
+ import('shikiji/langs/json5.mjs'),
+ import('shikiji/langs/jsonc.mjs'),
+ import('shikiji/langs/jsonl.mjs'),
+ import('shikiji/langs/jsonnet.mjs'),
+ import('shikiji/langs/jssm.mjs'),
+ import('shikiji/langs/jsx.mjs'),
+ import('shikiji/langs/julia.mjs'),
+ import('shikiji/langs/kotlin.mjs'),
+ import('shikiji/langs/kusto.mjs'),
+ import('shikiji/langs/latex.mjs'),
+ import('shikiji/langs/less.mjs'),
+ import('shikiji/langs/liquid.mjs'),
+ import('shikiji/langs/lisp.mjs'),
+ import('shikiji/langs/logo.mjs'),
+ import('shikiji/langs/lua.mjs'),
+ import('shikiji/langs/make.mjs'),
+ import('shikiji/langs/markdown.mjs'),
+ import('shikiji/langs/marko.mjs'),
+ import('shikiji/langs/matlab.mjs'),
+ import('shikiji/langs/mdc.mjs'),
+ import('shikiji/langs/mdx.mjs'),
+ import('shikiji/langs/mermaid.mjs'),
+ import('shikiji/langs/mojo.mjs'),
+ import('shikiji/langs/narrat.mjs'),
+ import('shikiji/langs/nextflow.mjs'),
+ import('shikiji/langs/nginx.mjs'),
+ import('shikiji/langs/nim.mjs'),
+ import('shikiji/langs/nix.mjs'),
+ import('shikiji/langs/nushell.mjs'),
+ import('shikiji/langs/objective-c.mjs'),
+ import('shikiji/langs/objective-cpp.mjs'),
+ import('shikiji/langs/ocaml.mjs'),
+ import('shikiji/langs/pascal.mjs'),
+ import('shikiji/langs/perl.mjs'),
+ import('shikiji/langs/php.mjs'),
+ import('shikiji/langs/plsql.mjs'),
+ import('shikiji/langs/postcss.mjs'),
+ import('shikiji/langs/powerquery.mjs'),
+ import('shikiji/langs/powershell.mjs'),
+ import('shikiji/langs/prisma.mjs'),
+ import('shikiji/langs/prolog.mjs'),
+ import('shikiji/langs/proto.mjs'),
+ import('shikiji/langs/pug.mjs'),
+ import('shikiji/langs/puppet.mjs'),
+ import('shikiji/langs/purescript.mjs'),
+ import('shikiji/langs/python.mjs'),
+ import('shikiji/langs/r.mjs'),
+ import('shikiji/langs/raku.mjs'),
+ import('shikiji/langs/razor.mjs'),
+ import('shikiji/langs/reg.mjs'),
+ import('shikiji/langs/rel.mjs'),
+ import('shikiji/langs/riscv.mjs'),
+ import('shikiji/langs/rst.mjs'),
+ import('shikiji/langs/ruby.mjs'),
+ import('shikiji/langs/rust.mjs'),
+ import('shikiji/langs/sas.mjs'),
+ import('shikiji/langs/sass.mjs'),
+ import('shikiji/langs/scala.mjs'),
+ import('shikiji/langs/scheme.mjs'),
+ import('shikiji/langs/scss.mjs'),
+ import('shikiji/langs/shaderlab.mjs'),
+ import('shikiji/langs/shellscript.mjs'),
+ import('shikiji/langs/shellsession.mjs'),
+ import('shikiji/langs/smalltalk.mjs'),
+ import('shikiji/langs/solidity.mjs'),
+ import('shikiji/langs/sparql.mjs'),
+ import('shikiji/langs/splunk.mjs'),
+ import('shikiji/langs/sql.mjs'),
+ import('shikiji/langs/ssh-config.mjs'),
+ import('shikiji/langs/stata.mjs'),
+ import('shikiji/langs/stylus.mjs'),
+ import('shikiji/langs/svelte.mjs'),
+ import('shikiji/langs/swift.mjs'),
+ import('shikiji/langs/system-verilog.mjs'),
+ import('shikiji/langs/tasl.mjs'),
+ import('shikiji/langs/tcl.mjs'),
+ import('shikiji/langs/tex.mjs'),
+ import('shikiji/langs/toml.mjs'),
+ import('shikiji/langs/tsx.mjs'),
+ import('shikiji/langs/turtle.mjs'),
+ import('shikiji/langs/twig.mjs'),
+ import('shikiji/langs/typescript.mjs'),
+ import('shikiji/langs/v.mjs'),
+ import('shikiji/langs/vb.mjs'),
+ import('shikiji/langs/verilog.mjs'),
+ import('shikiji/langs/vhdl.mjs'),
+ import('shikiji/langs/viml.mjs'),
+ import('shikiji/langs/vue.mjs'),
+ import('shikiji/langs/vue-html.mjs'),
+ import('shikiji/langs/vyper.mjs'),
+ import('shikiji/langs/wasm.mjs'),
+ import('shikiji/langs/wenyan.mjs'),
+ import('shikiji/langs/wgsl.mjs'),
+ import('shikiji/langs/wolfram.mjs'),
+ import('shikiji/langs/xml.mjs'),
+ import('shikiji/langs/xsl.mjs'),
+ import('shikiji/langs/yaml.mjs'),
+ import('shikiji/langs/zenscript.mjs'),
+ import('shikiji/langs/zig.mjs'),
+ ],
+ loadWasm: getWasmInlined,
+ })
+
+ return fromHighlighter(highlighter, {
+ theme: theme === 'light' ? 'material-theme-lighter' : 'material-theme-palenight',
+ })
+ }
+
+ return {
+ MarkdownItShikiji,
+ }
+}
diff --git a/src/composables/useSyncScroll.ts b/src/composables/useSyncScroll.ts
new file mode 100644
index 0000000..d7e4044
--- /dev/null
+++ b/src/composables/useSyncScroll.ts
@@ -0,0 +1,48 @@
+import type { Ref } from 'vue'
+
+export default function useSyncScroll(scrollableClass: Ref) {
+ // Keep scroll containers in sync
+ const handleScroll = (e: Event) => {
+ const syncScroll = (scrolledEle: Element, ele: Element) => {
+ const scrolledPercent = scrolledEle.scrollTop / (scrolledEle.scrollHeight - scrolledEle.clientHeight)
+ const top = scrolledPercent * (ele.scrollHeight - ele.clientHeight)
+
+ const scrolledWidthPercent = scrolledEle.scrollLeft / (scrolledEle.scrollWidth - scrolledEle.clientWidth)
+ const left = scrolledWidthPercent * (ele.scrollWidth - ele.clientWidth)
+
+ ele.scrollTo({
+ behavior: 'instant', // must be instant
+ top,
+ left,
+ })
+ }
+
+ const scrolledEle = e.target
+
+ Array.from([...document.querySelectorAll(`.${scrollableClass.value}`)]).filter((item) => item !== scrolledEle).forEach((ele: Element) => {
+ ele.removeEventListener('scroll', handleScroll)
+ // @ts-ignore
+ syncScroll(scrolledEle, ele)
+ window.requestAnimationFrame(() => {
+ ele.addEventListener('scroll', handleScroll)
+ })
+ })
+ }
+
+ const initializeSyncScroll = (): void => {
+ document?.querySelectorAll(`.${scrollableClass.value}`)?.forEach((el) => {
+ el?.addEventListener('scroll', handleScroll)
+ })
+ }
+
+ const destroySyncScroll = (): void => {
+ document?.querySelectorAll(`.${scrollableClass.value}`)?.forEach((el) => {
+ el?.removeEventListener('scroll', handleScroll)
+ })
+ }
+
+ return {
+ initializeSyncScroll,
+ destroySyncScroll,
+ }
+}
diff --git a/src/constants.ts b/src/constants.ts
new file mode 100644
index 0000000..a8cf060
--- /dev/null
+++ b/src/constants.ts
@@ -0,0 +1,54 @@
+/** The time, in milliseconds, to debounce the textarea input event */
+export const EDITOR_DEBOUNCE_TIMEOUT: number = 400
+
+export const DEFAULT_CODEBLOCK_LANGUAGE: string = 'markdown'
+
+export enum InlineFormatWrapper {
+ bold = '**',
+ italic = '_',
+ underline = '++',
+ strikethrough = '~~',
+ subscript = '~',
+ superscript = '^',
+ mark = '==',
+ code = '`',
+}
+
+/** The height of the .markdown-ui-toolbar */
+export const TOOLBAR_HEIGHT: string = '36px'
+
+/** The markdown new line character */
+export const NEW_LINE_CHARACTER = '\n'
+
+/** The markdown template for a codeblock */
+export const MARKDOWN_TEMPLATE_CODEBLOCK =
+'```' + DEFAULT_CODEBLOCK_LANGUAGE + NEW_LINE_CHARACTER +
+NEW_LINE_CHARACTER +
+'```'
+
+/** The markdown template for a table */
+export const MARKDOWN_TEMPLATE_TABLE =
+'| Header | Header | Header |' + NEW_LINE_CHARACTER +
+'| :--- | :--- | :--- |' + NEW_LINE_CHARACTER +
+'| Cell | Cell | Cell |'
+
+/** The markdown template for a task. Ensure trailing space remains */
+export const MARKDOWN_TEMPLATE_TASK = '- [ ] '
+export const MARKDOWN_TEMPLATE_TASK_COMPLETED = '- [x] '
+
+/** The markdown template for an unordered list. Ensure trailing space remains */
+export const MARKDOWN_TEMPLATE_UL = '- '
+/** The markdown template for an ordered list. Ensure trailing space remains */
+export const MARKDOWN_TEMPLATE_OL = '1. '
+
+/** The markdown template for a blockquote. Ensure trailing space remains */
+export const MARKDOWN_TEMPLATE_BLOCKQUOTE = '> '
+
+/** The markdown link template */
+export const MARKDOWN_TEMPLATE_LINK = '[text](url)'
+
+/** The inline SVG copy icon */
+export const COPY_ICON_SVG = ' '
+
+/** The inline SVG to display as a header link */
+export const HEADER_LINK_ICON_SVG = ''
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000..5287664
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,5 @@
+import MarkdownUi from '@/components/MarkdownUi.vue'
+
+export { MarkdownUi }
+
+export * from './types'
diff --git a/src/injection-keys.ts b/src/injection-keys.ts
new file mode 100644
index 0000000..40e33a0
--- /dev/null
+++ b/src/injection-keys.ts
@@ -0,0 +1,8 @@
+// NOTE: Do not export these injection keys from the package
+export const UNIQUE_ID_INJECTION_KEY = Symbol('The unique id that prefixes all identifiers within a single instance of the component')
+export const TEXTAREA_ID_INJECTION_KEY = Symbol('Textarea unique id')
+export const MODE_INJECTION_KEY = Symbol('Markdown component mode')
+export const EDITABLE_INJECTION_KEY = Symbol('Is the markdown component editable')
+export const FULLSCREEN_INJECTION_KEY = Symbol('Is the markdown component displaying fullscreen')
+export const THEME_INJECTION_KEY = Symbol('Active theme, light or dark')
+export const HTML_PREVIEW_INJECTION_KEY = Symbol('Is the html preview enabled')
diff --git a/src/markdown-it.plugins.d.ts b/src/markdown-it.plugins.d.ts
new file mode 100644
index 0000000..6eed705
--- /dev/null
+++ b/src/markdown-it.plugins.d.ts
@@ -0,0 +1,9 @@
+// These plugins do not export type interfaces
+declare module 'markdown-it-abbr'
+declare module 'markdown-it-deflist'
+declare module 'markdown-it-ins'
+declare module 'markdown-it-mark'
+declare module 'markdown-it-sub'
+declare module 'markdown-it-sup'
+declare module 'markdown-it-task-lists'
+declare module 'markdown-it-textual-uml'
diff --git a/src/types/index.ts b/src/types/index.ts
new file mode 100644
index 0000000..97fdbc2
--- /dev/null
+++ b/src/types/index.ts
@@ -0,0 +1,4 @@
+// Export all types and interfaces from this index.ts
+// The actual types and interfaces should be contained in separate files within this folder.
+
+export * from '@/types/markdown-ui'
diff --git a/src/types/markdown-ui.ts b/src/types/markdown-ui.ts
new file mode 100644
index 0000000..2a36943
--- /dev/null
+++ b/src/types/markdown-ui.ts
@@ -0,0 +1,50 @@
+// Get a generic `@kong/icons` interface for the option prop
+import type { BoldIcon as GenericIcon } from '@kong/icons'
+
+/** The current mode of the markdown component */
+export type MarkdownMode =
+| 'read'
+| 'edit'
+| 'split'
+| 'preview'
+
+/** The text format to insert/wrap selection */
+export type InlineFormat =
+ | 'bold'
+ | 'italic'
+ | 'underline'
+ | 'strikethrough'
+ | 'subscript'
+ | 'superscript'
+ | 'mark'
+ | 'code'
+ | 'link'
+
+export interface FormatOption {
+ label: string
+ action: InlineFormat
+ icon: typeof GenericIcon
+ keys?: string[]
+}
+
+/** The type of markdown template to insert */
+export type MarkdownTemplate =
+ | 'table'
+ | 'codeblock'
+ | 'task'
+ | 'unordered-list'
+ | 'ordered-list'
+ | 'blockquote'
+
+export interface TemplateOption {
+ label: string
+ action: MarkdownTemplate
+ icon: typeof GenericIcon
+}
+
+export interface TextAreaInputEvent {
+ target: Pick
+}
+
+/** The color theme of the component */
+export type Theme = 'light' | 'dark'
diff --git a/src/vue-test-utils.d.ts b/src/vue-test-utils.d.ts
new file mode 100644
index 0000000..3305764
--- /dev/null
+++ b/src/vue-test-utils.d.ts
@@ -0,0 +1,7 @@
+import type { DOMWrapper } from '@vue/test-utils'
+
+declare module '@vue/test-utils' {
+ export class VueWrapper {
+ findTestId(dataTestid: string): DOMWrapper;
+ }
+}
diff --git a/tsconfig.build.json b/tsconfig.build.json
new file mode 100644
index 0000000..bd78f9e
--- /dev/null
+++ b/tsconfig.build.json
@@ -0,0 +1,12 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "noEmit": false
+ },
+ "exclude": [
+ "sandbox",
+ "node_modules",
+ "dist",
+ "src/**/*.spec.ts",
+ ],
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..a6f4221
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,36 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.json",
+ "compilerOptions": {
+ "moduleResolution": "Bundler",
+ "strict": true,
+ "jsx": "preserve",
+ "importHelpers": true,
+ "sourceMap": true,
+ "baseUrl": ".",
+ "lib": [
+ "esnext",
+ "dom",
+ "dom.iterable"
+ ],
+ "outDir": "dist",
+ "declaration": true,
+ "declarationDir": "dist/types",
+ "types": [
+ "vite/client",
+ "@types/node"
+ ],
+ "paths": {
+ "@/*": [
+ "src/*"
+ ]
+ },
+ },
+ "include": [
+ "src/**/*.ts",
+ "src/**/*.vue"
+ ],
+ "exclude": [
+ "node_modules",
+ "dist",
+ ]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..272a530
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,81 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import path, { join } from 'path'
+import { visualizer } from 'rollup-plugin-visualizer'
+
+// Include the rollup-plugin-visualizer if the BUILD_VISUALIZER env var is set to "true"
+const buildVisualizerPlugin = process.env.BUILD_VISUALIZER
+ ? visualizer({
+ filename: path.resolve(__dirname, 'bundle-analyzer/stats-treemap.html'),
+ template: 'treemap', // sunburst|treemap|network
+ sourcemap: true,
+ gzipSize: true,
+ })
+ : undefined
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue(),
+ ],
+ resolve: {
+ alias: {
+ // Alias src directory for imports
+ '@': path.resolve(__dirname, './src/'),
+ },
+ },
+ css: {
+ devSourcemap: true,
+ preprocessorOptions: {
+ scss: {
+ // Inject the @kong/design-tokens SCSS variables to make them available for all components.
+ // This is not needed in host applications.
+ additionalData: '@use "sass:color";@import "@kong/design-tokens/tokens/scss/variables";',
+ },
+ },
+ },
+ // TODO: If deploying to GitHub pages, enable this line
+ base: process.env.USE_SANDBOX ? '/markdown/' : '/',
+ build: {
+ lib: process.env.USE_SANDBOX
+ ? undefined
+ : {
+ entry: path.resolve(__dirname, 'src/index.ts'),
+ name: 'KongMarkdown',
+ fileName: (format) => `kong-markdown.${format}.js`,
+ },
+ emptyOutDir: true,
+ minify: true,
+ sourcemap: true,
+ rollupOptions: {
+ external: process.env.USE_SANDBOX ? undefined : ['vue'],
+ output: process.env.USE_SANDBOX
+ ? undefined
+ : {
+ globals: {
+ vue: 'Vue',
+ },
+ exports: 'named',
+ },
+ plugins: [
+ // visualizer must remain last in the list of plugins
+ buildVisualizerPlugin,
+ ],
+ },
+ },
+ optimizeDeps: {
+ include: [
+ 'vue',
+ ],
+ },
+ server: {
+ open: !!process.env.USE_SANDBOX,
+ fs: {
+ // Allow serving files from one level up from the package root - IMPORTANT - to support the sandbox
+ allow: [join(__dirname, '..')],
+ },
+ },
+ // Change the root when utilizing the sandbox via USE_SANDBOX=true to use the `/sandbox/*` files
+ // During the build process, the `/sandbox/*` files are not used and we should default to the package root.
+ root: process.env.USE_SANDBOX ? './sandbox' : process.cwd(),
+})
diff --git a/vitest.config.ts b/vitest.config.ts
new file mode 100644
index 0000000..099729a
--- /dev/null
+++ b/vitest.config.ts
@@ -0,0 +1,25 @@
+import { defineConfig, mergeConfig } from 'vitest/config'
+import viteConfig from './vite.config'
+
+// @ts-ignore
+export default mergeConfig(viteConfig, defineConfig({
+ test: {
+ globals: true,
+ environment: 'jsdom',
+ include: ['**/*.spec.ts'],
+ exclude: [
+ './dist/**',
+ './sandbox/**',
+ 'node_modules',
+ ],
+ setupFiles: ['./vitest.setup.ts'],
+ deps: {
+ optimizer: {
+ web: {
+ // https://github.com/vitest-dev/vitest/issues/4074
+ exclude: ['vue'],
+ },
+ },
+ },
+ },
+}))
diff --git a/vitest.setup.ts b/vitest.setup.ts
new file mode 100644
index 0000000..d0fcf43
--- /dev/null
+++ b/vitest.setup.ts
@@ -0,0 +1,15 @@
+import { config } from '@vue/test-utils'
+
+const DataTestIdPlugin = (wrapper: any) => {
+ /** Find element by `data-testid` selector */
+ const findTestId = (dataTestid: string): any => {
+ const dataSelector = `[data-testid="${dataTestid}"]`
+ return wrapper.find(dataSelector)
+ }
+
+ return {
+ findTestId,
+ }
+}
+
+config.plugins.VueWrapper.install(DataTestIdPlugin)