diff --git a/.dockerignore b/.dockerignore index f7fcf12934..5b670f7647 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,5 +9,9 @@ /frontend/dist /frontend/.env.* /frontend/public/environment.* +/frontend-old/data +/frontend-old/dist +/frontend-old/.env.* +/frontend-old/public/environment.* **/vendor/ **/node_modules/ diff --git a/common/eslint-local-rules/__tests__/matchingTranslationKeys.spec.js b/common/eslint-local-rules/__tests__/matchingTranslationKeys.spec.js index 19f7c05694..1c3b72eaf6 100644 --- a/common/eslint-local-rules/__tests__/matchingTranslationKeys.spec.js +++ b/common/eslint-local-rules/__tests__/matchingTranslationKeys.spec.js @@ -39,37 +39,37 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { valid: [ { name: 'allows correct key in js', - code: '$tc("components.hello.world")', + code: '$t("components.hello.world")', options: options, filename: '/src/components/hello.js', }, { name: 'allows correct key in vue component js', - code: '', + code: '', options: options, filename: '/src/components/HelloWorld.vue', }, { name: 'allows correct key in vue component setup script', - code: '', + code: '', options: options, filename: '/src/components/HelloWorld.vue', }, { name: 'allows correct key in scoped use in vue component js', - code: '', + code: '', options: options, filename: '/src/components/HelloWorld.vue', }, { name: 'allows correct key in vue component template mustache syntax', - code: '', + code: '', options: options, filename: '/src/components/HelloWorld.vue', }, { name: 'allows correct key in vue component template v-bind', - code: '', + code: '', options: options, filename: '/src/components/HelloWorld.vue', }, @@ -93,37 +93,37 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'allows global key, based on ignoreKeysRegex', - code: '$tc("global.something")', + code: '$t("global.something")', options: options, filename: '/src/components/hello.js', }, { name: 'allows correct key with complex directory names', - code: '$tc("components.camelCase.kebabCase.pascalCase.withPeriod.hello.world")', + code: '$t("components.camelCase.kebabCase.pascalCase.withPeriod.hello.world")', options: options, filename: '/src/components/camelCase/kebab-case/PascalCase/with.period/hello.js', }, { name: 'allows correct key with single quotes', - code: "$tc('components.hello.world')", + code: "$t('components.hello.world')", options: options, filename: '/src/components/hello.js', }, { name: 'allows correct key with single quotes', - code: '$tc(\'components.hello.world\', 0, { test: "foo" })', + code: '$t(\'components.hello.world\', 0, { test: "foo" })', options: options, filename: '/src/components/hello.js', }, { name: 'allows correct key with backticks', - code: '$tc(`components.hello.world`)', + code: '$t(`components.hello.world`)', options: options, filename: '/src/components/hello.js', }, { name: 'allows correct key with arguments', - code: '$tc("components.hello.world", 0, { test: "foo" })', + code: '$t("components.hello.world", 0, { test: "foo" })', options: options, filename: '/src/components/hello.js', }, @@ -135,37 +135,37 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'ignores call without arguments', - code: '$tc()', + code: '$t()', options: options, filename: '/src/components/hello.js', }, { name: 'ignores unrelated file type', - code: "$tc('hello.world')", + code: "$t('hello.world')", options: options, filename: '/src/components/hello.json', }, { name: 'ignores test file', - code: "$tc('hello.world')", + code: "$t('hello.world')", options: options, filename: '/src/components/hello.spec.js', }, { name: 'ignores test helper file', - code: "$tc('hello.world')", + code: "$t('hello.world')", options: options, filename: '/src/components/__tests__/hello.js', }, { name: 'ignores e2e test file', - code: "$tc('hello.world')", + code: "$t('hello.world')", options: options, filename: '/src/e2e/hello.js', }, { name: 'accepts source file paths which do not start with /src', - code: '$tc("components.hello.world")', + code: '$t("components.hello.world")', options: options, filename: '/components/hello.js', }, @@ -174,7 +174,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { invalid: [ { name: 'lints incorrect key in js', - code: '$tc("hello.world")', + code: '$t("hello.world")', options: options, filename: '/src/components/hello.js', errors: [ @@ -186,7 +186,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints incorrect key in vue component js', - code: '', + code: '', options: options, filename: '/src/components/HelloWorld.vue', errors: [ @@ -198,7 +198,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints incorrect key in vue component setup script', - code: '', + code: '', options: options, filename: '/src/components/HelloWorld.vue', errors: [ @@ -210,7 +210,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints correct key in scoped use in vue component js', - code: '', + code: '', options: options, filename: '/src/components/HelloWorld.vue', errors: [ @@ -222,7 +222,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints incorrect key in vue component template mustache syntax', - code: '', + code: '', options: options, filename: '/src/components/HelloWorld.vue', errors: [ @@ -234,7 +234,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints incorrect key in vue component template v-bind', - code: '', + code: '', options: options, filename: '/src/components/HelloWorld.vue', errors: [ @@ -270,7 +270,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints incorrect global key, based on ignoreKeysRegex', - code: '$tc("something.containing.global.hello.world")', + code: '$t("something.containing.global.hello.world")', options: options, filename: '/src/components/hello.js', errors: [ @@ -282,7 +282,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints incorrect key with single quotes', - code: "$tc('hello.world')", + code: "$t('hello.world')", options: options, filename: '/src/components/hello.js', errors: [ @@ -294,7 +294,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints incorrect key with backticks', - code: '$tc(`hello.world`)', + code: '$t(`hello.world`)', options: options, filename: '/src/components/hello.js', errors: [ @@ -306,7 +306,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints incorrect key with arguments', - code: '$tc(\'hello.world\', 0, { test: "foo" })', + code: '$t(\'hello.world\', 0, { test: "foo" })', options: options, filename: '/src/components/hello.js', errors: [ @@ -330,7 +330,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints empty key in js', - code: '$tc("")', + code: '$t("")', options: options, filename: '/src/components/hello.js', errors: [ @@ -342,7 +342,7 @@ ruleTester.run('local-rules/matching-translation-keys', ruleInstance, { }, { name: 'lints in file with path which does not start with src/', - code: '$tc("hello.world")', + code: '$t("hello.world")', options: options, filename: '/components/hello.js', errors: [ diff --git a/common/helpers/dateHelperUTCFormatted.js b/common/helpers/dateHelperUTCFormatted.js index 2022715fd8..a00b3562af 100644 --- a/common/helpers/dateHelperUTCFormatted.js +++ b/common/helpers/dateHelperUTCFormatted.js @@ -35,7 +35,6 @@ function timeDurationShort(start, end, tc) { : duration.minutes() === 0 ? 'global.datetime.duration.hoursOnly' : 'global.datetime.duration.hoursAndMinutes', - 0, { days: Math.floor(duration.asDays()), hours: duration.hours(), diff --git a/docker-compose.yml b/docker-compose.yml index f17e431786..e2a9bcdb3a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,9 +1,7 @@ services: frontend: image: node:24.8.0 - container_name: 'ecamp3-frontend' - ports: - - '9229:9229' # jest debug + container_name: "ecamp3-frontend" stdin_open: true tty: true user: ${USER_ID:-1000} @@ -24,6 +22,31 @@ services: depends_on: - pdf + frontend-old: + image: node:24.8.0 + container_name: "ecamp3-frontend-old" + ports: + - "9229:9229" # jest debug + stdin_open: true + tty: true + user: ${USER_ID:-1000} + volumes: + - ./.prettierrc:/.prettierrc:delegated + - ./frontend-old:/app:delegated + - ./common:/common:delegated + - ./pdf:/pdf:delegated + - ./.cache/npm:/home/node/.npm/_cacache:delegated + - ./.cache/npm/sentry-cli:/home/node/.npm/sentry-cli:delegated + environment: + - NODE_ENV=development + - NPM_CONFIG_UPDATE_NOTIFIER=false + - NPM_CONFIG_CACHE=/home/node/.npm + - CI=${CI} + working_dir: /app + command: ./docker-setup.sh + depends_on: + - pdf + api: image: ${REGISTRY:-docker.io}/${REPO_OWNER:-ecamp}/ecamp3-api:${VERSION:-latest} build: @@ -31,7 +54,7 @@ services: target: frankenphp_prod cache_from: - ecamp/ecamp3-dev-api - container_name: 'ecamp3-api' + container_name: "ecamp3-api" depends_on: - database - docker-host @@ -45,7 +68,7 @@ services: DATA_MIGRATIONS_DIR: ${DATA_MIGRATIONS_DIR:-dev-data} DATABASE_URL: "postgresql://ecamp3:ecamp3@database:5432/ecamp3dev?serverVersion=15&charset=utf8" LOG_LEVEL: debug - ADDITIONAL_TRUSTED_HOSTS: '.*' + ADDITIONAL_TRUSTED_HOSTS: ".*" SERVER_NAME: ":3001" healthcheck: interval: 10s @@ -53,11 +76,11 @@ services: retries: 3 start_period: 30s extra_hosts: - - 'host.docker.internal:host-gateway' + - "host.docker.internal:host-gateway" http-cache: image: varnish:8.0.0 - container_name: 'ecamp3-http-cache' + container_name: "ecamp3-http-cache" depends_on: - api volumes: @@ -68,10 +91,10 @@ services: - COOKIE_PREFIX=localhost_ - SEND_XKEY_HEADERS_DOWNSTREAM=${SEND_XKEY_HEADERS_DOWNSTREAM:-true} - VARNISH_HTTP_PORT=8080 - + http-cache-logs: image: varnish:8.0.0 - container_name: 'ecamp3-http-cache-logs' + container_name: "ecamp3-http-cache-logs" depends_on: - http-cache volumes: @@ -80,7 +103,7 @@ services: pdf: image: node:24.8.0 - container_name: 'ecamp3-pdf' + container_name: "ecamp3-pdf" stdin_open: true tty: true user: ${USER_ID:-1000} @@ -99,7 +122,7 @@ services: print: image: node:24.8.0 - container_name: 'ecamp3-print' + container_name: "ecamp3-print" user: ${USER_ID:-1000} volumes: - ./.prettierrc:/.prettierrc @@ -121,7 +144,7 @@ services: database: image: postgres:15-alpine - container_name: 'ecamp3-database' + container_name: "ecamp3-database" environment: - POSTGRES_DB=ecamp3dev - POSTGRES_PASSWORD=ecamp3 @@ -143,7 +166,7 @@ services: pg-admin: image: dpage/pgadmin4 - container_name: 'ecamp3-pg-admin' + container_name: "ecamp3-pg-admin" depends_on: - database environment: @@ -155,21 +178,21 @@ services: mail: image: maildev/maildev - container_name: 'ecamp3-mail' + container_name: "ecamp3-mail" environment: - MAILDEV_BASE_PATHNAME=/mail docker-host: image: qoomon/docker-host - container_name: 'ecamp3-docker-host-forwarder' - cap_add: ['NET_ADMIN', 'NET_RAW'] + container_name: "ecamp3-docker-host-forwarder" + cap_add: ["NET_ADMIN", "NET_RAW"] restart: on-failure browserless: image: browserless/chrome:1.61.1-puppeteer-21.9.0 - container_name: 'ecamp3-browserless' + container_name: "ecamp3-browserless" ports: - - '3010:3000' + - "3010:3000" environment: - MAX_CONCURRENT_SESSIONS=1 - CONNECTION_TIMEOUT=40000 @@ -182,8 +205,8 @@ services: e2e: image: cypress/included:15.2.0@sha256:4bc3d13bcf5964fd3bca3b6fa97520b845b286bc7aed98eeb6a68970e7981865 - profiles: ['e2e'] - container_name: 'ecamp3-e2e' + profiles: ["e2e"] + container_name: "ecamp3-e2e" environment: - DISPLAY volumes: @@ -192,15 +215,16 @@ services: - /tmp/.X11-unix:/tmp/.X11-unix:rw network_mode: host working_dir: /e2e - + reverse-proxy: image: nginx:1.29 - container_name: 'ecamp3-reverse-proxy' + container_name: "ecamp3-reverse-proxy" volumes: - ./reverse-proxy-nginx.conf:/etc/nginx/nginx.conf depends_on: - frontend - api + - frontend-old ports: - target: 3000 published: 3000 @@ -211,8 +235,8 @@ services: translation: image: node:24.8.0 - profiles: ['translation'] - container_name: 'ecamp3-translation' + profiles: ["translation"] + container_name: "ecamp3-translation" volumes: - ./translation:/translation:delegated - ./common:/common:delegated diff --git a/frontend-old/.editorconfig b/frontend-old/.editorconfig new file mode 100644 index 0000000000..7053c49a04 --- /dev/null +++ b/frontend-old/.editorconfig @@ -0,0 +1,5 @@ +[*.{js,jsx,ts,tsx,vue}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/frontend-old/.gitignore b/frontend-old/.gitignore new file mode 100644 index 0000000000..fae6461ae2 --- /dev/null +++ b/frontend-old/.gitignore @@ -0,0 +1,35 @@ +.DS_Store +node_modules +/components.d.ts +/data +/dist + +selenium-debug.log + +# local env files +.env.local +.env.*.local + +# Auto-generated files +public/twemoji/ + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw* + +# yalc +.yalc +yalc.lock + +# Sentry Auth Token +.env.sentry-build-plugin diff --git a/frontend-old/.prettierignore b/frontend-old/.prettierignore new file mode 100644 index 0000000000..de2f837688 --- /dev/null +++ b/frontend-old/.prettierignore @@ -0,0 +1,6 @@ +src/common/locales/ +src/locales/ +/data +/dist +.vscode +/public/twemoji diff --git a/frontend-old/README.md b/frontend-old/README.md new file mode 100644 index 0000000000..79caff12af --- /dev/null +++ b/frontend-old/README.md @@ -0,0 +1,31 @@ +# frontend + +## Project setup + +``` +npm install +``` + +### Compiles and hot-reloads for development + +``` +npm run serve +``` + +### Compiles and minifies for production + +``` +npm run build +``` + +### Lints and fixes files + +``` +npm run lint +``` + +### Run your unit tests + +``` +npm run test:unit +``` diff --git a/frontend-old/babel.config.js b/frontend-old/babel.config.js new file mode 100644 index 0000000000..2b8a72a2f4 --- /dev/null +++ b/frontend-old/babel.config.js @@ -0,0 +1,7 @@ +// noinspection JSUnusedGlobalSymbols +export const presets = ['@vue/app'] +export const env = { + test: { + plugins: ['require-context-hook'], + }, +} diff --git a/frontend-old/docker-setup.sh b/frontend-old/docker-setup.sh new file mode 100755 index 0000000000..91dd9c4dd9 --- /dev/null +++ b/frontend-old/docker-setup.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -euo pipefail + +BASEDIR=$(dirname "$0") +PDF_DIST=$BASEDIR"/src/pdf" + +if [ ! -f "$PDF_DIST/pdf.js" ] || [ ! -f "$PDF_DIST/prepareInMainThread.js" ]; then + # Copy dummy versions of the pdf build outputs, to make sure there is always something to import + cp "$PDF_DIST/pdf.js.dist" "$PDF_DIST/pdf.js" + cp "$PDF_DIST/prepareInMainThread.js.dist" "$PDF_DIST/prepareInMainThread.js" +fi + +if [ "$CI" = 'true' ] ; then + npm ci --verbose + npm run build + npm run preview +else + npm install + npm run dev +fi diff --git a/frontend-old/eslint-local-rules/index.js b/frontend-old/eslint-local-rules/index.js new file mode 100644 index 0000000000..0431dd1383 --- /dev/null +++ b/frontend-old/eslint-local-rules/index.js @@ -0,0 +1,6 @@ +import utils from 'eslint-plugin-vue/lib/utils/index.js' +// noinspection ES6UnusedImports +import createMatchingTranslationKeys from '../../common/eslint-local-rules/matchingTranslationKeys.js' + +// noinspection JSUnusedGlobalSymbols +export const matchingTranslationKeys = createMatchingTranslationKeys(utils) diff --git a/frontend-old/eslint.config.mjs b/frontend-old/eslint.config.mjs new file mode 100644 index 0000000000..8c2987bc7b --- /dev/null +++ b/frontend-old/eslint.config.mjs @@ -0,0 +1,95 @@ +import vueEslintConfigPrettier from '@vue/eslint-config-prettier' + +import { includeIgnoreFile } from '@eslint/compat' +import localRules from 'eslint-plugin-local-rules' +import vueEslint from 'eslint-plugin-vue' +import vueScopedCssEslint from 'eslint-plugin-vue-scoped-css' +import globals from 'globals' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import js from '@eslint/js' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const gitignorePath = path.resolve(__dirname, '.gitignore') +export default [ + ...vueEslint.configs['flat/vue2-recommended'], + ...vueEslint.configs['flat/recommended'], + ...vueScopedCssEslint.configs['flat/recommended'], + js.configs.recommended, + { + ignores: ['data/', 'dist/', 'public/twemoji/'], + }, + + includeIgnoreFile(gitignorePath), + + vueEslintConfigPrettier, + + { + plugins: { + 'local-rules': localRules, + }, + + languageOptions: { + globals: { + ...globals.node, + ...globals.browser, + }, + + parserOptions: { + ecmaVersion: 2022, + parser: '@babel/eslint-parser', + }, + }, + + rules: { + 'prefer-const': 'error', + 'prettier/prettier': 'error', + + 'vue/block-order': [ + 'error', + { + order: ['template', 'script', 'style'], + }, + ], + + 'vue/multi-word-component-names': 'off', + 'vue/no-deprecated-delete-set': 'warn', + 'vue/no-deprecated-destroyed-lifecycle': 'off', + 'vue/no-deprecated-dollar-listeners-api': 'off', + 'vue/no-deprecated-dollar-scopedslots-api': 'off', + 'vue/no-deprecated-filter': 'warn', + 'vue/no-deprecated-props-default-this': 'off', + 'vue/no-deprecated-slot-attribute': 'off', + 'vue/no-deprecated-slot-scope-attribute': 'off', + 'vue/no-deprecated-v-bind-sync': 'off', + 'vue/no-deprecated-v-on-native-modifier': 'warn', + 'vue/no-v-for-template-key-on-child': 'off', + 'vue/no-v-model-argument': 'warn', + 'vue/require-explicit-emits': 'off', + + 'no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_$', + }, + ], + + 'local-rules/matchingTranslationKeys': [ + 'error', + { + ignoreKeysRegex: + '^(global|entity|contentNode\\.[a-z][a-zA-Z]+|print\\.(global|activity|cover|picasso|program|config|story|safetyConsiderations|toc|activityList))\\..+', + translationKeyPropRegex: '[a-zA-Z0-9]-i18n-key$', + }, + ], + + 'vue/no-mutating-props': [ + 'error', + { + shallowOnly: true, + }, + ], + }, + }, +] diff --git a/frontend-old/index.html b/frontend-old/index.html new file mode 100644 index 0000000000..34044dc6c4 --- /dev/null +++ b/frontend-old/index.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + eCamp v3 + + + + + +
+ + + + + diff --git a/frontend-old/jsconfig.json b/frontend-old/jsconfig.json new file mode 100644 index 0000000000..abe04df578 --- /dev/null +++ b/frontend-old/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/frontend-old/package-lock.json b/frontend-old/package-lock.json new file mode 100644 index 0000000000..7cfb69e309 --- /dev/null +++ b/frontend-old/package-lock.json @@ -0,0 +1,12974 @@ +{ + "name": "@ecamp3/frontend", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@ecamp3/frontend", + "hasInstallScript": true, + "dependencies": { + "@intlify/core": "11.1.12", + "@leeoniya/ufuzzy": "1.0.19", + "@mdi/font": "7.4.47", + "@react-pdf/font": "4.0.3", + "@react-pdf/layout": "4.4.1", + "@react-pdf/pdfkit": "4.0.4", + "@react-pdf/primitives": "4.1.1", + "@react-pdf/render": "4.3.1", + "@sentry/browser": "9.46.0", + "@sentry/vue": "9.46.0", + "@tiptap/extension-bold": "2.26.2", + "@tiptap/extension-bubble-menu": "2.26.2", + "@tiptap/extension-bullet-list": "2.26.2", + "@tiptap/extension-document": "2.26.2", + "@tiptap/extension-hard-break": "2.26.2", + "@tiptap/extension-heading": "2.26.2", + "@tiptap/extension-history": "2.26.2", + "@tiptap/extension-italic": "2.26.2", + "@tiptap/extension-list-item": "2.26.2", + "@tiptap/extension-ordered-list": "2.26.2", + "@tiptap/extension-paragraph": "2.26.2", + "@tiptap/extension-placeholder": "2.26.2", + "@tiptap/extension-strike": "2.26.2", + "@tiptap/extension-text": "2.26.2", + "@tiptap/extension-underline": "2.26.2", + "@tiptap/pm": "2.26.2", + "@tiptap/vue-2": "2.26.2", + "@unhead/vue": "1.11.20", + "@zxcvbn-ts/core": "3.0.4", + "@zxcvbn-ts/language-common": "3.0.4", + "@zxcvbn-ts/language-de": "3.0.2", + "@zxcvbn-ts/language-en": "3.0.2", + "@zxcvbn-ts/language-fr": "3.0.2", + "@zxcvbn-ts/language-it": "3.0.2", + "assert": "2.1.0", + "axios": "1.12.2", + "colorjs.io": "0.5.2", + "comlink": "4.4.2", + "dayjs": "1.11.18", + "deepmerge": "4.3.1", + "emoji-regex": "10.5.0", + "file-saver": "2.0.5", + "hal-json-vuex": "3.0.0-alpha.10", + "inter-ui": "3.19.3", + "js-cookie": "3.0.5", + "linkify-it": "5.0.0", + "lodash-es": "4.17.21", + "runes": "0.4.3", + "slugify": "1.6.6", + "url-template": "3.1.1", + "util": "0.12.5", + "v-resize-observer": "2.1.0", + "vee-validate": "3.4.15", + "vue": "2.7.15", + "vue-axios": "3.5.2", + "vue-i18n": "8.28.2", + "vue-recaptcha-v3": "1.9.0", + "vue-router": "3.6.5", + "vue-toastification": "1.7.14", + "vuedraggable": "2.24.3", + "vuetify": "2.7.2", + "vuex": "3.6.2", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz" + }, + "devDependencies": { + "@babel/eslint-parser": "7.28.4", + "@eslint/compat": "1.4.0", + "@eslint/js": "9.36.0", + "@sentry/vite-plugin": "3.6.1", + "@testing-library/jest-dom": "6.8.0", + "@testing-library/user-event": "14.6.1", + "@testing-library/vue": "5.9.0", + "@vitejs/plugin-vue2": "2.3.3", + "@vitest/coverage-v8": "3.2.4", + "@vue/babel-preset-app": "5.0.9", + "@vue/eslint-config-prettier": "10.2.0", + "@vue/test-utils": "1.3.6", + "autoprefixer": "10.4.21", + "babel-plugin-require-context-hook": "1.0.0", + "eslint": "9.36.0", + "eslint-config-prettier": "10.1.8", + "eslint-plugin-local-rules": "3.0.2", + "eslint-plugin-n": "17.23.1", + "eslint-plugin-prettier": "5.5.4", + "eslint-plugin-promise": "7.2.1", + "eslint-plugin-vue": "10.5.0", + "eslint-plugin-vue-scoped-css": "2.12.0", + "flush-promises": "1.0.2", + "globals": "16.4.0", + "jest-serializer-vue-tjw": "3.20.0", + "jsdom": "26.1.0", + "lint-staged": "16.2.1", + "patch-package": "8.0.0", + "prettier": "3.6.2", + "sass": "1.78.0", + "source-map": "0.7.6", + "unplugin-vue-components": "29.1.0", + "vite": "6.3.6", + "vite-plugin-comlink": "5.3.0", + "vite-plugin-vue2-svg": "0.4.0", + "vitest": "3.2.4", + "vitest-canvas-mock": "0.3.3", + "vue-template-compiler": "2.7.15" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz", + "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.0.tgz", + "integrity": "sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.40 || 9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@intlify/core": { + "version": "11.1.12", + "resolved": "https://registry.npmjs.org/@intlify/core/-/core-11.1.12.tgz", + "integrity": "sha512-Uccp4VtalUSk/b4F9nBBs7VGgIh9VnXTSHHQ+Kc0AetsHJLxdi04LfhfSi4dujtsTAWnHMHWZw07UbMm6Umq1g==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "11.1.12", + "@intlify/shared": "11.1.12" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/core-base": { + "version": "11.1.12", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-11.1.12.tgz", + "integrity": "sha512-whh0trqRsSqVLNEUCwU59pyJZYpU8AmSWl8M3Jz2Mv5ESPP6kFh4juas2NpZ1iCvy7GlNRffUD1xr84gceimjg==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "11.1.12", + "@intlify/shared": "11.1.12" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "11.1.12", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.1.12.tgz", + "integrity": "sha512-Fv9iQSJoJaXl4ZGkOCN1LDM3trzze0AS2zRz2EHLiwenwL6t0Ki9KySYlyr27yVOj5aVz0e55JePO+kELIvfdQ==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "11.1.12", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "11.1.12", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.1.12.tgz", + "integrity": "sha512-Om86EjuQtA69hdNj3GQec9ZC0L0vPSAnXzB3gP/gyJ7+mA7t06d9aOAiqMZ+xEOsumGP4eEBlfl8zF2LOTzf2A==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leeoniya/ufuzzy": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/@leeoniya/ufuzzy/-/ufuzzy-1.0.19.tgz", + "integrity": "sha512-0pikDeYt0IHEUPza5RTCDXc/17S1pTrYnReEMp8Aa6k1ovzw5QdZLwicW8TjljwEZRb6oYag0xmALohrcq/yOQ==", + "license": "MIT" + }, + "node_modules/@mdi/font": { + "version": "7.4.47", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz", + "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==", + "license": "Apache-2.0" + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-pdf/fns": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@react-pdf/fns/-/fns-3.1.2.tgz", + "integrity": "sha512-qTKGUf0iAMGg2+OsUcp9ffKnKi41RukM/zYIWMDJ4hRVYSr89Q7e3wSDW/Koqx3ea3Uy/z3h2y3wPX6Bdfxk6g==", + "license": "MIT" + }, + "node_modules/@react-pdf/font": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@react-pdf/font/-/font-4.0.3.tgz", + "integrity": "sha512-N1qQDZr6phXYQOp033Hvm2nkUkx2LkszjGPbmRavs9VOYzi4sp31MaccMKptL24ii6UhBh/z9yPUhnuNe/qHwA==", + "license": "MIT", + "dependencies": { + "@react-pdf/pdfkit": "^4.0.4", + "@react-pdf/types": "^2.9.1", + "fontkit": "^2.0.2", + "is-url": "^1.2.4" + } + }, + "node_modules/@react-pdf/image": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@react-pdf/image/-/image-3.0.3.tgz", + "integrity": "sha512-lvP5ryzYM3wpbO9bvqLZYwEr5XBDX9jcaRICvtnoRqdJOo7PRrMnmB4MMScyb+Xw10mGeIubZAAomNAG5ONQZQ==", + "license": "MIT", + "dependencies": { + "@react-pdf/png-js": "^3.0.0", + "jay-peg": "^1.1.1" + } + }, + "node_modules/@react-pdf/layout": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@react-pdf/layout/-/layout-4.4.1.tgz", + "integrity": "sha512-GVzdlWoZWldRDzlWj3SttRXmVDxg7YfraAohwy+o9gb9hrbDJaaAV6jV3pc630Evd3K46OAzk8EFu8EgPDuVuA==", + "license": "MIT", + "dependencies": { + "@react-pdf/fns": "3.1.2", + "@react-pdf/image": "^3.0.3", + "@react-pdf/primitives": "^4.1.1", + "@react-pdf/stylesheet": "^6.1.1", + "@react-pdf/textkit": "^6.0.0", + "@react-pdf/types": "^2.9.1", + "emoji-regex-xs": "^1.0.0", + "queue": "^6.0.1", + "yoga-layout": "^3.2.1" + } + }, + "node_modules/@react-pdf/pdfkit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@react-pdf/pdfkit/-/pdfkit-4.0.4.tgz", + "integrity": "sha512-/nITLggsPlB66bVLnm0X7MNdKQxXelLGZG6zB5acF5cCgkFwmXHnLNyxYOUD4GMOMg1HOPShXDKWrwk2ZeHsvw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@react-pdf/png-js": "^3.0.0", + "browserify-zlib": "^0.2.0", + "crypto-js": "^4.2.0", + "fontkit": "^2.0.2", + "jay-peg": "^1.1.1", + "linebreak": "^1.1.0", + "vite-compatible-readable-stream": "^3.6.1" + } + }, + "node_modules/@react-pdf/png-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-pdf/png-js/-/png-js-3.0.0.tgz", + "integrity": "sha512-eSJnEItZ37WPt6Qv5pncQDxLJRK15eaRwPT+gZoujP548CodenOVp49GST8XJvKMFt9YqIBzGBV/j9AgrOQzVA==", + "license": "MIT", + "dependencies": { + "browserify-zlib": "^0.2.0" + } + }, + "node_modules/@react-pdf/primitives": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@react-pdf/primitives/-/primitives-4.1.1.tgz", + "integrity": "sha512-IuhxYls1luJb7NUWy6q5avb1XrNaVj9bTNI40U9qGRuS6n7Hje/8H8Qi99Z9UKFV74bBP3DOf3L1wV2qZVgVrQ==", + "license": "MIT" + }, + "node_modules/@react-pdf/render": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@react-pdf/render/-/render-4.3.1.tgz", + "integrity": "sha512-v1WAaAhQShQZGcBxfjkEThGCHVH9CSuitrZ1bIOLvB5iBKM14abYK5D6djKhWCwF6FTzYeT2WRjRMVgze/ND2A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@react-pdf/fns": "3.1.2", + "@react-pdf/primitives": "^4.1.1", + "@react-pdf/textkit": "^6.0.0", + "@react-pdf/types": "^2.9.1", + "abs-svg-path": "^0.1.1", + "color-string": "^1.9.1", + "normalize-svg-path": "^1.1.0", + "parse-svg-path": "^0.1.2", + "svg-arc-to-cubic-bezier": "^3.2.0" + } + }, + "node_modules/@react-pdf/stylesheet": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@react-pdf/stylesheet/-/stylesheet-6.1.1.tgz", + "integrity": "sha512-Iyw0A3wRIeQLN4EkaKf8yF9MvdMxiZ8JjoyzLzDHSxnKYoOA4UGu84veCb8dT9N8MxY5x7a0BUv/avTe586Plg==", + "license": "MIT", + "dependencies": { + "@react-pdf/fns": "3.1.2", + "@react-pdf/types": "^2.9.1", + "color-string": "^1.9.1", + "hsl-to-hex": "^1.0.0", + "media-engine": "^1.0.3", + "postcss-value-parser": "^4.1.0" + } + }, + "node_modules/@react-pdf/textkit": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@react-pdf/textkit/-/textkit-6.0.0.tgz", + "integrity": "sha512-fDt19KWaJRK/n2AaFoVm31hgGmpygmTV7LsHGJNGZkgzXcFyLsx+XUl63DTDPH3iqxj3xUX128t104GtOz8tTw==", + "license": "MIT", + "dependencies": { + "@react-pdf/fns": "3.1.2", + "bidi-js": "^1.0.2", + "hyphen": "^1.6.4", + "unicode-properties": "^1.4.1" + } + }, + "node_modules/@react-pdf/types": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@react-pdf/types/-/types-2.9.1.tgz", + "integrity": "sha512-5GoCgG0G5NMgpPuHbKG2xcVRQt7+E5pg3IyzVIIozKG3nLcnsXW4zy25vG1ZBQA0jmo39q34au/sOnL/0d1A4w==", + "license": "MIT", + "dependencies": { + "@react-pdf/font": "^4.0.3", + "@react-pdf/primitives": "^4.1.1", + "@react-pdf/stylesheet": "^6.1.1" + } + }, + "node_modules/@remirror/core-constants": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", + "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", + "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", + "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", + "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", + "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", + "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", + "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", + "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", + "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", + "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", + "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", + "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", + "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", + "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", + "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", + "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", + "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", + "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", + "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", + "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", + "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", + "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", + "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sentry-internal/browser-utils": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-9.46.0.tgz", + "integrity": "sha512-Q0CeHym9wysku8mYkORXmhtlBE0IrafAI+NiPSqxOBKXGOCWKVCvowHuAF56GwPFic2rSrRnub5fWYv7T1jfEQ==", + "license": "MIT", + "dependencies": { + "@sentry/core": "9.46.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/feedback": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-9.46.0.tgz", + "integrity": "sha512-KLRy3OolDkGdPItQ3obtBU2RqDt9+KE8z7r7Gsu7c6A6A89m8ZVlrxee3hPQt6qp0YY0P8WazpedU3DYTtaT8w==", + "license": "MIT", + "dependencies": { + "@sentry/core": "9.46.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/replay": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-9.46.0.tgz", + "integrity": "sha512-+8JUblxSSnN0FXcmOewbN+wIc1dt6/zaSeAvt2xshrfrLooVullcGsuLAiPhY0d/e++Fk06q1SAl9g4V0V13gg==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "9.46.0", + "@sentry/core": "9.46.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-9.46.0.tgz", + "integrity": "sha512-QcBjrdRWFJrrrjbmrr2bbrp2R9RYj1KMEbhHNT2Lm1XplIQw+tULEKOHxNtkUFSLR1RNje7JQbxhzM1j95FxVQ==", + "license": "MIT", + "dependencies": { + "@sentry-internal/replay": "9.46.0", + "@sentry/core": "9.46.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/babel-plugin-component-annotate": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.6.1.tgz", + "integrity": "sha512-zmvUa4RpzDG3LQJFpGCE8lniz8Rk1Wa6ZvvK+yEH+snZeaHHRbSnAQBMR607GOClP+euGHNO2YtaY4UAdNTYbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@sentry/browser": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-9.46.0.tgz", + "integrity": "sha512-NOnCTQCM0NFuwbyt4DYWDNO2zOTj1mCf43hJqGDFb1XM9F++7zAmSNnCx4UrEoBTiFOy40McJwBBk9D1blSktA==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "9.46.0", + "@sentry-internal/feedback": "9.46.0", + "@sentry-internal/replay": "9.46.0", + "@sentry-internal/replay-canvas": "9.46.0", + "@sentry/core": "9.46.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/bundler-plugin-core": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.6.1.tgz", + "integrity": "sha512-/ubWjPwgLep84sUPzHfKL2Ns9mK9aQrEX4aBFztru7ygiJidKJTxYGtvjh4dL2M1aZ0WRQYp+7PF6+VKwdZXcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.18.5", + "@sentry/babel-plugin-component-annotate": "3.6.1", + "@sentry/cli": "^2.49.0", + "dotenv": "^16.3.1", + "find-up": "^5.0.0", + "glob": "^9.3.2", + "magic-string": "0.30.8", + "unplugin": "1.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@sentry/cli": { + "version": "2.56.0", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.56.0.tgz", + "integrity": "sha512-br6+1nTPUV5EG1oaxLzxv31kREFKr49Y1+3jutfMUz9Nl8VyVP7o9YwakB/YWl+0Vi0NXg5vq7qsd/OOuV5j8w==", + "dev": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.56.0", + "@sentry/cli-linux-arm": "2.56.0", + "@sentry/cli-linux-arm64": "2.56.0", + "@sentry/cli-linux-i686": "2.56.0", + "@sentry/cli-linux-x64": "2.56.0", + "@sentry/cli-win32-arm64": "2.56.0", + "@sentry/cli-win32-i686": "2.56.0", + "@sentry/cli-win32-x64": "2.56.0" + } + }, + "node_modules/@sentry/cli-darwin": { + "version": "2.56.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.56.0.tgz", + "integrity": "sha512-CzXFWbv3GrjU0gFlUM9jt0fvJmyo5ktty4HGxRFfS/eMC6xW58Gg/sEeMVEkdvk5osKooX/YEgfLBdo4zvuWDA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm": { + "version": "2.56.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.56.0.tgz", + "integrity": "sha512-vQCCMhZLugPmr25XBoP94dpQsFa110qK5SBUVJcRpJKyzMZd+6ueeHNslq2mB0OF4BwL1qd/ZDIa4nxa1+0rjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.56.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.56.0.tgz", + "integrity": "sha512-91d5ZlC989j/t+TXor/glPyx6SnLFS/SlJ9fIrHIQohdGKyWWSFb4VKUan8Ok3GYu9SUzKTMByryIOoYEmeGVw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-i686": { + "version": "2.56.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.56.0.tgz", + "integrity": "sha512-MZzXuq1Q/TktN81DUs6XSBU752pG3XWSJdZR+NCStIg3l8s3O/Pwh6OcDHTYqgwsYJaGBpA0fP2Afl5XeSAUNg==", + "cpu": [ + "x86", + "ia32" + ], + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-x64": { + "version": "2.56.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.56.0.tgz", + "integrity": "sha512-INOO2OQ90Y3UzYgHRdrHdKC/0es3YSHLv0iNNgQwllL0YZihSVNYSSrZqcPq8oSDllEy9Vt9oOm/7qEnUP2Kfw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-arm64": { + "version": "2.56.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.56.0.tgz", + "integrity": "sha512-eUvkVk9KK01q6/qyugQPh7dAxqFPbgOa62QAoSwo11WQFYc3NPgJLilFWLQo+nahHGYKh6PKuCJ5tcqnQq5Hkg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-i686": { + "version": "2.56.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.56.0.tgz", + "integrity": "sha512-mpCA8hKXuvT17bl1H/54KOa5i+02VBBHVlOiP3ltyBuQUqfvX/30Zl/86Spy+ikodovZWAHv5e5FpyXbY1/mPw==", + "cpu": [ + "x86", + "ia32" + ], + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-x64": { + "version": "2.56.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.56.0.tgz", + "integrity": "sha512-UV0pXNls+/ViAU/3XsHLLNEHCsRYaGEwJdY3HyGIufSlglxrX6BVApkV9ziGi4WAxcJWLjQdfcEs6V5B+wBy0A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/core": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.46.0.tgz", + "integrity": "sha512-it7JMFqxVproAgEtbLgCVBYtQ9fIb+Bu0JD+cEplTN/Ukpe6GaolyYib5geZqslVxhp2sQgT+58aGvfd/k0N8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/vite-plugin": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-3.6.1.tgz", + "integrity": "sha512-x8WMdv2K2HcGS2ezEUIEZXpT/fNeWQ9rsEeF0K9DfKXK8Z9lzRmCr6TVA6I9+yW39Is+1/0cv1Rsu0LhO7lHzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sentry/bundler-plugin-core": "3.6.1", + "unplugin": "1.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@sentry/vue": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/vue/-/vue-9.46.0.tgz", + "integrity": "sha512-xFeZevR2nG+4tdvZcVgO6U1YiTQJZJTtV8aKRsCEh4yYpBO3FrfLxbSMTUeipILfKxpFf2iu1lwmqNyQtEllkA==", + "license": "MIT", + "dependencies": { + "@sentry/browser": "9.46.0", + "@sentry/core": "9.46.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "pinia": "2.x || 3.x", + "vue": "2.x || 3.x" + }, + "peerDependenciesMeta": { + "pinia": { + "optional": true + } + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz", + "integrity": "sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@testing-library/vue": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@testing-library/vue/-/vue-5.9.0.tgz", + "integrity": "sha512-HWvI4s6FayFLmiqGcEMAMfTSO1SV12NukdoyllYMBobFqfO0TalQmfofMtiO+eRz+Amej8Z26dx4/WYIROzfVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@testing-library/dom": "^9.0.0", + "@vue/test-utils": "^1.3.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "vue": "^2.6.10", + "vue-template-compiler": "^2.6.10" + } + }, + "node_modules/@testing-library/vue/node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/vue/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@tiptap/core": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.26.2.tgz", + "integrity": "sha512-cr30QWJECl5j7qUUG4Z4BDitHgJIBWipbC3JbjoDtumgZLedGa5SV+JiGa4GUhNt9E34Pw1BH0gBDL4adGHiLg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.26.2.tgz", + "integrity": "sha512-kNjbHZhLyDu2ZBZmJINzXg3MAW7+05KqGkcwxudC1X/DQM5V5FpW7u6TOlC+nf1I9wABgayxURyU8FsIaXDxqA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.26.2.tgz", + "integrity": "sha512-kB7/bGTUnC7ZCBH/fkigpfId925nwGOn+Nq1hf199NYMu2ffWbKk75ckLwyqlETprQYzzHfViIqcwyxJzo04Sg==", + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bullet-list": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.26.2.tgz", + "integrity": "sha512-L0qxUa5vzUciLEVtr1nY6HG8gH8432GtuX807MM/5wKiYYdbSii3I22456ZnboiozoqXrjjvYUHeB++HhOSPgQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.26.2.tgz", + "integrity": "sha512-s0/P3A8zxWL/h3e20xWMTT/rcwD0+57I6mT9JgNBPtvhPePy8d698G6/qFK+x+GdIyjJylfsq2BrSE9H+QhIBg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.26.2.tgz", + "integrity": "sha512-AILrhwKAGU4Z6GcjNXJAsN0LHlL26bE7VRrYIqUwDv44ImiQf5vu9jEnncBOeHWzMe8SgjrrJWGNNu+dceACpw==", + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.26.2.tgz", + "integrity": "sha512-OLpeTey7p3ChyEsABLPvNv7rD/8E4k1JTt+H+MUjyL0dnrZuIWluckUJCJKnV8PhR9Mifngk1MTFUilpooiv1g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-heading": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.26.2.tgz", + "integrity": "sha512-0VAr1l1QKFJ0B2l4D4wV0LRlyFYeJt0S09mz+HPF2TqKF4twmPjaGD6o5zzXWl8c4cQj1CmM8P+9an3SKRjOaA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-history": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.26.2.tgz", + "integrity": "sha512-X/cu79AV5D2Z1QtuvKo/4/Rgl/Uti/n5V3QgCxFLQRCKTxHOCis+RlBCjBfOPztJX4T9QUE6lq20KqB47rsNwQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.26.2.tgz", + "integrity": "sha512-/4AiE2JWtjY9yW+MifMP8EOOwOSDKDUxCyqtGT6e4xqqFUNLZJA0o4P/MYjcKVwsa1/IsDRsOaFRlAiMmAXVXw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-list-item": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.26.2.tgz", + "integrity": "sha512-T1dFfx1JjRRX0iyStSTwMNajMyT+OE7XEggn+DON1g+zbgA+4cJ11WQpfrfA9VM2H5QWYyKGfHFigoFcJ8rjog==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-ordered-list": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.26.2.tgz", + "integrity": "sha512-UVGYyWKB5wWWvrvdN/WrPXPHJoP/UD1TNyeoE75M6nq4oD4l+Nc9Y5MIPsngrv/TimbomLNilR4ZRHibEriG9w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.26.2.tgz", + "integrity": "sha512-dccyffm95nNT9arjxGOyv4/cOPF4XS5Osylccp9KYLrmiSTXEuzVIYtMXhXbc0UUdABGvbFQWi88tRxgeDTkgA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-placeholder": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.26.2.tgz", + "integrity": "sha512-XBTDcpEo7Zo/1+RhGnRxA2TF0elQW7EayUcV+lJ3f7HQ5lrb5NTnakYc1ydeZ8Ih6vUqbK2CQUsESe3UWHHgHg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.26.2.tgz", + "integrity": "sha512-gY8/P8ycvICiZsa9OeTpOnSL0o+PAYH1QpBomaBhdZZ2tcsziMYN9BZto6uQARi9tdxeOYRePyZ+Junk4xsyFg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.26.2.tgz", + "integrity": "sha512-Rb8Le/Li+EixQNc/pGkEJpLjozTjWYP9glaYfnjPtRVw4tHcd7khVm5mer0TQjonbBUjVC1zSuXv9gifXOv6DQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-underline": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.26.2.tgz", + "integrity": "sha512-kpKJSfsn1+b8l96YPg2GRn3aaN78pLqSeyzfA5FYVbN0lyptbqRVOrNM8p3n6l0LbAkiEjc/TgOMwNNEL93kyA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/pm": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.26.2.tgz", + "integrity": "sha512-H2kJHckC9idlYPu/PNdu5XR3Rdu7gbNb+Qrdt2gBnaDyHgAcs+14wak6x19vy27GV9FFzg9722Eb7LErooo28w==", + "license": "MIT", + "dependencies": { + "prosemirror-changeset": "^2.3.0", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.13.1", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.23.0", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-schema-list": "^1.4.1", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.6.4", + "prosemirror-trailing-node": "^3.0.0", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.37.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/vue-2": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@tiptap/vue-2/-/vue-2-2.26.2.tgz", + "integrity": "sha512-DM5mBVGmsN8l5UavfQvvTARmSJBSGodIyWGOher3Xps5TjVbXaDLvY2Jh5lhh9/toMw/eH4AVMjIENSaJJPJvg==", + "license": "MIT", + "dependencies": { + "@tiptap/extension-bubble-menu": "^2.26.2", + "@tiptap/extension-floating-menu": "^2.26.2", + "vue-ts-types": "1.6.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0", + "vue": "^2.6.0" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT" + }, + "node_modules/@unhead/dom": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.11.20.tgz", + "integrity": "sha512-jgfGYdOH+xHJF/j8gudjsYu3oIjFyXhCWcgKaw3vQnT616gSqyqnGQGOItL+BQtQZACKNISwIfx5PuOtztMKLA==", + "license": "MIT", + "dependencies": { + "@unhead/schema": "1.11.20", + "@unhead/shared": "1.11.20" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/schema": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.11.20.tgz", + "integrity": "sha512-0zWykKAaJdm+/Y7yi/Yds20PrUK7XabLe9c3IRcjnwYmSWY6z0Cr19VIs3ozCj8P+GhR+/TI2mwtGlueCEYouA==", + "license": "MIT", + "dependencies": { + "hookable": "^5.5.3", + "zhead": "^2.2.4" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/shared": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.11.20.tgz", + "integrity": "sha512-1MOrBkGgkUXS+sOKz/DBh4U20DNoITlJwpmvSInxEUNhghSNb56S0RnaHRq0iHkhrO/cDgz2zvfdlRpoPLGI3w==", + "license": "MIT", + "dependencies": { + "@unhead/schema": "1.11.20", + "packrup": "^0.1.2" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/vue": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.11.20.tgz", + "integrity": "sha512-sqQaLbwqY9TvLEGeq8Fd7+F2TIuV3nZ5ihVISHjWpAM3y7DwNWRU7NmT9+yYT+2/jw1Vjwdkv5/HvDnvCLrgmg==", + "license": "MIT", + "dependencies": { + "@unhead/schema": "1.11.20", + "@unhead/shared": "1.11.20", + "hookable": "^5.5.3", + "unhead": "1.11.20" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": ">=2.7 || >=3" + } + }, + "node_modules/@vitejs/plugin-vue2": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue2/-/plugin-vue2-2.3.3.tgz", + "integrity": "sha512-qexY6+bbwY8h0AZerzUuGywNTi0cLOkbiSbggr0R3WEW95iB2hblQFyv4MAkkc2vm4gZN1cO5kzT1Kp6xlVzZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >= 16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "vue": "^2.7.0-0" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^1.0.2", + "ast-v8-to-istanbul": "^0.3.3", + "debug": "^4.4.1", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "std-env": "^3.9.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "3.2.4", + "vitest": "3.2.4" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/coverage-v8/node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/mocker/node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", + "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", + "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-preset-app": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-5.0.9.tgz", + "integrity": "sha512-0rKOF4s/AhaRMJLybxOCgXfwtYhO3pwDSL/q/W8wRs1LzmHAc77FyTXWlun6VyKiSKwSdtH7CvOiWqq+DfofdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/helper-compilation-targets": "^7.12.16", + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-proposal-class-properties": "^7.12.13", + "@babel/plugin-proposal-decorators": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/runtime": "^7.12.13", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.1.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.8.3", + "core-js-compat": "^3.8.3", + "semver": "^7.3.4" + }, + "peerDependencies": { + "@babel/core": "*", + "core-js": "^3", + "vue": "^2 || ^3.2.13" + }, + "peerDependenciesMeta": { + "core-js": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-preset-app/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vue/babel-preset-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", + "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "@vue/babel-sugar-composition-api-inject-h": "^1.4.0", + "@vue/babel-sugar-composition-api-render-instance": "^1.4.0", + "@vue/babel-sugar-functional-vue": "^1.4.0", + "@vue/babel-sugar-inject-h": "^1.4.0", + "@vue/babel-sugar-v-model": "^1.4.0", + "@vue/babel-sugar-v-on": "^1.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "vue": "*" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", + "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", + "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", + "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", + "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", + "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", + "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.19", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/component-compiler-utils/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/eslint-config-prettier": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-10.2.0.tgz", + "integrity": "sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.2" + }, + "peerDependencies": { + "eslint": ">= 8.21.0", + "prettier": ">= 3.0.0" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/test-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.3.6.tgz", + "integrity": "sha512-udMmmF1ts3zwxUJEIAj5ziioR900reDrt6C9H3XpWPsLBx2lpHKoA4BTdd9HNIYbkGltWw+JjWJ+5O6QBwiyEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dom-event-types": "^1.0.0", + "lodash": "^4.17.15", + "pretty": "^2.0.0" + }, + "peerDependencies": { + "vue": "2.x", + "vue-template-compiler": "^2.x" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@zxcvbn-ts/core": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@zxcvbn-ts/core/-/core-3.0.4.tgz", + "integrity": "sha512-aQeiT0F09FuJaAqNrxynlAwZ2mW/1MdXakKWNmGM1Qp/VaY6CnB/GfnMS2T8gB2231Esp1/maCWd8vTG4OuShw==", + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "1.0.16" + } + }, + "node_modules/@zxcvbn-ts/language-common": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@zxcvbn-ts/language-common/-/language-common-3.0.4.tgz", + "integrity": "sha512-viSNNnRYtc7ULXzxrQIVUNwHAPSXRtoIwy/Tq4XQQdIknBzw4vz36lQLF6mvhMlTIlpjoN/Z1GFu/fwiAlUSsw==", + "license": "MIT" + }, + "node_modules/@zxcvbn-ts/language-de": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@zxcvbn-ts/language-de/-/language-de-3.0.2.tgz", + "integrity": "sha512-CPl2314qWtnJl4EkeEqFbL4unP6yEAHO976ER+df8CQcKsF4FxdZYEahkleWU66dhNI2VKnmJKNMzq8QtHQKcw==", + "license": "MIT" + }, + "node_modules/@zxcvbn-ts/language-en": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@zxcvbn-ts/language-en/-/language-en-3.0.2.tgz", + "integrity": "sha512-Zp+zL+I6Un2Bj0tRXNs6VUBq3Djt+hwTwUz4dkt2qgsQz47U0/XthZ4ULrT/RxjwJRl5LwiaKOOZeOtmixHnjg==", + "license": "MIT" + }, + "node_modules/@zxcvbn-ts/language-fr": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@zxcvbn-ts/language-fr/-/language-fr-3.0.2.tgz", + "integrity": "sha512-Tj9jS/Z8mNBAD21pn8Mp4O86CPrwImysO1fM3DG+fsfk8W79/MDzqpFDBHiqpu69Uo3LPPctMHEEteakFWt4Qg==", + "license": "MIT" + }, + "node_modules/@zxcvbn-ts/language-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@zxcvbn-ts/language-it/-/language-it-3.0.2.tgz", + "integrity": "sha512-VMC7JJZ855wPhklADB43kxRVWpbWIsVWjvrC8EACBoNqcFyk2DLD+WeoAtazM08ovM0wi/mN+wc0Sa5iFtOtvQ==", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/abs-svg-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", + "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", + "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz", + "integrity": "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.30", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-require-context-hook": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-require-context-hook/-/babel-plugin-require-context-hook-1.0.0.tgz", + "integrity": "sha512-EMZD1563QUqLhzrqcThk759RhuNVX/ZJdrtGK6drwzgvnR+ARjWyXIHPbu+tUNaMGtPz/gQeAM2M6VUw2UiUeA==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.10.tgz", + "integrity": "sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001746", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", + "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cheerio": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.12.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.0.tgz", + "integrity": "sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssfontparser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/dayjs": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT" + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-event-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.1.0.tgz", + "integrity": "sha512-jNCX+uNJ3v38BKvPbpki6j5ItVlnSqVV6vDWGS6rExzCMjsc39frLjm1n91o6YaKK6AZl0wLloItW6C6mr61BQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.228", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.228.tgz", + "integrity": "sha512-nxkiyuqAn4MJ1QbobwqJILiDtu/jk14hEAWaMiJmNPh1Z+jqoFlBFZjdXwLWGeVSeu9hGLg6+2G9yJaW8rBIFA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "license": "MIT" + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.36.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-compat-utils/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-local-rules": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-local-rules/-/eslint-plugin-local-rules-3.0.2.tgz", + "integrity": "sha512-IWME7GIYHXogTkFsToLdBCQVJ0U4kbSuVyDT+nKoR4UgtnVrrVeNWuAZkdEu1nxkvi9nsPccGehEEF6dgA28IQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-n": { + "version": "17.23.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz", + "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-promise": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.5.0.tgz", + "integrity": "sha512-7BZHsG3kC2vei8F2W8hnfDi9RK+cv5eKPMvzBdrl8Vuc0hR5odGQRli8VVzUkrmUHkxFEm4Iio1r5HOKslO0Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "vue-eslint-parser": "^10.0.0" + }, + "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, + "@typescript-eslint/parser": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue-scoped-css": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue-scoped-css/-/eslint-plugin-vue-scoped-css-2.12.0.tgz", + "integrity": "sha512-gEbuvYetNbsPA0IsmERFkVC2/vOHCInfFekNSOsAxWI/7C/bc8PoLal+fRibWfnzWryY6iL8YoluMtrEqWRj1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "eslint-compat-utils": "^0.6.5", + "lodash": "^4.17.21", + "postcss": "^8.4.31", + "postcss-safe-parser": "^6.0.0", + "postcss-scss": "^4.0.3", + "postcss-selector-parser": "^7.0.0", + "postcss-styl": "^0.12.0" + }, + "engines": { + "node": "^12.22 || ^14.17 || >=16" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "vue-eslint-parser": ">=7.1.0" + } + }, + "node_modules/eslint-plugin-vue-scoped-css/node_modules/eslint-compat-utils": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", + "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-vue-scoped-css/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-vue-scoped-css/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/flush-promises": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-promises/-/flush-promises-1.0.2.tgz", + "integrity": "sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fontkit": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.12", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "dfa": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "restructure": "^3.0.0", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.4.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/hal-json-normalizer": { + "version": "5.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/hal-json-normalizer/-/hal-json-normalizer-5.0.0-alpha.0.tgz", + "integrity": "sha512-c/7LnUA63PZ/i+Jx6ueUNzTfr05cWzaiFIO2/aoQ8LCIpY37INfflHtYTlQiSi9FfAQDI/CTeExUrbU6U1uEnw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">= 18.17.0" + } + }, + "node_modules/hal-json-vuex": { + "version": "3.0.0-alpha.10", + "resolved": "https://registry.npmjs.org/hal-json-vuex/-/hal-json-vuex-3.0.0-alpha.10.tgz", + "integrity": "sha512-2uKuvoMXKKFwtbNcs09LU7hOJEqWXNx0yTST0VKw9osYMIT0zQBdllIJUnK10oxtOSHYhmzFs7cF9LwEttSgyw==", + "license": "MIT", + "dependencies": { + "hal-json-normalizer": "^5.0.0-alpha.0", + "url-template": "^3.1.1", + "vue-demi": "^0.14.10" + }, + "engines": { + "node": ">=18.17.0" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^2.0.0 || >=3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/hal-json-vuex/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/hsl-to-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-to-hex/-/hsl-to-hex-1.0.0.tgz", + "integrity": "sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA==", + "license": "MIT", + "dependencies": { + "hsl-to-rgb-for-reals": "^1.1.0" + } + }, + "node_modules/hsl-to-rgb-for-reals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hsl-to-rgb-for-reals/-/hsl-to-rgb-for-reals-1.1.1.tgz", + "integrity": "sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg==", + "license": "ISC" + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hyphen": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/hyphen/-/hyphen-1.10.6.tgz", + "integrity": "sha512-fXHXcGFTXOvZTSkPJuGOQf5Lv5T/R2itiiCVPg9LxAje5D00O0pP83yJShFq5V89Ly//Gt6acj7z8pbBr34stw==", + "license": "ISC" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/inter-ui": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/inter-ui/-/inter-ui-3.19.3.tgz", + "integrity": "sha512-5FG9fjuYOXocIfjzcCBhICL5cpvwEetseL3FU6tP3d6Bn7g8wODhB+I9RNGRTizCT7CUG4GOK54OPxqq3msQgg==", + "license": "OFL-1.1" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jay-peg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jay-peg/-/jay-peg-1.1.1.tgz", + "integrity": "sha512-D62KEuBxz/ip2gQKOEhk/mx14o7eiFRaU+VNNSP4MOiIkwb/D6B3G1Mfas7C/Fit8EsSV2/IWjZElx/Gs6A4ww==", + "license": "MIT", + "dependencies": { + "restructure": "^3.0.0" + } + }, + "node_modules/jest-canvas-mock": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz", + "integrity": "sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.2" + } + }, + "node_modules/jest-serializer-vue-tjw": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/jest-serializer-vue-tjw/-/jest-serializer-vue-tjw-3.20.0.tgz", + "integrity": "sha512-N49cGTHbc1Fd06rZt1DxwWMksJmMrY5CMQPwJbTPC13htAYBKhFDSJ0lzWHdyX1EfWClYhN1gX+aHkTOvhRTqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio": "^1.0.0-rc.3", + "htmlparser2": "^9.0.0", + "js-beautify": "^1.14.8", + "lodash.clonedeep": "^4.5.0" + }, + "engines": { + "node": ">=8.3.0", + "npm": ">=5.0.0" + } + }, + "node_modules/js-beautify": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.4.2", + "js-cookie": "^3.0.5", + "nopt": "^7.2.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/linebreak/node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lint-staged": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.1.tgz", + "integrity": "sha512-KMeYmH9wKvHsXdUp+z6w7HN3fHKHXwT1pSTQTYxB9kI6ekK1rlL3kLZEoXZCppRPXFK9PFW/wfQctV7XUqMrPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.1", + "listr2": "^9.0.4", + "micromatch": "^4.0.8", + "nano-spawn": "^1.0.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", + "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/listr2": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.4.tgz", + "integrity": "sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortedlastindex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.sortedlastindex/-/lodash.sortedlastindex-4.1.0.tgz", + "integrity": "sha512-s8xEQdsp2Tu5zUqVdFSe9C0kR8YlnAJYLqMdkh+pIRBRxF6/apWseLdHl3/+jv2I61dhPwtI/Ff+EqvCpc+N8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/media-engine": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/media-engine/-/media-engine-1.0.3.tgz", + "integrity": "sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==", + "license": "MIT" + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/moo-color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", + "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.1.4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nano-spawn": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.3.tgz", + "integrity": "sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-svg-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "license": "MIT", + "dependencies": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "license": "MIT" + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/packrup": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/packrup/-/packrup-0.1.2.tgz", + "integrity": "sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-styl": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/postcss-styl/-/postcss-styl-0.12.3.tgz", + "integrity": "sha512-8I7Cd8sxiEITIp32xBK4K/Aj1ukX6vuWnx8oY/oAH35NfQI4OZaY5nd68Yx8HeN5S49uhQ6DL0rNk0ZBu/TaLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fast-diff": "^1.2.0", + "lodash.sortedlastindex": "^4.1.0", + "postcss": "^7.0.27 || ^8.0.0", + "stylus": "^0.57.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || ^11.10.1 || >=12.13.0" + }, + "funding": { + "url": "https://opencollective.com/stylus" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prosemirror-changeset": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.3.1.tgz", + "integrity": "sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==", + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", + "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", + "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", + "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", + "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.0.tgz", + "integrity": "sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz", + "integrity": "sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==", + "license": "MIT", + "dependencies": { + "@types/markdown-it": "^14.0.0", + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.25.0" + } + }, + "node_modules/prosemirror-menu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.5.tgz", + "integrity": "sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==", + "license": "MIT", + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.25.3", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.3.tgz", + "integrity": "sha512-dY2HdaNXlARknJbrManZ1WyUtos+AP97AmvqdOQtWtrrC5g4mohVX5DTi9rXNFSk09eczLq9GuNTtq3EfMeMGA==", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz", + "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.25.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", + "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", + "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.1.tgz", + "integrity": "sha512-DAgDoUYHCcc6tOGpLVPSU1k84kCUWTWnfWX3UDy2Delv4ryH0KqTD6RBI6k4yi9j9I8gl3j8MkPpRD/vWPZbug==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.25.0", + "prosemirror-state": "^1.4.3", + "prosemirror-transform": "^1.10.3", + "prosemirror-view": "^1.39.1" + } + }, + "node_modules/prosemirror-trailing-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", + "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", + "license": "MIT", + "dependencies": { + "@remirror/core-constants": "3.0.0", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz", + "integrity": "sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.2.tgz", + "integrity": "sha512-PGS/jETmh+Qjmre/6vcG7SNHAKiGc4vKOJmHMPRmvcUl7ISuVtrtHmH06UDUwaim4NDJfZfVMl7U7JkMMETa6g==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recaptcha-v3": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/recaptcha-v3/-/recaptcha-v3-1.11.3.tgz", + "integrity": "sha512-sEE6J0RzUkS+sKEBpgCD/AqCU0ffrAVOADGjvAx9vcttN+VLK42SWMkj/J/I6vHu3Kew+xcfbBqDVb65N0QGDw==", + "license": "Apache-2.0" + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restructure": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", + "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.3", + "@rollup/rollup-android-arm64": "4.52.3", + "@rollup/rollup-darwin-arm64": "4.52.3", + "@rollup/rollup-darwin-x64": "4.52.3", + "@rollup/rollup-freebsd-arm64": "4.52.3", + "@rollup/rollup-freebsd-x64": "4.52.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", + "@rollup/rollup-linux-arm-musleabihf": "4.52.3", + "@rollup/rollup-linux-arm64-gnu": "4.52.3", + "@rollup/rollup-linux-arm64-musl": "4.52.3", + "@rollup/rollup-linux-loong64-gnu": "4.52.3", + "@rollup/rollup-linux-ppc64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-musl": "4.52.3", + "@rollup/rollup-linux-s390x-gnu": "4.52.3", + "@rollup/rollup-linux-x64-gnu": "4.52.3", + "@rollup/rollup-linux-x64-musl": "4.52.3", + "@rollup/rollup-openharmony-arm64": "4.52.3", + "@rollup/rollup-win32-arm64-msvc": "4.52.3", + "@rollup/rollup-win32-ia32-msvc": "4.52.3", + "@rollup/rollup-win32-x64-gnu": "4.52.3", + "@rollup/rollup-win32-x64-msvc": "4.52.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "license": "MIT" + }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/runes": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/runes/-/runes-0.4.3.tgz", + "integrity": "sha512-K6p9y4ZyL9wPzA+PMDloNQPfoDGTiFYDvdlXznyGKgD10BJpcAosvATKrExRKOrNLgD8E7Um7WGW0lxsnOuNLg==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.78.0.tgz", + "integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "license": "ISC" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sortablejs": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz", + "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylus": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz", + "integrity": "sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css": "^3.0.0", + "debug": "^4.3.2", + "glob": "^7.1.6", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", + "license": "ISC" + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tippy.js": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", + "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, + "node_modules/ts-declaration-location/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", + "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/unhead": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.11.20.tgz", + "integrity": "sha512-3AsNQC0pjwlLqEYHLjtichGWankK8yqmocReITecmpB1H0aOabeESueyy+8X1gyJx4ftZVwo9hqQ4O3fPWffCA==", + "license": "MIT", + "dependencies": { + "@unhead/dom": "1.11.20", + "@unhead/schema": "1.11.20", + "@unhead/shared": "1.11.20", + "hookable": "^5.5.3" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz", + "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.8.1", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.0.tgz", + "integrity": "sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin-vue-components": { + "version": "29.1.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-29.1.0.tgz", + "integrity": "sha512-z/9ACPXth199s9aCTCdKZAhe5QGOpvzJYP+Hkd0GN1/PpAmsu+W3UlRY3BJAewPqQxh5xi56+Og6mfiCV1Jzpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "debug": "^4.4.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.19", + "mlly": "^1.8.0", + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.10", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/unplugin-vue-components/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin-vue-components/node_modules/unplugin": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz", + "integrity": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-vue-components/node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "name": "uri-js-replace", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/url-template": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-3.1.1.tgz", + "integrity": "sha512-4oszoaEKE/mQOtAmdMWqIRHmkxWkUZMnXFnjQ5i01CuRSK3uluxcH1MRVVVWmhlnzT1SCDfKxxficm2G37qzCA==", + "license": "BSD-3-Clause", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/v-resize-observer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v-resize-observer/-/v-resize-observer-2.1.0.tgz", + "integrity": "sha512-QyTdSFAAtsP1/2ISR2hsz8PeEyxhaACqJXIzs5INlHXtu/pkMqyva8tHPWA54YejUyhxmU1bPriDBnW2cqbBcA==", + "license": "MIT", + "dependencies": { + "resize-observer-polyfill": "^1.5.1", + "vue-demi": "latest" + }, + "peerDependencies": { + "@vue/composition-api": "^1.7.0", + "vue": "^2.5.0 || >=3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/v-resize-observer/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vee-validate": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-3.4.15.tgz", + "integrity": "sha512-qEtvq9X2N7l5pjBe/6YGrrIBHxJA4KTrb3QrER3qzM7fzkH730m8LyVWMIzM47l//618nlUa7VvTdMFTRKr8tQ==", + "license": "MIT", + "peerDependencies": { + "vue": "^2.5.18" + } + }, + "node_modules/vite": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-compatible-readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/vite-compatible-readable-stream/-/vite-compatible-readable-stream-3.6.1.tgz", + "integrity": "sha512-t20zYkrSf868+j/p31cRIGN28Phrjm3nRSLR2fyc2tiWi4cZGVdv68yNlwnIINTkMTmPoMiSlc0OadaO7DXZaQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-comlink": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-comlink/-/vite-plugin-comlink-5.3.0.tgz", + "integrity": "sha512-grCxBC8JaCYIHPIvrM5c8Hq+XjFs3nhwSDc0SLpgY3D2LtE5j0wIZTF8zMWMzwMcrFPXWSejZI6MF6yvP/Iq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "2.2.3", + "magic-string": "0.30.17", + "source-map": "^0.7.4" + }, + "peerDependencies": { + "comlink": "^4.3.1", + "vite": ">=2.9.6" + } + }, + "node_modules/vite-plugin-comlink/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/vite-plugin-vue2-svg": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue2-svg/-/vite-plugin-vue2-svg-0.4.0.tgz", + "integrity": "sha512-Z9NT9PTGwEKMSfxruPeBeAgMWAgMz5DiE6u8ZNtkYXODGWceUi6Dhp/f0NFO02sEoDiDxkokzr8u4qK4+9rXJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/component-compiler-utils": "^3.2.0", + "svgo": "^3.0.0" + }, + "peerDependencies": { + "vue-template-compiler": "^2.2.0" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest-canvas-mock": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/vitest-canvas-mock/-/vitest-canvas-mock-0.3.3.tgz", + "integrity": "sha512-3P968tYBpqYyzzOaVtqnmYjqbe13576/fkjbDEJSfQAkHtC5/UjuRHOhFEN/ZV5HVZIkaROBUWgazDKJ+Ibw+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-canvas-mock": "~2.5.2" + }, + "peerDependencies": { + "vitest": "*" + } + }, + "node_modules/vitest/node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vue": { + "version": "2.7.15", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.15.tgz", + "integrity": "sha512-a29fsXd2G0KMRqIFTpRgpSbWaNBK3lpCTOLuGLEDnlHWdjB8fwl6zyYZ8xCrqkJdatwZb4mGHiEfJjnw0Q6AwQ==", + "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "2.7.15", + "csstype": "^3.1.0" + } + }, + "node_modules/vue-axios": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/vue-axios/-/vue-axios-3.5.2.tgz", + "integrity": "sha512-GP+dct7UlAWkl1qoP3ppw0z6jcSua5/IrMpjB5O8bh089iIiJ+hdxPYH2NPEpajlYgkW5EVMP95ttXWdas1O0g==", + "license": "MIT", + "peerDependencies": { + "axios": "*", + "vue": "^3.0.0 || ^2.0.0" + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz", + "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-i18n": { + "version": "8.28.2", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.28.2.tgz", + "integrity": "sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA==", + "deprecated": "Vue I18n v8.x has reached EOL and is no longer actively maintained. About maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html", + "license": "MIT" + }, + "node_modules/vue-recaptcha-v3": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/vue-recaptcha-v3/-/vue-recaptcha-v3-1.9.0.tgz", + "integrity": "sha512-WQIlhcOcETk3SYbEC88podUSq1J7UjmHpKgJhSy0Xm3DAjTIPjl19g9kn5KRdyTxNLiS/eR5C6H3Jk3c7b9baA==", + "license": "Apache-2.0", + "dependencies": { + "recaptcha-v3": "^1.8.0" + }, + "peerDependencies": { + "vue": "^2.6.11" + } + }, + "node_modules/vue-router": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", + "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==", + "license": "MIT" + }, + "node_modules/vue-template-compiler": { + "version": "2.7.15", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz", + "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-toastification": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/vue-toastification/-/vue-toastification-1.7.14.tgz", + "integrity": "sha512-khZR8t3NWZ/JJ2MZxXLbesHrRJ8AKa75PY5Zq8yMifF9x8lHq8ljYkC0d2PD9yahooygQB5tcFyRDkbbIPx8hw==", + "license": "MIT", + "peerDependencies": { + "vue": "^2.0.0" + } + }, + "node_modules/vue-ts-types": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vue-ts-types/-/vue-ts-types-1.6.2.tgz", + "integrity": "sha512-iOBe4oMoTeISs+Wxlt5E6q3W6lEX6UtkwWCPu6727IoweBE3O3Vp/2/BtO+Kf5pISQU7WpX71hXTeMGqHsmecA==", + "license": "MIT", + "peerDependencies": { + "vue": "^2.6 || ^3.2" + } + }, + "node_modules/vue/node_modules/@vue/compiler-sfc": { + "version": "2.7.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.15.tgz", + "integrity": "sha512-FCvIEevPmgCgqFBH7wD+3B97y7u7oj/Wr69zADBf403Tui377bThTjBvekaZvlRr4IwUAu3M6hYZeULZFJbdYg==", + "dependencies": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "node_modules/vue/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vuedraggable": { + "version": "2.24.3", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz", + "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==", + "license": "MIT", + "dependencies": { + "sortablejs": "1.10.2" + } + }, + "node_modules/vuetify": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.7.2.tgz", + "integrity": "sha512-qr04ww7uzAPQbpk751x4fSdjsJ+zREzjQ/rBlcQGuWS6MIMFMXcXcwvp4+/tnGsULZxPMWfQ0kmZmg5Yc/XzgQ==", + "deprecated": "This version is deprecated", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/johnleider" + }, + "peerDependencies": { + "vue": "^2.6.4" + } + }, + "node_modules/vuex": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", + "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", + "license": "MIT", + "peerDependencies": { + "vue": "^2.0.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "license": "MIT", + "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 + } + } + }, + "node_modules/xlsx": { + "version": "0.20.2", + "resolved": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz", + "integrity": "sha512-+nKZ39+nvK7Qq6i0PvWWRA4j/EkfWOtkP/YhMtupm+lJIiHxUrgTr1CcKv1nBk1rHtkRRQ3O2+Ih/q/sA+FXZA==", + "license": "Apache-2.0", + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "license": "MIT" + }, + "node_modules/zhead": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz", + "integrity": "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + } + } +} diff --git a/frontend-old/package.json b/frontend-old/package.json new file mode 100644 index 0000000000..750d303e74 --- /dev/null +++ b/frontend-old/package.json @@ -0,0 +1,153 @@ +{ + "name": "@ecamp3/frontend", + "private": true, + "type": "module", + "scripts": { + "serve": "vite --host 0.0.0.0", + "preview": "vite preview --host 0.0.0.0 --port 3000", + "build": "vite build", + "lint": "npm run lint:eslint && npm run lint:prettier", + "lint:eslint": "eslint --fix .", + "lint:prettier": "prettier --write --ignore-path .prettierignore **/*.{css,scss,json,md}", + "lint:check": "npm run lint:check:eslint && npm run lint:check:prettier", + "lint:check:eslint": "eslint .", + "lint:check:prettier": "prettier --check --ignore-path .prettierignore **/*.{css,scss,json,md}", + "start": "vite --host 0.0.0.0", + "dev": "vite --host 0.0.0.0", + "test:unit": "vitest run --coverage", + "test:unit:debug": "node --inspect-brk=0.0.0.0:9229 ./node_modules/.bin/vitest --no-cache --runInBand", + "test:unit:watch": "vitest --watch", + "postinstall": "./scripts/install-twemoji.sh && patch-package" + }, + "dependencies": { + "@intlify/core": "11.1.12", + "@leeoniya/ufuzzy": "1.0.19", + "@mdi/font": "7.4.47", + "@react-pdf/font": "4.0.3", + "@react-pdf/layout": "4.4.1", + "@react-pdf/pdfkit": "4.0.4", + "@react-pdf/primitives": "4.1.1", + "@react-pdf/render": "4.3.1", + "@sentry/browser": "9.46.0", + "@sentry/vue": "9.46.0", + "@tiptap/extension-bold": "2.26.2", + "@tiptap/extension-bubble-menu": "2.26.2", + "@tiptap/extension-bullet-list": "2.26.2", + "@tiptap/extension-document": "2.26.2", + "@tiptap/extension-hard-break": "2.26.2", + "@tiptap/extension-heading": "2.26.2", + "@tiptap/extension-history": "2.26.2", + "@tiptap/extension-italic": "2.26.2", + "@tiptap/extension-list-item": "2.26.2", + "@tiptap/extension-ordered-list": "2.26.2", + "@tiptap/extension-paragraph": "2.26.2", + "@tiptap/extension-placeholder": "2.26.2", + "@tiptap/extension-strike": "2.26.2", + "@tiptap/extension-text": "2.26.2", + "@tiptap/extension-underline": "2.26.2", + "@tiptap/pm": "2.26.2", + "@tiptap/vue-2": "2.26.2", + "@unhead/vue": "1.11.20", + "@zxcvbn-ts/core": "3.0.4", + "@zxcvbn-ts/language-common": "3.0.4", + "@zxcvbn-ts/language-de": "3.0.2", + "@zxcvbn-ts/language-en": "3.0.2", + "@zxcvbn-ts/language-fr": "3.0.2", + "@zxcvbn-ts/language-it": "3.0.2", + "assert": "2.1.0", + "axios": "1.12.2", + "colorjs.io": "0.5.2", + "comlink": "4.4.2", + "dayjs": "1.11.18", + "deepmerge": "4.3.1", + "emoji-regex": "10.5.0", + "file-saver": "2.0.5", + "hal-json-vuex": "3.0.0-alpha.10", + "inter-ui": "3.19.3", + "js-cookie": "3.0.5", + "linkify-it": "5.0.0", + "lodash-es": "4.17.21", + "runes": "0.4.3", + "slugify": "1.6.6", + "url-template": "3.1.1", + "util": "0.12.5", + "v-resize-observer": "2.1.0", + "vee-validate": "3.4.15", + "vue": "2.7.15", + "vue-axios": "3.5.2", + "vue-i18n": "8.28.2", + "vue-recaptcha-v3": "1.9.0", + "vue-router": "3.6.5", + "vue-toastification": "1.7.14", + "vuedraggable": "2.24.3", + "vuetify": "2.7.2", + "vuex": "3.6.2", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz" + }, + "devDependencies": { + "@babel/eslint-parser": "7.28.4", + "@eslint/compat": "1.4.0", + "@eslint/js": "9.36.0", + "@sentry/vite-plugin": "3.6.1", + "@testing-library/jest-dom": "6.8.0", + "@testing-library/user-event": "14.6.1", + "@testing-library/vue": "5.9.0", + "@vitejs/plugin-vue2": "2.3.3", + "@vitest/coverage-v8": "3.2.4", + "@vue/babel-preset-app": "5.0.9", + "@vue/eslint-config-prettier": "10.2.0", + "@vue/test-utils": "1.3.6", + "autoprefixer": "10.4.21", + "babel-plugin-require-context-hook": "1.0.0", + "eslint": "9.36.0", + "eslint-config-prettier": "10.1.8", + "eslint-plugin-local-rules": "3.0.2", + "eslint-plugin-n": "17.23.1", + "eslint-plugin-prettier": "5.5.4", + "eslint-plugin-promise": "7.2.1", + "eslint-plugin-vue": "10.5.0", + "eslint-plugin-vue-scoped-css": "2.12.0", + "flush-promises": "1.0.2", + "globals": "16.4.0", + "jest-serializer-vue-tjw": "3.20.0", + "jsdom": "26.1.0", + "lint-staged": "16.2.1", + "patch-package": "8.0.0", + "prettier": "3.6.2", + "sass": "1.78.0", + "source-map": "0.7.6", + "unplugin-vue-components": "29.1.0", + "vite": "6.3.6", + "vite-plugin-comlink": "5.3.0", + "vite-plugin-vue2-svg": "0.4.0", + "vitest": "3.2.4", + "vitest-canvas-mock": "0.3.3", + "vue-template-compiler": "2.7.15" + }, + "overrides": { + "uri-js": "npm:uri-js-replace" + }, + "postcss": { + "plugins": { + "autoprefixer": {} + } + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ], + "gitHooks": { + "pre-commit": "lint-staged" + }, + "lint-staged": { + "*.js": [ + "eslint . --ext .vue,.js --fix --ignore-path .gitignore", + "git add" + ], + "*.vue": [ + "eslint . --ext .vue,.js --fix --ignore-path .gitignore", + "git add" + ] + } +} diff --git a/frontend-old/patches/@react-pdf+layout+4.4.0.patch b/frontend-old/patches/@react-pdf+layout+4.4.0.patch new file mode 100644 index 0000000000..d835c38dd1 --- /dev/null +++ b/frontend-old/patches/@react-pdf+layout+4.4.0.patch @@ -0,0 +1,17 @@ +diff --git a/node_modules/@react-pdf/layout/lib/index.js b/node_modules/@react-pdf/layout/lib/index.js +index b318728..5e9efed 100644 +--- a/node_modules/@react-pdf/layout/lib/index.js ++++ b/node_modules/@react-pdf/layout/lib/index.js +@@ -2717,10 +2717,12 @@ const paginate = (page, pageNumber, fontStore, yoga) => { + return []; + if (page.props?.wrap === false) + return [page]; ++ dispatchEvent(new Event('layoutPage')); + let splittedPage = splitPage(page, pageNumber, fontStore, yoga); + const pages = [splittedPage[0]]; + let nextPage = splittedPage[1]; + while (nextPage !== null) { ++ dispatchEvent(new Event('layoutPage')); + splittedPage = splitPage(nextPage, pageNumber + pages.length, fontStore, yoga); + pages.push(splittedPage[0]); + nextPage = splittedPage[1]; diff --git a/frontend-old/public/browserassets/apple-touch-icon.png b/frontend-old/public/browserassets/apple-touch-icon.png new file mode 100644 index 0000000000..76e05f775e Binary files /dev/null and b/frontend-old/public/browserassets/apple-touch-icon.png differ diff --git a/frontend-old/public/browserassets/favicon-16x16.png b/frontend-old/public/browserassets/favicon-16x16.png new file mode 100644 index 0000000000..33174bb3cc Binary files /dev/null and b/frontend-old/public/browserassets/favicon-16x16.png differ diff --git a/frontend-old/public/browserassets/favicon-32x32.png b/frontend-old/public/browserassets/favicon-32x32.png new file mode 100644 index 0000000000..439c68f9e7 Binary files /dev/null and b/frontend-old/public/browserassets/favicon-32x32.png differ diff --git a/frontend-old/public/browserassets/logo@192px.png b/frontend-old/public/browserassets/logo@192px.png new file mode 100644 index 0000000000..d275c989c4 Binary files /dev/null and b/frontend-old/public/browserassets/logo@192px.png differ diff --git a/frontend-old/public/browserassets/logo@512px.png b/frontend-old/public/browserassets/logo@512px.png new file mode 100644 index 0000000000..f8778ee95f Binary files /dev/null and b/frontend-old/public/browserassets/logo@512px.png differ diff --git a/frontend-old/public/browserassets/mstile-150x150.png b/frontend-old/public/browserassets/mstile-150x150.png new file mode 100644 index 0000000000..322c49bc50 Binary files /dev/null and b/frontend-old/public/browserassets/mstile-150x150.png differ diff --git a/frontend-old/public/browserassets/safari-pinned-tab.svg b/frontend-old/public/browserassets/safari-pinned-tab.svg new file mode 100644 index 0000000000..0248b1e6bc --- /dev/null +++ b/frontend-old/public/browserassets/safari-pinned-tab.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/frontend-old/public/browserconfig.xml b/frontend-old/public/browserconfig.xml new file mode 100644 index 0000000000..1cd51a1fa2 --- /dev/null +++ b/frontend-old/public/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #263238 + + + diff --git a/frontend-old/public/environment.js b/frontend-old/public/environment.js new file mode 100644 index 0000000000..47b91ee3e6 --- /dev/null +++ b/frontend-old/public/environment.js @@ -0,0 +1,5 @@ +/** + * This is a placeholder. + * In production, this file is filled with the values for window.environment. + * In development, window.environment is filled in src/dev-environment.js + */ diff --git a/frontend-old/public/favicon.ico b/frontend-old/public/favicon.ico new file mode 100644 index 0000000000..91f0bdb83b Binary files /dev/null and b/frontend-old/public/favicon.ico differ diff --git a/frontend-old/public/favicon.svg b/frontend-old/public/favicon.svg new file mode 100644 index 0000000000..40da9b592e --- /dev/null +++ b/frontend-old/public/favicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frontend-old/public/logo.svg b/frontend-old/public/logo.svg new file mode 100644 index 0000000000..d9d26fca25 --- /dev/null +++ b/frontend-old/public/logo.svg @@ -0,0 +1,55 @@ + + Logo eCamp v3 + + + + image/svg+xml + + Logo eCamp v3 + 2020-04-02 + Manuel Meister + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend-old/public/manifest.webmanifest b/frontend-old/public/manifest.webmanifest new file mode 100644 index 0000000000..1b9895dc65 --- /dev/null +++ b/frontend-old/public/manifest.webmanifest @@ -0,0 +1,30 @@ +{ + "short_name": "eCamp", + "name": "eCamp v3", + "icons": [ + { + "src": "/favicon.svg", + "type": "image/svg", + "sizes": "16x16" + }, + { + "src": "/logo.svg", + "type": "image/svg", + "sizes": "64x64" + }, + { + "src": "/browserassets/logo@192px.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "/browserassets/logo@512px.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": "/", + "background_color": "#546e7a", + "display": "minimal-ui", + "theme_color": "#546e7a" +} diff --git a/frontend-old/scripts/install-twemoji.sh b/frontend-old/scripts/install-twemoji.sh new file mode 100755 index 0000000000..9a1cb6172e --- /dev/null +++ b/frontend-old/scripts/install-twemoji.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env sh + +# We need twemoji for emoji support in client-side printing. Since there is no maintained npm package +# which includes the actual emoji images, we use this script to install the images. By default, +# twemoji are usually accessed from CDNs, but for traceability reasons, we self-host them. + +set -euo + +if [ ! -d "public/twemoji" ] +then + echo 'downloading twemoji images from GitHub...' + # Clone as little as possible. No past revisions and only the image files we are interested in. + git clone --depth 1 --no-checkout --filter=blob:none --sparse https://github.com/twitter/twemoji.git public/twemoji + cd public/twemoji + git sparse-checkout set assets/72x72 + git checkout master +else + echo 'twemoji are already present, updating them to the latest version...' + cd public/twemoji + git pull || echo 'Could not update twemoji. Skipping for now...' +fi + +echo 'twemoji images should be up to date now.' diff --git a/frontend-old/src/App.vue b/frontend-old/src/App.vue new file mode 100644 index 0000000000..71fd3afb85 --- /dev/null +++ b/frontend-old/src/App.vue @@ -0,0 +1,161 @@ + + + + + + + + diff --git a/frontend-old/src/assets/080720_lotos_7896.jpg b/frontend-old/src/assets/080720_lotos_7896.jpg new file mode 100644 index 0000000000..ba331f6694 Binary files /dev/null and b/frontend-old/src/assets/080720_lotos_7896.jpg differ diff --git a/frontend-old/src/assets/080720_lotos_7896_small.jpg b/frontend-old/src/assets/080720_lotos_7896_small.jpg new file mode 100644 index 0000000000..7e9c9c4847 Binary files /dev/null and b/frontend-old/src/assets/080720_lotos_7896_small.jpg differ diff --git a/frontend-old/src/assets/140801151550_LOM.jpg b/frontend-old/src/assets/140801151550_LOM.jpg new file mode 100644 index 0000000000..be93ebdeda Binary files /dev/null and b/frontend-old/src/assets/140801151550_LOM.jpg differ diff --git a/frontend-old/src/assets/140801151550_LOM_small.jpg b/frontend-old/src/assets/140801151550_LOM_small.jpg new file mode 100644 index 0000000000..640aa99370 Binary files /dev/null and b/frontend-old/src/assets/140801151550_LOM_small.jpg differ diff --git a/frontend-old/src/assets/CeviLogo.svg b/frontend-old/src/assets/CeviLogo.svg new file mode 100644 index 0000000000..a085896ad3 --- /dev/null +++ b/frontend-old/src/assets/CeviLogo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-old/src/assets/FourZeroFour.svg b/frontend-old/src/assets/FourZeroFour.svg new file mode 100644 index 0000000000..e4cd16606e --- /dev/null +++ b/frontend-old/src/assets/FourZeroFour.svg @@ -0,0 +1,65 @@ + + Error 404 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-old/src/assets/GoogleLogo.svg b/frontend-old/src/assets/GoogleLogo.svg new file mode 100644 index 0000000000..3bbcc195cb --- /dev/null +++ b/frontend-old/src/assets/GoogleLogo.svg @@ -0,0 +1 @@ + diff --git a/frontend-old/src/assets/JublaLogo.svg b/frontend-old/src/assets/JublaLogo.svg new file mode 100644 index 0000000000..a13774d235 --- /dev/null +++ b/frontend-old/src/assets/JublaLogo.svg @@ -0,0 +1 @@ + diff --git a/frontend-old/src/assets/PbsLogo.svg b/frontend-old/src/assets/PbsLogo.svg new file mode 100644 index 0000000000..e4086e4f2e --- /dev/null +++ b/frontend-old/src/assets/PbsLogo.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend-old/src/assets/eCampLogo.svg b/frontend-old/src/assets/eCampLogo.svg new file mode 100644 index 0000000000..defa95d10e --- /dev/null +++ b/frontend-old/src/assets/eCampLogo.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/fonts b/frontend-old/src/assets/fonts similarity index 100% rename from frontend/src/assets/fonts rename to frontend-old/src/assets/fonts diff --git a/frontend-old/src/assets/icons/BigScreen.svg b/frontend-old/src/assets/icons/BigScreen.svg new file mode 100644 index 0000000000..88e320bd94 --- /dev/null +++ b/frontend-old/src/assets/icons/BigScreen.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend-old/src/assets/icons/Coffee.vue b/frontend-old/src/assets/icons/Coffee.vue new file mode 100644 index 0000000000..ef7ae7f7ef --- /dev/null +++ b/frontend-old/src/assets/icons/Coffee.vue @@ -0,0 +1,62 @@ + diff --git a/frontend-old/src/assets/icons/ColumnLayout.svg b/frontend-old/src/assets/icons/ColumnLayout.svg new file mode 100644 index 0000000000..c640451de1 --- /dev/null +++ b/frontend-old/src/assets/icons/ColumnLayout.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/frontend-old/src/assets/icons/PaperSize.svg b/frontend-old/src/assets/icons/PaperSize.svg new file mode 100644 index 0000000000..5b2ec65313 --- /dev/null +++ b/frontend-old/src/assets/icons/PaperSize.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend-old/src/assets/icons/ResponsiveLayout.svg b/frontend-old/src/assets/icons/ResponsiveLayout.svg new file mode 100644 index 0000000000..f65d28cce0 --- /dev/null +++ b/frontend-old/src/assets/icons/ResponsiveLayout.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/frontend-old/src/assets/invitation/edge-left.svg b/frontend-old/src/assets/invitation/edge-left.svg new file mode 100644 index 0000000000..5d61de797e --- /dev/null +++ b/frontend-old/src/assets/invitation/edge-left.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend-old/src/assets/invitation/edge-right.svg b/frontend-old/src/assets/invitation/edge-right.svg new file mode 100644 index 0000000000..083701dc30 --- /dev/null +++ b/frontend-old/src/assets/invitation/edge-right.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend-old/src/assets/invitation/tree-left.svg b/frontend-old/src/assets/invitation/tree-left.svg new file mode 100644 index 0000000000..a0a6c8ccfd --- /dev/null +++ b/frontend-old/src/assets/invitation/tree-left.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/frontend-old/src/assets/invitation/tree-right.svg b/frontend-old/src/assets/invitation/tree-right.svg new file mode 100644 index 0000000000..443c359e56 --- /dev/null +++ b/frontend-old/src/assets/invitation/tree-right.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/frontend-old/src/assets/logo.png b/frontend-old/src/assets/logo.png new file mode 100644 index 0000000000..f3d2503fc2 Binary files /dev/null and b/frontend-old/src/assets/logo.png differ diff --git a/frontend-old/src/assets/tents/ShootingStar.vue b/frontend-old/src/assets/tents/ShootingStar.vue new file mode 100644 index 0000000000..84acc6e684 --- /dev/null +++ b/frontend-old/src/assets/tents/ShootingStar.vue @@ -0,0 +1,37 @@ + + + diff --git a/frontend-old/src/assets/tents/TentDay.svg b/frontend-old/src/assets/tents/TentDay.svg new file mode 100644 index 0000000000..865ed192d9 --- /dev/null +++ b/frontend-old/src/assets/tents/TentDay.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend-old/src/assets/tents/TentNight.vue b/frontend-old/src/assets/tents/TentNight.vue new file mode 100644 index 0000000000..2bdf6a2fe6 --- /dev/null +++ b/frontend-old/src/assets/tents/TentNight.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/frontend-old/src/assets/tents/stars.svg b/frontend-old/src/assets/tents/stars.svg new file mode 100644 index 0000000000..d794cdcaa9 --- /dev/null +++ b/frontend-old/src/assets/tents/stars.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend-old/src/common b/frontend-old/src/common new file mode 120000 index 0000000000..dc879abe93 --- /dev/null +++ b/frontend-old/src/common @@ -0,0 +1 @@ +../../common \ No newline at end of file diff --git a/frontend-old/src/components/activity/ActivityResponsibles.vue b/frontend-old/src/components/activity/ActivityResponsibles.vue new file mode 100644 index 0000000000..4fab49fbbe --- /dev/null +++ b/frontend-old/src/components/activity/ActivityResponsibles.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/frontend-old/src/components/activity/ButtonNestedContentNodeAdd.vue b/frontend-old/src/components/activity/ButtonNestedContentNodeAdd.vue new file mode 100644 index 0000000000..09a96af8eb --- /dev/null +++ b/frontend-old/src/components/activity/ButtonNestedContentNodeAdd.vue @@ -0,0 +1,185 @@ + + + + diff --git a/frontend-old/src/components/activity/ContentNode.vue b/frontend-old/src/components/activity/ContentNode.vue new file mode 100644 index 0000000000..0a5a49548c --- /dev/null +++ b/frontend-old/src/components/activity/ContentNode.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/frontend-old/src/components/activity/DaySwitcher.vue b/frontend-old/src/components/activity/DaySwitcher.vue new file mode 100644 index 0000000000..1927df1baa --- /dev/null +++ b/frontend-old/src/components/activity/DaySwitcher.vue @@ -0,0 +1,137 @@ + + + + + + diff --git a/frontend-old/src/components/activity/DraggableContentNodes.vue b/frontend-old/src/components/activity/DraggableContentNodes.vue new file mode 100644 index 0000000000..e8bd363018 --- /dev/null +++ b/frontend-old/src/components/activity/DraggableContentNodes.vue @@ -0,0 +1,246 @@ + + + diff --git a/frontend-old/src/components/activity/MenuCardlessContentNode.vue b/frontend-old/src/components/activity/MenuCardlessContentNode.vue new file mode 100644 index 0000000000..5ee0f6c94f --- /dev/null +++ b/frontend-old/src/components/activity/MenuCardlessContentNode.vue @@ -0,0 +1,78 @@ + + diff --git a/frontend-old/src/components/activity/RootNode.vue b/frontend-old/src/components/activity/RootNode.vue new file mode 100644 index 0000000000..052d65946a --- /dev/null +++ b/frontend-old/src/components/activity/RootNode.vue @@ -0,0 +1,51 @@ + + + diff --git a/frontend-old/src/components/activity/ScheduleEntry.vue b/frontend-old/src/components/activity/ScheduleEntry.vue new file mode 100644 index 0000000000..23d0abf008 --- /dev/null +++ b/frontend-old/src/components/activity/ScheduleEntry.vue @@ -0,0 +1,566 @@ + + + + + + + diff --git a/frontend-old/src/components/activity/TogglePaperSize.vue b/frontend-old/src/components/activity/TogglePaperSize.vue new file mode 100644 index 0000000000..624420aa15 --- /dev/null +++ b/frontend-old/src/components/activity/TogglePaperSize.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/Checklist.vue b/frontend-old/src/components/activity/content/Checklist.vue new file mode 100644 index 0000000000..ae71b8010b --- /dev/null +++ b/frontend-old/src/components/activity/content/Checklist.vue @@ -0,0 +1,251 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/ColumnLayout.vue b/frontend-old/src/components/activity/content/ColumnLayout.vue new file mode 100644 index 0000000000..2c61bbeadd --- /dev/null +++ b/frontend-old/src/components/activity/content/ColumnLayout.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/LAThematicArea.vue b/frontend-old/src/components/activity/content/LAThematicArea.vue new file mode 100644 index 0000000000..a5d293d429 --- /dev/null +++ b/frontend-old/src/components/activity/content/LAThematicArea.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/LearningObjectives.vue b/frontend-old/src/components/activity/content/LearningObjectives.vue new file mode 100644 index 0000000000..84256e746a --- /dev/null +++ b/frontend-old/src/components/activity/content/LearningObjectives.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/LearningTopics.vue b/frontend-old/src/components/activity/content/LearningTopics.vue new file mode 100644 index 0000000000..d21578735b --- /dev/null +++ b/frontend-old/src/components/activity/content/LearningTopics.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/Material.vue b/frontend-old/src/components/activity/content/Material.vue new file mode 100644 index 0000000000..db78fe5c85 --- /dev/null +++ b/frontend-old/src/components/activity/content/Material.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/Notes.vue b/frontend-old/src/components/activity/content/Notes.vue new file mode 100644 index 0000000000..6e5deaccd7 --- /dev/null +++ b/frontend-old/src/components/activity/content/Notes.vue @@ -0,0 +1,26 @@ + + + diff --git a/frontend-old/src/components/activity/content/ResponsiveLayout.vue b/frontend-old/src/components/activity/content/ResponsiveLayout.vue new file mode 100644 index 0000000000..9379a936a2 --- /dev/null +++ b/frontend-old/src/components/activity/content/ResponsiveLayout.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/SafetyConsiderations.vue b/frontend-old/src/components/activity/content/SafetyConsiderations.vue new file mode 100644 index 0000000000..8359f14eae --- /dev/null +++ b/frontend-old/src/components/activity/content/SafetyConsiderations.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/Storyboard.vue b/frontend-old/src/components/activity/content/Storyboard.vue new file mode 100644 index 0000000000..084eb75d93 --- /dev/null +++ b/frontend-old/src/components/activity/content/Storyboard.vue @@ -0,0 +1,196 @@ + + + + diff --git a/frontend-old/src/components/activity/content/Storycontext.vue b/frontend-old/src/components/activity/content/Storycontext.vue new file mode 100644 index 0000000000..283a6acbf0 --- /dev/null +++ b/frontend-old/src/components/activity/content/Storycontext.vue @@ -0,0 +1,26 @@ + + + diff --git a/frontend-old/src/components/activity/content/checklist/ChecklistItem.vue b/frontend-old/src/components/activity/content/checklist/ChecklistItem.vue new file mode 100644 index 0000000000..4ae9e7883e --- /dev/null +++ b/frontend-old/src/components/activity/content/checklist/ChecklistItem.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/checklist/ChecklistItems.vue b/frontend-old/src/components/activity/content/checklist/ChecklistItems.vue new file mode 100644 index 0000000000..3440be802a --- /dev/null +++ b/frontend-old/src/components/activity/content/checklist/ChecklistItems.vue @@ -0,0 +1,55 @@ + + + diff --git a/frontend-old/src/components/activity/content/columnLayout/ColumnIndicator.vue b/frontend-old/src/components/activity/content/columnLayout/ColumnIndicator.vue new file mode 100644 index 0000000000..b7c852f3f2 --- /dev/null +++ b/frontend-old/src/components/activity/content/columnLayout/ColumnIndicator.vue @@ -0,0 +1,37 @@ + + diff --git a/frontend-old/src/components/activity/content/columnLayout/ColumnOperations.vue b/frontend-old/src/components/activity/content/columnLayout/ColumnOperations.vue new file mode 100644 index 0000000000..e7a2bb34a0 --- /dev/null +++ b/frontend-old/src/components/activity/content/columnLayout/ColumnOperations.vue @@ -0,0 +1,97 @@ + + diff --git a/frontend-old/src/components/activity/content/columnLayout/ResizableColumn.vue b/frontend-old/src/components/activity/content/columnLayout/ResizableColumn.vue new file mode 100644 index 0000000000..b58a4aa4fc --- /dev/null +++ b/frontend-old/src/components/activity/content/columnLayout/ResizableColumn.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/columnLayout/ResizableColumnHeader.vue b/frontend-old/src/components/activity/content/columnLayout/ResizableColumnHeader.vue new file mode 100644 index 0000000000..587dd72590 --- /dev/null +++ b/frontend-old/src/components/activity/content/columnLayout/ResizableColumnHeader.vue @@ -0,0 +1,166 @@ + + + diff --git a/frontend-old/src/components/activity/content/columnLayout/__tests__/calculateNextSlotName.spec.js b/frontend-old/src/components/activity/content/columnLayout/__tests__/calculateNextSlotName.spec.js new file mode 100644 index 0000000000..a2a2324432 --- /dev/null +++ b/frontend-old/src/components/activity/content/columnLayout/__tests__/calculateNextSlotName.spec.js @@ -0,0 +1,73 @@ +import { describe, expect, it } from 'vitest' +import { calculateNextSlotName, adjustColumnWidths } from '../calculateNextSlotName.js' + +describe('generating a next slot name', () => { + const examples = [ + [[], '1'], + [[''], '1'], + [['0'], '1'], + [['1'], '2'], + [['a'], '1'], + [['A'], '1'], + [['9'], '1'], + [['z'], '1'], + [['Z'], '1'], + [['0.'], '1'], + [['9.'], '1'], + [['999'], '1'], + [['1', '2'], '3'], + [['1', '3'], '2'], + [['1z', '1'], '2'], + [['mitte', 'oben', 'unten'], '1'], + [['😋'], '1'], + [['a😋'], '1'], + [['1', '2', '3', '4', '5', '6', '7', '8', '9'], '10'], + [['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], '11'], + ] + + examples.forEach(([input, expected]) => { + it(input.toString(), () => { + expect(calculateNextSlotName(input)).toEqual(expected) + }) + }) +}) + +describe('adjusting the column widths', () => { + // prettier-ignore + const examples = [ + [[], []], + // compacting columns + [[{ name: '1', width: 20 }], [12]], + [[{ name: '1', width: 12 }, { name: '2', width: 3 }], [9, 3]], + [[{ name: '1', width: 3 }, { name: '2', width: 9 }, { name: '3', width: 3 }], [3, 6, 3]], + [[{ name: '1', width: 4 }, { name: '2', width: 8 }, { name: '3', width: 3 }], [4, 5, 3]], + [[{ name: '1', width: 5 }, { name: '2', width: 7 }, { name: '3', width: 3 }], [5, 4, 3]], + [[{ name: '1', width: 6 }, { name: '2', width: 6 }, { name: '3', width: 3 }], [6, 3, 3]], + [[{ name: '1', width: 7 }, { name: '2', width: 5 }, { name: '3', width: 3 }], [6, 3, 3]], + [[{ name: '1', width: 8 }, { name: '2', width: 4 }, { name: '3', width: 3 }], [6, 3, 3]], + [[{ name: '1', width: 9 }, { name: '2', width: 3 }, { name: '3', width: 3 }], [6, 3, 3]], + [[{ name: '1', width: 3 }, { name: '2', width: 3 }, { name: '3', width: 6 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + [[{ name: '1', width: 3 }, { name: '2', width: 4 }, { name: '3', width: 5 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + [[{ name: '1', width: 4 }, { name: '2', width: 3 }, { name: '3', width: 5 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + [[{ name: '1', width: 3 }, { name: '2', width: 5 }, { name: '3', width: 4 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + [[{ name: '1', width: 4 }, { name: '2', width: 4 }, { name: '3', width: 4 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + [[{ name: '1', width: 5 }, { name: '2', width: 3 }, { name: '3', width: 4 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + [[{ name: '1', width: 3 }, { name: '2', width: 6 }, { name: '3', width: 3 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + [[{ name: '1', width: 4 }, { name: '2', width: 5 }, { name: '3', width: 3 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + [[{ name: '1', width: 5 }, { name: '2', width: 4 }, { name: '3', width: 3 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + [[{ name: '1', width: 6 }, { name: '2', width: 3 }, { name: '3', width: 3 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + // expanding columns + [[{ name: '1', width: 10 }], [12]], + [[{ name: '1', width: 1 }, { name: '2', width: 3 }], [3, 9]], + [[{ name: '1', width: 3 }, { name: '2', width: 3 }], [3, 9]], + [[{ name: '1', width: 3 }, { name: '2', width: 3 }, { name: '3', width: 3 }], [3, 3, 6]], + [[{ name: '1', width: 3 }, { name: '2', width: 3 }, { name: '3', width: 2 }, { name: '4', width: 3 }], [3, 3, 3, 3]], + [[{ name: '1', width: 3 }, { name: '2', width: 3 }, { name: '3', width: 3 }, { name: '4', width: 3 }], [3, 3, 3, 3]] + ] + + examples.forEach(([input, expected]) => { + it(input.map((col) => col.width).toString(), () => { + expect(adjustColumnWidths(input).map((col) => col.width)).toEqual(expected) + }) + }) +}) diff --git a/frontend-old/src/components/activity/content/columnLayout/calculateNextSlotName.js b/frontend-old/src/components/activity/content/columnLayout/calculateNextSlotName.js new file mode 100644 index 0000000000..4230abb92c --- /dev/null +++ b/frontend-old/src/components/activity/content/columnLayout/calculateNextSlotName.js @@ -0,0 +1,32 @@ +import cloneDeep from 'lodash-es/cloneDeep' + +export function calculateNextSlotName(slotNames) { + let i = 0 + + while (true) { + if (!slotNames.includes((++i).toString())) return i.toString() + } +} + +export function adjustColumnWidths(columns, minWidth = 3, maxWidth = 12) { + const cols = cloneDeep(columns) + + if (cols.length < 1) return cols + + // Enforce minimum column widths + cols.forEach((col) => { + col.width = Math.max(minWidth, col.width) + }) + + // Make sure the column widths sum up to maxWidth + let excess = cols.reduce((sum, col) => sum + col.width, 0) - maxWidth + let i = cols.length - 1 + while (excess !== 0 && i >= 0) { + const diff = Math.min(Math.max(0, cols[i].width - minWidth), excess) + cols[i].width -= diff + excess -= diff + i-- + } + + return cols +} diff --git a/frontend-old/src/components/activity/content/contentTypeIcons.js b/frontend-old/src/components/activity/content/contentTypeIcons.js new file mode 100644 index 0000000000..c327708e20 --- /dev/null +++ b/frontend-old/src/components/activity/content/contentTypeIcons.js @@ -0,0 +1,18 @@ +/** + * Maps content type to mdi icon + */ +const contentTypeIcons = { + checklist: 'mdi-clipboard-list-outline', + columnLayout: 'mdi-view-column', + laThematicArea: 'mdi-shape', + learningObjectives: 'mdi-school', + learningTopics: 'mdi-school', + material: 'mdi-package-variant', + notes: 'mdi-pen', + responsiveLayout: 'mdi-view-compact', + safetyConsiderations: 'mdi-security', + storyboard: 'mdi-script-text-outline', + storycontext: 'mdi-book-open-variant', +} + +export default contentTypeIcons diff --git a/frontend-old/src/components/activity/content/layout/ContentNodeCard.vue b/frontend-old/src/components/activity/content/layout/ContentNodeCard.vue new file mode 100644 index 0000000000..59839dc558 --- /dev/null +++ b/frontend-old/src/components/activity/content/layout/ContentNodeCard.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/layout/LayoutItem.vue b/frontend-old/src/components/activity/content/layout/LayoutItem.vue new file mode 100644 index 0000000000..b439c67edc --- /dev/null +++ b/frontend-old/src/components/activity/content/layout/LayoutItem.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/layout/LayoutNodeCard.vue b/frontend-old/src/components/activity/content/layout/LayoutNodeCard.vue new file mode 100644 index 0000000000..d6f32a6886 --- /dev/null +++ b/frontend-old/src/components/activity/content/layout/LayoutNodeCard.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/frontend-old/src/components/activity/content/storyboard/StoryboardDialogRemoveSection.vue b/frontend-old/src/components/activity/content/storyboard/StoryboardDialogRemoveSection.vue new file mode 100644 index 0000000000..d3ad0a188b --- /dev/null +++ b/frontend-old/src/components/activity/content/storyboard/StoryboardDialogRemoveSection.vue @@ -0,0 +1,50 @@ + + + diff --git a/frontend-old/src/components/activity/content/storyboard/StoryboardRowDefault.vue b/frontend-old/src/components/activity/content/storyboard/StoryboardRowDefault.vue new file mode 100644 index 0000000000..c8a9546c92 --- /dev/null +++ b/frontend-old/src/components/activity/content/storyboard/StoryboardRowDefault.vue @@ -0,0 +1,105 @@ + + + diff --git a/frontend-old/src/components/activity/content/storyboard/StoryboardRowDense.vue b/frontend-old/src/components/activity/content/storyboard/StoryboardRowDense.vue new file mode 100644 index 0000000000..108706c738 --- /dev/null +++ b/frontend-old/src/components/activity/content/storyboard/StoryboardRowDense.vue @@ -0,0 +1,121 @@ + + + diff --git a/frontend-old/src/components/activity/content/storyboard/StoryboardSortable.vue b/frontend-old/src/components/activity/content/storyboard/StoryboardSortable.vue new file mode 100644 index 0000000000..39008e127c --- /dev/null +++ b/frontend-old/src/components/activity/content/storyboard/StoryboardSortable.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/frontend-old/src/components/activity/dialog/DialogActivityEdit.vue b/frontend-old/src/components/activity/dialog/DialogActivityEdit.vue new file mode 100644 index 0000000000..4d959d5f62 --- /dev/null +++ b/frontend-old/src/components/activity/dialog/DialogActivityEdit.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/frontend-old/src/components/activity/dialog/DialogActivityForm.vue b/frontend-old/src/components/activity/dialog/DialogActivityForm.vue new file mode 100644 index 0000000000..b28db8a9d7 --- /dev/null +++ b/frontend-old/src/components/activity/dialog/DialogActivityForm.vue @@ -0,0 +1,100 @@ + + + diff --git a/frontend-old/src/components/activity/dialog/FormScheduleEntryItem.vue b/frontend-old/src/components/activity/dialog/FormScheduleEntryItem.vue new file mode 100644 index 0000000000..f8530f55b9 --- /dev/null +++ b/frontend-old/src/components/activity/dialog/FormScheduleEntryItem.vue @@ -0,0 +1,348 @@ + + + diff --git a/frontend-old/src/components/activity/dialog/FormScheduleEntryList.vue b/frontend-old/src/components/activity/dialog/FormScheduleEntryList.vue new file mode 100644 index 0000000000..c48bfc466e --- /dev/null +++ b/frontend-old/src/components/activity/dialog/FormScheduleEntryList.vue @@ -0,0 +1,138 @@ + + + diff --git a/frontend-old/src/components/buttons/ButtonAdd.vue b/frontend-old/src/components/buttons/ButtonAdd.vue new file mode 100644 index 0000000000..d62bcf6984 --- /dev/null +++ b/frontend-old/src/components/buttons/ButtonAdd.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/frontend-old/src/components/buttons/ButtonBack.vue b/frontend-old/src/components/buttons/ButtonBack.vue new file mode 100644 index 0000000000..dc7b525b27 --- /dev/null +++ b/frontend-old/src/components/buttons/ButtonBack.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/frontend-old/src/components/buttons/ButtonCancel.vue b/frontend-old/src/components/buttons/ButtonCancel.vue new file mode 100644 index 0000000000..fccb02c8f6 --- /dev/null +++ b/frontend-old/src/components/buttons/ButtonCancel.vue @@ -0,0 +1,11 @@ + + + diff --git a/frontend-old/src/components/buttons/ButtonContinue.vue b/frontend-old/src/components/buttons/ButtonContinue.vue new file mode 100644 index 0000000000..ad86e730bd --- /dev/null +++ b/frontend-old/src/components/buttons/ButtonContinue.vue @@ -0,0 +1,11 @@ + + + diff --git a/frontend-old/src/components/buttons/ButtonDelete.vue b/frontend-old/src/components/buttons/ButtonDelete.vue new file mode 100644 index 0000000000..5b8ea48391 --- /dev/null +++ b/frontend-old/src/components/buttons/ButtonDelete.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/frontend-old/src/components/buttons/ButtonEdit.vue b/frontend-old/src/components/buttons/ButtonEdit.vue new file mode 100644 index 0000000000..fb45409904 --- /dev/null +++ b/frontend-old/src/components/buttons/ButtonEdit.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/frontend-old/src/components/buttons/ButtonRetry.vue b/frontend-old/src/components/buttons/ButtonRetry.vue new file mode 100644 index 0000000000..6a6a44795b --- /dev/null +++ b/frontend-old/src/components/buttons/ButtonRetry.vue @@ -0,0 +1,12 @@ + + + diff --git a/frontend-old/src/components/buttons/IconButton.vue b/frontend-old/src/components/buttons/IconButton.vue new file mode 100644 index 0000000000..12a73b5d38 --- /dev/null +++ b/frontend-old/src/components/buttons/IconButton.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/frontend-old/src/components/camp/CampListItem.vue b/frontend-old/src/components/camp/CampListItem.vue new file mode 100644 index 0000000000..7c0d2693cb --- /dev/null +++ b/frontend-old/src/components/camp/CampListItem.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/frontend-old/src/components/camp/FooterSharedCamp.vue b/frontend-old/src/components/camp/FooterSharedCamp.vue new file mode 100644 index 0000000000..c52cac7b69 --- /dev/null +++ b/frontend-old/src/components/camp/FooterSharedCamp.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/CampActivityProgressLabels.vue b/frontend-old/src/components/campAdmin/CampActivityProgressLabels.vue new file mode 100644 index 0000000000..811b45f9a9 --- /dev/null +++ b/frontend-old/src/components/campAdmin/CampActivityProgressLabels.vue @@ -0,0 +1,135 @@ + + + diff --git a/frontend-old/src/components/campAdmin/CampAddress.vue b/frontend-old/src/components/campAdmin/CampAddress.vue new file mode 100644 index 0000000000..dc43b1d6ef --- /dev/null +++ b/frontend-old/src/components/campAdmin/CampAddress.vue @@ -0,0 +1,51 @@ + + + + + + + diff --git a/frontend-old/src/components/campAdmin/CampCategories.vue b/frontend-old/src/components/campAdmin/CampCategories.vue new file mode 100644 index 0000000000..7b181d64a2 --- /dev/null +++ b/frontend-old/src/components/campAdmin/CampCategories.vue @@ -0,0 +1,86 @@ + + + diff --git a/frontend-old/src/components/campAdmin/CampConditionalFields.vue b/frontend-old/src/components/campAdmin/CampConditionalFields.vue new file mode 100644 index 0000000000..9837171c60 --- /dev/null +++ b/frontend-old/src/components/campAdmin/CampConditionalFields.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/CampDangerZone.vue b/frontend-old/src/components/campAdmin/CampDangerZone.vue new file mode 100644 index 0000000000..232759aa37 --- /dev/null +++ b/frontend-old/src/components/campAdmin/CampDangerZone.vue @@ -0,0 +1,94 @@ + + + + + + + diff --git a/frontend-old/src/components/campAdmin/CampPeriods.vue b/frontend-old/src/components/campAdmin/CampPeriods.vue new file mode 100644 index 0000000000..0fe563e7fb --- /dev/null +++ b/frontend-old/src/components/campAdmin/CampPeriods.vue @@ -0,0 +1,63 @@ + + + + + + + diff --git a/frontend-old/src/components/campAdmin/CampPeriodsListItem.vue b/frontend-old/src/components/campAdmin/CampPeriodsListItem.vue new file mode 100644 index 0000000000..0415df6ec9 --- /dev/null +++ b/frontend-old/src/components/campAdmin/CampPeriodsListItem.vue @@ -0,0 +1,150 @@ + + + + + + + diff --git a/frontend-old/src/components/campAdmin/CampSettings.vue b/frontend-old/src/components/campAdmin/CampSettings.vue new file mode 100644 index 0000000000..f77948dadf --- /dev/null +++ b/frontend-old/src/components/campAdmin/CampSettings.vue @@ -0,0 +1,62 @@ + + + + + + + diff --git a/frontend-old/src/components/campAdmin/CampSharingSettings.vue b/frontend-old/src/components/campAdmin/CampSharingSettings.vue new file mode 100644 index 0000000000..eabe25f9d3 --- /dev/null +++ b/frontend-old/src/components/campAdmin/CampSharingSettings.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/CreateCampPeriods.vue b/frontend-old/src/components/campAdmin/CreateCampPeriods.vue new file mode 100644 index 0000000000..7950cbeed0 --- /dev/null +++ b/frontend-old/src/components/campAdmin/CreateCampPeriods.vue @@ -0,0 +1,115 @@ + + + diff --git a/frontend-old/src/components/campAdmin/DialogActivityProgressLabelCreate.vue b/frontend-old/src/components/campAdmin/DialogActivityProgressLabelCreate.vue new file mode 100644 index 0000000000..86cbb2dba9 --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogActivityProgressLabelCreate.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/DialogActivityProgressLabelEdit.vue b/frontend-old/src/components/campAdmin/DialogActivityProgressLabelEdit.vue new file mode 100644 index 0000000000..a70b4afb57 --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogActivityProgressLabelEdit.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/DialogActivityProgressLabelForm.vue b/frontend-old/src/components/campAdmin/DialogActivityProgressLabelForm.vue new file mode 100644 index 0000000000..10b234db90 --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogActivityProgressLabelForm.vue @@ -0,0 +1,24 @@ + + + diff --git a/frontend-old/src/components/campAdmin/DialogCategoryCreate.vue b/frontend-old/src/components/campAdmin/DialogCategoryCreate.vue new file mode 100644 index 0000000000..380d3ec42c --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogCategoryCreate.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/DialogCategoryForm.vue b/frontend-old/src/components/campAdmin/DialogCategoryForm.vue new file mode 100644 index 0000000000..6153f1a07e --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogCategoryForm.vue @@ -0,0 +1,52 @@ + + + diff --git a/frontend-old/src/components/campAdmin/DialogMaterialListCreate.vue b/frontend-old/src/components/campAdmin/DialogMaterialListCreate.vue new file mode 100644 index 0000000000..3d07a8fd8f --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogMaterialListCreate.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/DialogMaterialListEdit.vue b/frontend-old/src/components/campAdmin/DialogMaterialListEdit.vue new file mode 100644 index 0000000000..44931e2833 --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogMaterialListEdit.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/DialogMaterialListForm.vue b/frontend-old/src/components/campAdmin/DialogMaterialListForm.vue new file mode 100644 index 0000000000..c5338d8623 --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogMaterialListForm.vue @@ -0,0 +1,24 @@ + + + diff --git a/frontend-old/src/components/campAdmin/DialogPeriodCreate.vue b/frontend-old/src/components/campAdmin/DialogPeriodCreate.vue new file mode 100644 index 0000000000..a82940ca20 --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogPeriodCreate.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/DialogPeriodDateEdit.vue b/frontend-old/src/components/campAdmin/DialogPeriodDateEdit.vue new file mode 100644 index 0000000000..a29caab9f8 --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogPeriodDateEdit.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/DialogPeriodDescriptionEdit.vue b/frontend-old/src/components/campAdmin/DialogPeriodDescriptionEdit.vue new file mode 100644 index 0000000000..80fbab432d --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogPeriodDescriptionEdit.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/DialogPeriodForm.vue b/frontend-old/src/components/campAdmin/DialogPeriodForm.vue new file mode 100644 index 0000000000..05f42cf3b1 --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogPeriodForm.vue @@ -0,0 +1,37 @@ + + + diff --git a/frontend-old/src/components/campAdmin/DialogShare.vue b/frontend-old/src/components/campAdmin/DialogShare.vue new file mode 100644 index 0000000000..bb821bae4a --- /dev/null +++ b/frontend-old/src/components/campAdmin/DialogShare.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/frontend-old/src/components/campAdmin/ErrorExistingActivitiesList.vue b/frontend-old/src/components/campAdmin/ErrorExistingActivitiesList.vue new file mode 100644 index 0000000000..6a75a13db1 --- /dev/null +++ b/frontend-old/src/components/campAdmin/ErrorExistingActivitiesList.vue @@ -0,0 +1,56 @@ + + + + diff --git a/frontend-old/src/components/campCreate/CampCreate.vue b/frontend-old/src/components/campCreate/CampCreate.vue new file mode 100644 index 0000000000..1d0ca93ae4 --- /dev/null +++ b/frontend-old/src/components/campCreate/CampCreate.vue @@ -0,0 +1,95 @@ + + diff --git a/frontend-old/src/components/campCreate/CampCreateStep1.vue b/frontend-old/src/components/campCreate/CampCreateStep1.vue new file mode 100644 index 0000000000..9b42ce794b --- /dev/null +++ b/frontend-old/src/components/campCreate/CampCreateStep1.vue @@ -0,0 +1,102 @@ + + diff --git a/frontend-old/src/components/campCreate/CampCreateStep2.vue b/frontend-old/src/components/campCreate/CampCreateStep2.vue new file mode 100644 index 0000000000..5250c1611c --- /dev/null +++ b/frontend-old/src/components/campCreate/CampCreateStep2.vue @@ -0,0 +1,378 @@ + + + + diff --git a/frontend-old/src/components/category/CategoryProperties.vue b/frontend-old/src/components/category/CategoryProperties.vue new file mode 100644 index 0000000000..c8bd3b36ff --- /dev/null +++ b/frontend-old/src/components/category/CategoryProperties.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/frontend-old/src/components/category/CategoryTemplate.vue b/frontend-old/src/components/category/CategoryTemplate.vue new file mode 100644 index 0000000000..f453a21c59 --- /dev/null +++ b/frontend-old/src/components/category/CategoryTemplate.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/frontend-old/src/components/checklist/ChecklistCreate.vue b/frontend-old/src/components/checklist/ChecklistCreate.vue new file mode 100644 index 0000000000..3bea8be862 --- /dev/null +++ b/frontend-old/src/components/checklist/ChecklistCreate.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/frontend-old/src/components/checklist/ChecklistDetail.vue b/frontend-old/src/components/checklist/ChecklistDetail.vue new file mode 100644 index 0000000000..c4facd7cfc --- /dev/null +++ b/frontend-old/src/components/checklist/ChecklistDetail.vue @@ -0,0 +1,140 @@ + + + diff --git a/frontend-old/src/components/checklist/ChecklistItemCreate.vue b/frontend-old/src/components/checklist/ChecklistItemCreate.vue new file mode 100644 index 0000000000..d8cf07b42e --- /dev/null +++ b/frontend-old/src/components/checklist/ChecklistItemCreate.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/frontend-old/src/components/checklist/ChecklistItemEdit.vue b/frontend-old/src/components/checklist/ChecklistItemEdit.vue new file mode 100644 index 0000000000..7767af91ab --- /dev/null +++ b/frontend-old/src/components/checklist/ChecklistItemEdit.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/frontend-old/src/components/checklist/ChecklistItemParent.vue b/frontend-old/src/components/checklist/ChecklistItemParent.vue new file mode 100644 index 0000000000..7bc1926990 --- /dev/null +++ b/frontend-old/src/components/checklist/ChecklistItemParent.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/frontend-old/src/components/checklist/ChecklistOverview.vue b/frontend-old/src/components/checklist/ChecklistOverview.vue new file mode 100644 index 0000000000..68389e6df7 --- /dev/null +++ b/frontend-old/src/components/checklist/ChecklistOverview.vue @@ -0,0 +1,61 @@ + + + diff --git a/frontend-old/src/components/checklist/SortableChecklist.vue b/frontend-old/src/components/checklist/SortableChecklist.vue new file mode 100644 index 0000000000..81d5555c3d --- /dev/null +++ b/frontend-old/src/components/checklist/SortableChecklist.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/frontend-old/src/components/checklist/SortableChecklistItem.vue b/frontend-old/src/components/checklist/SortableChecklistItem.vue new file mode 100644 index 0000000000..d2f3b238c6 --- /dev/null +++ b/frontend-old/src/components/checklist/SortableChecklistItem.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/frontend-old/src/components/collaborator/CollaboratorCreate.vue b/frontend-old/src/components/collaborator/CollaboratorCreate.vue new file mode 100644 index 0000000000..ba303341be --- /dev/null +++ b/frontend-old/src/components/collaborator/CollaboratorCreate.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/frontend-old/src/components/collaborator/CollaboratorEdit.vue b/frontend-old/src/components/collaborator/CollaboratorEdit.vue new file mode 100644 index 0000000000..703bf0ed1b --- /dev/null +++ b/frontend-old/src/components/collaborator/CollaboratorEdit.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/frontend-old/src/components/collaborator/CollaboratorForm.vue b/frontend-old/src/components/collaborator/CollaboratorForm.vue new file mode 100644 index 0000000000..e932908c3c --- /dev/null +++ b/frontend-old/src/components/collaborator/CollaboratorForm.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/frontend-old/src/components/collaborator/CollaboratorList.vue b/frontend-old/src/components/collaborator/CollaboratorList.vue new file mode 100644 index 0000000000..bc24af469c --- /dev/null +++ b/frontend-old/src/components/collaborator/CollaboratorList.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/frontend-old/src/components/collaborator/CollaboratorListItem.vue b/frontend-old/src/components/collaborator/CollaboratorListItem.vue new file mode 100644 index 0000000000..cb0b3877e3 --- /dev/null +++ b/frontend-old/src/components/collaborator/CollaboratorListItem.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/frontend-old/src/components/collaborator/PromptCollaboratorDeactivate.vue b/frontend-old/src/components/collaborator/PromptCollaboratorDeactivate.vue new file mode 100644 index 0000000000..cdaa11efcb --- /dev/null +++ b/frontend-old/src/components/collaborator/PromptCollaboratorDeactivate.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/frontend-old/src/components/collaborator/isOwnCampCollaboration.js b/frontend-old/src/components/collaborator/isOwnCampCollaboration.js new file mode 100644 index 0000000000..1d6ef659cc --- /dev/null +++ b/frontend-old/src/components/collaborator/isOwnCampCollaboration.js @@ -0,0 +1,19 @@ +/** + * @typedef Collaborator { + * user: () => { id: string }, + * } + * + * @typedef Auth { + * user: { id: string }, + * } + * + * @param {Collaborator} collaborator + * @param {Auth} auth + * @returns {boolean} + */ +export default function isOwnCampCollaboration(collaborator, auth) { + if (!(typeof collaborator.user === 'function')) { + return false + } + return auth.user?.id === collaborator.user().id +} diff --git a/frontend-old/src/components/comments/Comment.vue b/frontend-old/src/components/comments/Comment.vue new file mode 100644 index 0000000000..778ea15ad9 --- /dev/null +++ b/frontend-old/src/components/comments/Comment.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/frontend-old/src/components/comments/CommentWrapper.vue b/frontend-old/src/components/comments/CommentWrapper.vue new file mode 100644 index 0000000000..239417a6ac --- /dev/null +++ b/frontend-old/src/components/comments/CommentWrapper.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/frontend-old/src/components/comments/Comments.vue b/frontend-old/src/components/comments/Comments.vue new file mode 100644 index 0000000000..6658ff4772 --- /dev/null +++ b/frontend-old/src/components/comments/Comments.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/frontend-old/src/components/dashboard/ActivityRow.vue b/frontend-old/src/components/dashboard/ActivityRow.vue new file mode 100644 index 0000000000..a91cd55078 --- /dev/null +++ b/frontend-old/src/components/dashboard/ActivityRow.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/frontend-old/src/components/dashboard/BooleanFilter.vue b/frontend-old/src/components/dashboard/BooleanFilter.vue new file mode 100644 index 0000000000..ced32fb1b4 --- /dev/null +++ b/frontend-old/src/components/dashboard/BooleanFilter.vue @@ -0,0 +1,19 @@ + + + diff --git a/frontend-old/src/components/dashboard/CountBadge.vue b/frontend-old/src/components/dashboard/CountBadge.vue new file mode 100644 index 0000000000..b565599a2a --- /dev/null +++ b/frontend-old/src/components/dashboard/CountBadge.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/frontend-old/src/components/dashboard/FilterDivider.vue b/frontend-old/src/components/dashboard/FilterDivider.vue new file mode 100644 index 0000000000..ff1d156e3a --- /dev/null +++ b/frontend-old/src/components/dashboard/FilterDivider.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/frontend-old/src/components/dashboard/SelectFilter.vue b/frontend-old/src/components/dashboard/SelectFilter.vue new file mode 100644 index 0000000000..d2fcf071fc --- /dev/null +++ b/frontend-old/src/components/dashboard/SelectFilter.vue @@ -0,0 +1,130 @@ + + + diff --git a/frontend-old/src/components/dialog/DialogBase.vue b/frontend-old/src/components/dialog/DialogBase.vue new file mode 100644 index 0000000000..0d1648fa47 --- /dev/null +++ b/frontend-old/src/components/dialog/DialogBase.vue @@ -0,0 +1,167 @@ + diff --git a/frontend-old/src/components/dialog/DialogBottomSheet.vue b/frontend-old/src/components/dialog/DialogBottomSheet.vue new file mode 100644 index 0000000000..b4c35eba40 --- /dev/null +++ b/frontend-old/src/components/dialog/DialogBottomSheet.vue @@ -0,0 +1,149 @@ + + + diff --git a/frontend-old/src/components/dialog/DialogEntityDelete.vue b/frontend-old/src/components/dialog/DialogEntityDelete.vue new file mode 100644 index 0000000000..2b2910c9e3 --- /dev/null +++ b/frontend-old/src/components/dialog/DialogEntityDelete.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/frontend-old/src/components/dialog/DialogForm.vue b/frontend-old/src/components/dialog/DialogForm.vue new file mode 100644 index 0000000000..84b3ad1dff --- /dev/null +++ b/frontend-old/src/components/dialog/DialogForm.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/frontend-old/src/components/dialog/DialogUiBase.vue b/frontend-old/src/components/dialog/DialogUiBase.vue new file mode 100644 index 0000000000..4b36ac5376 --- /dev/null +++ b/frontend-old/src/components/dialog/DialogUiBase.vue @@ -0,0 +1,44 @@ + diff --git a/frontend-old/src/components/form/ServerError.vue b/frontend-old/src/components/form/ServerError.vue new file mode 100644 index 0000000000..d827c0ab63 --- /dev/null +++ b/frontend-old/src/components/form/ServerError.vue @@ -0,0 +1,22 @@ + + + diff --git a/frontend-old/src/components/form/ServerErrorContent.vue b/frontend-old/src/components/form/ServerErrorContent.vue new file mode 100644 index 0000000000..c78629d4dd --- /dev/null +++ b/frontend-old/src/components/form/ServerErrorContent.vue @@ -0,0 +1,29 @@ + + + diff --git a/frontend-old/src/components/form/api/ApiCheckbox.vue b/frontend-old/src/components/form/api/ApiCheckbox.vue new file mode 100644 index 0000000000..c4add43c94 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiCheckbox.vue @@ -0,0 +1,45 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiColorField.vue b/frontend-old/src/components/form/api/ApiColorField.vue new file mode 100644 index 0000000000..99adae9d08 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiColorField.vue @@ -0,0 +1,44 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiColorPicker.vue b/frontend-old/src/components/form/api/ApiColorPicker.vue new file mode 100644 index 0000000000..ab4187fa8d --- /dev/null +++ b/frontend-old/src/components/form/api/ApiColorPicker.vue @@ -0,0 +1,41 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiDatePicker.vue b/frontend-old/src/components/form/api/ApiDatePicker.vue new file mode 100644 index 0000000000..5fbce2f547 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiDatePicker.vue @@ -0,0 +1,41 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiForm.vue b/frontend-old/src/components/form/api/ApiForm.vue new file mode 100644 index 0000000000..e2ff169690 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiForm.vue @@ -0,0 +1,21 @@ + + + diff --git a/frontend-old/src/components/form/api/ApiNumberField.vue b/frontend-old/src/components/form/api/ApiNumberField.vue new file mode 100644 index 0000000000..2ce6affc41 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiNumberField.vue @@ -0,0 +1,55 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiRichtext.vue b/frontend-old/src/components/form/api/ApiRichtext.vue new file mode 100644 index 0000000000..559af1fef3 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiRichtext.vue @@ -0,0 +1,39 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiSelect.vue b/frontend-old/src/components/form/api/ApiSelect.vue new file mode 100644 index 0000000000..ef45c04df2 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiSelect.vue @@ -0,0 +1,66 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiSortable.vue b/frontend-old/src/components/form/api/ApiSortable.vue new file mode 100644 index 0000000000..80fe07c586 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiSortable.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/frontend-old/src/components/form/api/ApiSwitch.vue b/frontend-old/src/components/form/api/ApiSwitch.vue new file mode 100644 index 0000000000..47ab4059b3 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiSwitch.vue @@ -0,0 +1,45 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiTextField.vue b/frontend-old/src/components/form/api/ApiTextField.vue new file mode 100644 index 0000000000..a216138b09 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiTextField.vue @@ -0,0 +1,55 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiTextarea.vue b/frontend-old/src/components/form/api/ApiTextarea.vue new file mode 100644 index 0000000000..52d8ca64db --- /dev/null +++ b/frontend-old/src/components/form/api/ApiTextarea.vue @@ -0,0 +1,44 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiTimePicker.vue b/frontend-old/src/components/form/api/ApiTimePicker.vue new file mode 100644 index 0000000000..c25716bb51 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiTimePicker.vue @@ -0,0 +1,41 @@ + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiWrapper.vue b/frontend-old/src/components/form/api/ApiWrapper.vue new file mode 100644 index 0000000000..6bc0aafaa1 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiWrapper.vue @@ -0,0 +1,299 @@ + + + + + + + + + + + diff --git a/frontend-old/src/components/form/api/ApiWrapperAppend.vue b/frontend-old/src/components/form/api/ApiWrapperAppend.vue new file mode 100644 index 0000000000..17ee97cc07 --- /dev/null +++ b/frontend-old/src/components/form/api/ApiWrapperAppend.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/frontend-old/src/components/form/api/IconSuccess.vue b/frontend-old/src/components/form/api/IconSuccess.vue new file mode 100644 index 0000000000..0f8080fff9 --- /dev/null +++ b/frontend-old/src/components/form/api/IconSuccess.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/frontend-old/src/components/form/api/__tests__/ApiCheckbox.spec.js b/frontend-old/src/components/form/api/__tests__/ApiCheckbox.spec.js new file mode 100644 index 0000000000..0cfa44a3e7 --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiCheckbox.spec.js @@ -0,0 +1,98 @@ +import { describe, beforeEach, afterEach, vi, test, expect } from 'vitest' +import ApiCheckbox from '../ApiCheckbox.vue' +import ApiWrapper from '@/components/form/api/ApiWrapper.vue' +import Vue from 'vue' +import Vuetify from 'vuetify' +import flushPromises from 'flush-promises' +import formBaseComponents from '@/plugins/formBaseComponents' +import merge from 'lodash-es/merge' +import { ApiMock } from '@/components/form/api/__tests__/ApiMock' +import { i18n } from '@/plugins' +import { mount as mountComponent } from '@vue/test-utils' +import { waitForDebounce } from '@/test/util' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An ApiCheckbox', () => { + let vuetify + let wrapper + let apiMock + + const path = 'test-field/123' + + beforeEach(() => { + vuetify = new Vuetify() + apiMock = ApiMock.create() + }) + + afterEach(() => { + vi.restoreAllMocks() + wrapper.destroy() + }) + + const mount = (options) => { + const app = Vue.component('App', { + components: { ApiCheckbox }, + props: { + path: { type: String, default: path }, + }, + template: ` +
+ +
+ `, + }) + apiMock.get().thenReturn(ApiMock.success(true).forPath(path)) + const defaultOptions = { + mocks: { + $tc: () => {}, + api: apiMock.getMocks(), + }, + } + return mountComponent(app, { + vuetify, + i18n, + attachTo: document.body, + ...merge(defaultOptions, options), + }) + } + + test('triggers api.patch and status update if input changes', async () => { + apiMock.patch().thenReturn(ApiMock.success(false)) + wrapper = mount() + + await flushPromises() + + const input = wrapper.find('input') + await input.trigger('click') + await input.trigger('submit') + + await waitForDebounce() + await flushPromises() + + expect(apiMock.getMocks().patch).toBeCalledTimes(1) + expect(wrapper.findComponent(ApiWrapper).vm.localValue).toBe(false) + }) + + test('updates state if value in store is refreshed and has new value', async () => { + wrapper = mount() + apiMock.get().thenReturn(ApiMock.success(false).forPath(path)) + + wrapper.findComponent(ApiWrapper).vm.reload() + + await waitForDebounce() + await flushPromises() + + expect(wrapper.findComponent(ApiWrapper).vm.localValue).toBe(false) + expect( + wrapper.find('input[type=checkbox]').element.getAttribute('aria-checked') + ).toBe('false') + }) +}) diff --git a/frontend-old/src/components/form/api/__tests__/ApiColorField.spec.js b/frontend-old/src/components/form/api/__tests__/ApiColorField.spec.js new file mode 100644 index 0000000000..134e705bac --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiColorField.spec.js @@ -0,0 +1,93 @@ +import { describe, beforeEach, afterEach, vi, test, expect } from 'vitest' +import ApiColorField from '../ApiColorField.vue' +import { fireEvent, screen, waitFor } from '@testing-library/vue' +import { render } from '@/test/renderWithVuetify.js' +import user from '@testing-library/user-event' +import { ApiMock } from '@/components/form/api/__tests__/ApiMock' +import { extend } from 'vee-validate' +import { regex } from 'vee-validate/dist/rules' +import { ColorSpace, sRGB } from 'colorjs.io/fn' + +extend('regex', regex) + +ColorSpace.register(sRGB) +describe('An ApiColorField', () => { + let apiMock + + const FIELD_PATH = 'test-field/123' + const FIELD_LABEL = 'Test field' + const COLOR_1 = '#FF0000' + const COLOR_2 = '#FAFFAF' + + beforeEach(() => { + apiMock = ApiMock.create() + }) + + afterEach(() => { + vi.restoreAllMocks() + }) + + test('triggers api.patch and status update if input changes', async () => { + // given + apiMock.get().thenReturn(ApiMock.success(COLOR_1).forPath(FIELD_PATH)) + apiMock.patch().thenReturn(ApiMock.success(COLOR_2)) + render(ApiColorField, { + props: { + autoSave: false, + path: FIELD_PATH, + uri: 'test-field/123', + label: FIELD_LABEL, + required: true, + }, + mocks: { + api: apiMock.getMocks(), + }, + }) + + // when + const inputField = await screen.findByLabelText(FIELD_LABEL) + inputField.value = COLOR_2 + await fireEvent.input(inputField) + // click the button to open the picker + // click the save button + await waitFor(async () => { + await user.click(screen.getByLabelText('Speichern')) + }) + + // then + await waitFor(async () => { + const inputField = await screen.findByLabelText(FIELD_LABEL) + expect(inputField.value).toBe(COLOR_2) + expect(apiMock.getMocks().patch).toBeCalledTimes(1) + }) + }) + + test('updates state if value in store is refreshed and has new value', async () => { + // given + apiMock.get().thenReturn(ApiMock.networkError().forPath(FIELD_PATH)) + render(ApiColorField, { + props: { + autoSave: false, + path: FIELD_PATH, + uri: 'test-field/123', + label: FIELD_LABEL, + required: true, + }, + mocks: { + api: apiMock.getMocks(), + }, + }) + await screen.findByText('A network error occurred.') + expect((await screen.findByLabelText(FIELD_LABEL)).value).not.toBe(COLOR_1) + const retryButton = await screen.findByText('Erneut versuchen') + apiMock.get().thenReturn(ApiMock.success(COLOR_1).forPath(FIELD_PATH)) + + // when + await user.click(retryButton) + + // then + await waitFor(async () => { + expect((await screen.findByLabelText(FIELD_LABEL)).value).toBe(COLOR_1) + }) + }) +}) diff --git a/frontend-old/src/components/form/api/__tests__/ApiColorPicker.spec.js b/frontend-old/src/components/form/api/__tests__/ApiColorPicker.spec.js new file mode 100644 index 0000000000..c8e67f30a6 --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiColorPicker.spec.js @@ -0,0 +1,95 @@ +import { describe, beforeEach, afterEach, vi, test, expect } from 'vitest' +import ApiColorPicker from '../ApiColorPicker.vue' +import { screen, waitFor } from '@testing-library/vue' +import { render } from '@/test/renderWithVuetify.js' +import user from '@testing-library/user-event' +import { ApiMock } from '@/components/form/api/__tests__/ApiMock' +import { extend } from 'vee-validate' +import { regex } from 'vee-validate/dist/rules' +import { ColorSpace, sRGB } from 'colorjs.io/fn' + +extend('regex', regex) + +ColorSpace.register(sRGB) +describe('An ApiColorPicker', () => { + let apiMock + + const FIELD_PATH = 'test-field/123' + const FIELD_LABEL = 'Test field' + const COLOR_1 = '#FF0000' + const COLOR_2 = '#FAFFAF' + const PICKER_BUTTON_LABEL_TEXT = 'Dialog öffnen, um eine Farbe für Test field zu wählen' + + beforeEach(() => { + apiMock = ApiMock.create() + }) + + afterEach(() => { + vi.restoreAllMocks() + }) + + test('triggers api.patch and status update if input changes', async () => { + // given + apiMock.get().thenReturn(ApiMock.success(COLOR_1).forPath(FIELD_PATH)) + apiMock.patch().thenReturn(ApiMock.success(COLOR_2)) + const { container } = render(ApiColorPicker, { + props: { + autoSave: false, + path: FIELD_PATH, + uri: 'test-field/123', + label: FIELD_LABEL, + required: true, + }, + mocks: { + api: apiMock.getMocks(), + }, + }) + + // when + // click the button to open the picker + await user.click(screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT)) + // click inside the color picker canvas to select a different color + const canvas = container.querySelector('canvas') + await user.click(canvas, { clientX: 10, clientY: 10 }) + // click the save button + await waitFor(async () => { + await user.click(screen.getByLabelText('Speichern')) + }) + + // then + await waitFor(async () => { + const inputField = await screen.findByLabelText(FIELD_LABEL) + expect(inputField.value).toBe(COLOR_2) + expect(apiMock.getMocks().patch).toBeCalledTimes(1) + }) + }) + + test('updates state if value in store is refreshed and has new value', async () => { + // given + apiMock.get().thenReturn(ApiMock.networkError().forPath(FIELD_PATH)) + render(ApiColorPicker, { + props: { + autoSave: false, + path: FIELD_PATH, + uri: 'test-field/123', + label: FIELD_LABEL, + required: true, + }, + mocks: { + api: apiMock.getMocks(), + }, + }) + await screen.findByText('A network error occurred.') + expect((await screen.findByLabelText(FIELD_LABEL)).value).not.toBe(COLOR_1) + const retryButton = await screen.findByText('Erneut versuchen') + apiMock.get().thenReturn(ApiMock.success(COLOR_1).forPath(FIELD_PATH)) + + // when + await user.click(retryButton) + + // then + await waitFor(async () => { + expect((await screen.findByLabelText(FIELD_LABEL)).value).toBe(COLOR_1) + }) + }) +}) diff --git a/frontend-old/src/components/form/api/__tests__/ApiDatePicker.spec.js b/frontend-old/src/components/form/api/__tests__/ApiDatePicker.spec.js new file mode 100644 index 0000000000..c1a7afbaf5 --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiDatePicker.spec.js @@ -0,0 +1,87 @@ +import { describe, beforeEach, afterEach, vi, test, expect, it } from 'vitest' +import ApiDatePicker from '../ApiDatePicker.vue' +import { screen, waitFor } from '@testing-library/vue' +import { render, setTestLocale } from '@/test/renderWithVuetify.js' +import user from '@testing-library/user-event' +import { ApiMock } from '@/components/form/api/__tests__/ApiMock' + +describe('An ApiDatePicker', () => { + let apiMock + + const FIELD_PATH = 'test-field/123' + const FIELD_LABEL = 'Test field' + const DATE_1 = '2020-03-01' + const DATE_2 = '2020-03-19' + const PICKER_BUTTON_LABEL_TEXT = 'Dialog öffnen, um ein Datum für Test field zu wählen' + + beforeEach(() => { + setTestLocale('de') + apiMock = ApiMock.create() + }) + + afterEach(() => { + vi.restoreAllMocks() + }) + + it('triggers api.patch and status update if input changes', async () => { + // given + apiMock.get().thenReturn(ApiMock.success(DATE_1).forPath(FIELD_PATH)) + apiMock.patch().thenReturn(ApiMock.success(DATE_2)) + render(ApiDatePicker, { + props: { + autoSave: false, + path: FIELD_PATH, + uri: 'test-field/123', + label: FIELD_LABEL, + required: true, + }, + mocks: { + api: apiMock.getMocks(), + }, + }) + + // when + // click the button to open the picker + await user.click(screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT)) + // click the 19th day of the month + await user.click(screen.getByText('19')) + // click the save button + await user.click(screen.getByLabelText('Speichern')) + + // then + await waitFor(async () => { + const inputField = await screen.findByLabelText(FIELD_LABEL) + expect(inputField.value).toBe('19.03.2020') + expect(apiMock.getMocks().patch).toBeCalledTimes(1) + }) + }) + + test('updates state if value in store is refreshed and has new value', async () => { + // given + apiMock.get().thenReturn(ApiMock.networkError().forPath(FIELD_PATH)) + render(ApiDatePicker, { + props: { + autoSave: false, + path: FIELD_PATH, + uri: 'test-field/123', + label: FIELD_LABEL, + required: true, + }, + mocks: { + api: apiMock.getMocks(), + }, + }) + await screen.findByText('A network error occurred.') + expect((await screen.findByLabelText(FIELD_LABEL)).value).not.toBe('01.03.2020') + const retryButton = await screen.findByText('Erneut versuchen') + apiMock.get().thenReturn(ApiMock.success(DATE_1).forPath(FIELD_PATH)) + + // when + await user.click(retryButton) + + // then + await waitFor(async () => { + expect((await screen.findByLabelText(FIELD_LABEL)).value).toBe('01.03.2020') + }) + }) +}) diff --git a/frontend-old/src/components/form/api/__tests__/ApiMock.js b/frontend-old/src/components/form/api/__tests__/ApiMock.js new file mode 100644 index 0000000000..96eb8438aa --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiMock.js @@ -0,0 +1,125 @@ +import { vi } from 'vitest' + +function mockPromiseResolving(value) { + return new Promise((resolve) => { + const timer = setTimeout(() => { + clearTimeout(timer) + resolve(value) + }, 100) + }) +} + +class MockStubbing { + constructor(path, value) { + this._path = path + this._value = value + } + + forPath(path) { + this._path = path + return this + } + + get path() { + return this._path + } + + get value() { + return this._value + } +} + +class NetworkErrorMockStubbing extends MockStubbing { + constructor() { + super() + } +} + +class ApiMockState { + constructor() { + this._get = vi.fn() + this._patch = vi.fn() + } + + getMocks() { + return { + get: this._get, + patch: this._patch, + } + } + + get() { + const apiMock = this + return { + thenReturn(mockStubbing) { + if (!(mockStubbing instanceof MockStubbing)) { + throw new Error('apiMock must be instance of MockStubbing') + } + if (mockStubbing instanceof NetworkErrorMockStubbing) { + if (mockStubbing.path === undefined || mockStubbing.value !== undefined) { + throw new Error('path must be defined and value must be undefined') + } + const result = { + _meta: { + load: Promise.reject({ + name: 'Network error', + message: 'A network error occurred.', + }), + }, + } + result[mockStubbing.path] = () => result + apiMock._get.mockReturnValue(result) + return this + } + if (mockStubbing.path === undefined || mockStubbing.value === undefined) { + throw new Error('path and value must be defined') + } + apiMock._get.mockReturnValue({ + [mockStubbing.path]: mockStubbing.value, + _meta: { + load: Promise.resolve(mockStubbing.value), + }, + }) + return this + }, + } + } + + patch() { + const apiMock = this + return { + thenReturn(mockStubbing) { + if (!(mockStubbing instanceof MockStubbing)) { + throw new Error('apiMock must be instance of MockStubbing') + } + if (mockStubbing instanceof NetworkErrorMockStubbing) { + apiMock._patch.mockImplementation(() => { + throw { + name: 'NetworkError', + message: 'A network error occurred.', + } + }) + return this + } + if (mockStubbing.path !== undefined || mockStubbing.value === undefined) { + throw new Error('path must be undefined and value must be defined') + } + apiMock._patch.mockReturnValue(mockPromiseResolving(mockStubbing.value)) + return this + }, + } + } +} + +export class ApiMock { + static create() { + return new ApiMockState() + } + + static success(value) { + return new MockStubbing(undefined, value) + } + static networkError() { + return new NetworkErrorMockStubbing() + } +} diff --git a/frontend-old/src/components/form/api/__tests__/ApiNumberField.spec.js b/frontend-old/src/components/form/api/__tests__/ApiNumberField.spec.js new file mode 100644 index 0000000000..35735a5240 --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiNumberField.spec.js @@ -0,0 +1,96 @@ +import { describe, beforeEach, afterEach, vi, test, expect } from 'vitest' +import ApiNumberField from '../ApiNumberField.vue' +import ApiWrapper from '@/components/form/api/ApiWrapper.vue' +import Vue from 'vue' +import Vuetify from 'vuetify' +import flushPromises from 'flush-promises' +import formBaseComponents from '@/plugins/formBaseComponents' +import merge from 'lodash-es/merge' +import { ApiMock } from '@/components/form/api/__tests__/ApiMock' +import { i18n } from '@/plugins' +import { mount as mountComponent } from '@vue/test-utils' +import { waitForDebounce } from '@/test/util' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An ApiNumberField', () => { + let vuetify + let wrapper + let apiMock + + const path = 'test-field/123' + const NUMBER_1 = 1.2 + const NUMBER_1_string = '1.2' + + beforeEach(() => { + vuetify = new Vuetify() + apiMock = ApiMock.create() + }) + + afterEach(() => { + vi.restoreAllMocks() + wrapper.destroy() + }) + + const mount = (options) => { + const app = Vue.component('App', { + components: { ApiNumberField }, + props: { + path: { type: String, default: path }, + }, + template: `
+ +
`, + }) + apiMock.get().thenReturn(ApiMock.success(NUMBER_1).forPath(path)) + const defaultOptions = { + mocks: { + $tc: () => {}, + api: apiMock.getMocks(), + }, + } + return mountComponent(app, { + vuetify, + i18n, + attachTo: document.body, + ...merge(defaultOptions, options), + }) + } + + test('triggers api.patch and status update if input changes', async () => { + apiMock.patch().thenReturn(ApiMock.success(NUMBER_1)) + wrapper = mount() + + await flushPromises() + + const input = wrapper.find('input') + await input.setValue(NUMBER_1) + await input.trigger('submit') + + await waitForDebounce() + await flushPromises() + + expect(apiMock.getMocks().patch).toBeCalledTimes(1) + expect(wrapper.findComponent(ApiWrapper).vm.parsedLocalValue).toBe(NUMBER_1) + }) + + test('updates state if value in store is refreshed and has new value', async () => { + wrapper = mount() + apiMock.get().thenReturn(ApiMock.success(NUMBER_1).forPath(path)) + + wrapper.findComponent(ApiWrapper).vm.reload() + + await waitForDebounce() + await flushPromises() + + expect(wrapper.findComponent(ApiWrapper).vm.parsedLocalValue).toBe(NUMBER_1) + expect(wrapper.find('input[type=text]').element.value).toBe(NUMBER_1_string) + }) +}) diff --git a/frontend-old/src/components/form/api/__tests__/ApiSelect.spec.js b/frontend-old/src/components/form/api/__tests__/ApiSelect.spec.js new file mode 100644 index 0000000000..9408d4d20b --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiSelect.spec.js @@ -0,0 +1,113 @@ +// Libraries +import { describe, beforeEach, afterEach, vi, test, expect } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' + +import formBaseComponents from '@/plugins/formBaseComponents' + +import { mount as mountComponent } from '@vue/test-utils' +import ApiSelect from '../ApiSelect.vue' +import flushPromises from 'flush-promises' +import ApiWrapper from '@/components/form/api/ApiWrapper.vue' +import { i18n } from '@/plugins' +import merge from 'lodash-es/merge' +import { ApiMock } from '@/components/form/api/__tests__/ApiMock' +import { waitForDebounce } from '@/test/util' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An ApiSelect', () => { + let vuetify + let wrapper + let apiMock + + const path = 'test-field/123' + + const FIRST_OPTION = { + value: 1, + text: 'firstOption', + } + const SECOND_OPTION = { + value: '2', + text: 'secondOption', + } + + const selectValues = [FIRST_OPTION, SECOND_OPTION] + + beforeEach(() => { + vuetify = new Vuetify() + apiMock = ApiMock.create() + }) + + afterEach(() => { + vi.restoreAllMocks() + wrapper.destroy() + }) + + const mount = (options) => { + const app = Vue.component('App', { + components: { ApiSelect }, + props: { + path: { type: String, default: path }, + selectValues: { type: Array, default: () => selectValues }, + }, + template: ` +
+ +
+ `, + }) + apiMock.get().thenReturn(ApiMock.success(FIRST_OPTION.value).forPath(path)) + const defaultOptions = { + mocks: { + $tc: () => {}, + api: apiMock.getMocks(), + }, + } + return mountComponent(app, { + vuetify, + i18n, + attachTo: document.body, + ...merge(defaultOptions, options), + }) + } + + test('triggers api.patch and status update if input changes', async () => { + apiMock.patch().thenReturn(ApiMock.success(SECOND_OPTION.value)) + wrapper = mount() + + await flushPromises() + + await wrapper.find('.v-input__slot').trigger('click') + await wrapper.findAll('[role="option"]').at(1).trigger('click') + await wrapper.find('input').trigger('submit') + + await waitForDebounce() + await flushPromises() + + expect(apiMock.getMocks().patch).toBeCalledTimes(1) + expect(wrapper.findComponent(ApiWrapper).vm.localValue).toBe(SECOND_OPTION.value) + }) + + test('updates state if value in store is refreshed and has new value', async () => { + wrapper = mount() + apiMock.get().thenReturn(ApiMock.success(SECOND_OPTION.value).forPath(path)) + + wrapper.findComponent(ApiWrapper).vm.reload() + + await waitForDebounce() + await flushPromises() + + expect(wrapper.findComponent(ApiWrapper).vm.localValue).toBe(SECOND_OPTION.value) + expect(wrapper.html()).toContain(SECOND_OPTION.text) + expect(wrapper.html()).not.toContain(FIRST_OPTION.text) + }) +}) diff --git a/frontend-old/src/components/form/api/__tests__/ApiSwitch.spec.js b/frontend-old/src/components/form/api/__tests__/ApiSwitch.spec.js new file mode 100644 index 0000000000..e399071663 --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiSwitch.spec.js @@ -0,0 +1,98 @@ +import { describe, beforeEach, afterEach, vi, test, expect } from 'vitest' +import ApiSwitch from '../ApiSwitch.vue' +import ApiWrapper from '@/components/form/api/ApiWrapper.vue' +import Vue from 'vue' +import Vuetify from 'vuetify' +import flushPromises from 'flush-promises' +import formBaseComponents from '@/plugins/formBaseComponents' +import merge from 'lodash-es/merge' +import { ApiMock } from '@/components/form/api/__tests__/ApiMock' +import { i18n } from '@/plugins' +import { mount as mountComponent } from '@vue/test-utils' +import { waitForDebounce } from '@/test/util' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An ApiSwitch', () => { + let vuetify + let wrapper + let apiMock + + const path = 'test-field/123' + + beforeEach(() => { + vuetify = new Vuetify() + apiMock = ApiMock.create() + }) + + afterEach(() => { + vi.restoreAllMocks() + wrapper.destroy() + }) + + const mount = (options) => { + const app = Vue.component('App', { + components: { ApiSwitch }, + props: { + path: { type: String, default: path }, + }, + template: ` +
+ +
+ `, + }) + apiMock.get().thenReturn(ApiMock.success(true).forPath(path)) + const defaultOptions = { + mocks: { + $tc: () => {}, + api: apiMock.getMocks(), + }, + } + return mountComponent(app, { + vuetify, + i18n, + attachTo: document.body, + ...merge(defaultOptions, options), + }) + } + + test('triggers api.patch and status update if input changes', async () => { + apiMock.patch().thenReturn(ApiMock.success(false)) + wrapper = mount() + + await flushPromises() + + const input = wrapper.find('input') + await input.trigger('click') + await input.trigger('submit') + + await waitForDebounce() + await flushPromises() + + expect(apiMock.getMocks().patch).toBeCalledTimes(1) + expect(wrapper.findComponent(ApiWrapper).vm.localValue).toBe(false) + }) + + test('updates state if value in store is refreshed and has new value', async () => { + wrapper = mount() + apiMock.get().thenReturn(ApiMock.success(false).forPath(path)) + + wrapper.findComponent(ApiWrapper).vm.reload() + + await waitForDebounce() + await flushPromises() + + expect(wrapper.findComponent(ApiWrapper).vm.localValue).toBe(false) + expect( + wrapper.find('input[type=checkbox]').element.getAttribute('aria-checked') + ).toBe('false') + }) +}) diff --git a/frontend-old/src/components/form/api/__tests__/ApiTextField.spec.js b/frontend-old/src/components/form/api/__tests__/ApiTextField.spec.js new file mode 100644 index 0000000000..734dfba461 --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiTextField.spec.js @@ -0,0 +1,98 @@ +import { describe, beforeEach, afterEach, vi, test, expect } from 'vitest' +import ApiTextField from '../ApiTextField.vue' +import ApiWrapper from '@/components/form/api/ApiWrapper.vue' +import Vue from 'vue' +import Vuetify from 'vuetify' +import flushPromises from 'flush-promises' +import formBaseComponents from '@/plugins/formBaseComponents' +import merge from 'lodash-es/merge' +import { ApiMock } from '@/components/form/api/__tests__/ApiMock' +import { i18n } from '@/plugins' +import { mount as mountComponent } from '@vue/test-utils' +import { waitForDebounce } from '@/test/util' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An ApiTextField', () => { + let vuetify + let wrapper + let apiMock + + const path = 'test-field/123' + const TEXT_1 = 'some text' + const TEXT_2 = 'another text' + + beforeEach(() => { + vuetify = new Vuetify() + apiMock = ApiMock.create() + }) + + afterEach(() => { + vi.restoreAllMocks() + wrapper.destroy() + }) + + const mount = (options) => { + const app = Vue.component('App', { + components: { ApiTextField }, + props: { + path: { type: String, default: path }, + }, + template: `
+ +
`, + }) + apiMock.get().thenReturn(ApiMock.success(TEXT_1).forPath(path)) + const defaultOptions = { + mocks: { + $tc: () => {}, + api: apiMock.getMocks(), + }, + } + return mountComponent(app, { + vuetify, + i18n, + attachTo: document.body, + ...merge(defaultOptions, options), + }) + } + + describe('text', () => { + test('triggers api.patch and status update if input changes', async () => { + apiMock.patch().thenReturn(ApiMock.success(TEXT_2)) + wrapper = mount() + + await flushPromises() + + const input = wrapper.find('input') + await input.setValue(TEXT_2) + await input.trigger('submit') + + await waitForDebounce() + await flushPromises() + + expect(apiMock.getMocks().patch).toBeCalledTimes(1) + expect(wrapper.findComponent(ApiWrapper).vm.localValue).toBe(TEXT_2) + }) + + test('updates state if value in store is refreshed and has new value', async () => { + wrapper = mount() + apiMock.get().thenReturn(ApiMock.success(TEXT_2).forPath(path)) + + wrapper.findComponent(ApiWrapper).vm.reload() + + await waitForDebounce() + await flushPromises() + + expect(wrapper.findComponent(ApiWrapper).vm.localValue).toBe(TEXT_2) + expect(wrapper.find('input[type=text]').element.value).toBe(TEXT_2) + }) + }) +}) diff --git a/frontend-old/src/components/form/api/__tests__/ApiTextarea.spec.js b/frontend-old/src/components/form/api/__tests__/ApiTextarea.spec.js new file mode 100644 index 0000000000..c4bf3dfd20 --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiTextarea.spec.js @@ -0,0 +1,85 @@ +import { describe, beforeEach, afterEach, vi, test, expect } from 'vitest' +import ApiTextarea from '@/components/form/api/ApiTextarea.vue' +import ApiWrapper from '@/components/form/api/ApiWrapper.vue' +import Vue from 'vue' +import Vuetify from 'vuetify' +import flushPromises from 'flush-promises' +import formBaseComponents from '@/plugins/formBaseComponents' +import merge from 'lodash-es/merge' +import { ApiMock } from '@/components/form/api/__tests__/ApiMock' +import { i18n } from '@/plugins' +import { mount as mountComponent } from '@vue/test-utils' +import { waitForDebounce } from '@/test/util' +import { mockEventClass } from '@/test/mockEventClass' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +mockEventClass('ClipboardEvent') +mockEventClass('DragEvent') + +describe('An ApiTextarea', () => { + let vuetify + let wrapper + let apiMock + + const path = 'test-field/123' + const TEXT_1 = 'some text' + const TEXT_2 = 'another text' + + beforeEach(() => { + vuetify = new Vuetify() + apiMock = ApiMock.create() + }) + + afterEach(() => { + vi.restoreAllMocks() + wrapper.destroy() + }) + + const mount = (options) => { + const app = Vue.component('App', { + components: { ApiTextarea }, + props: { + path: { type: String, default: path }, + }, + template: ` +
+ +
`, + }) + apiMock.get().thenReturn(ApiMock.success(TEXT_1).forPath(path)) + const defaultOptions = { + mocks: { + $tc: () => {}, + api: apiMock.getMocks(), + }, + } + return mountComponent(app, { + vuetify, + i18n, + attachTo: document.body, + ...merge(defaultOptions, options), + }) + } + + test('updates state if value in store is refreshed and has new value', async () => { + wrapper = mount() + apiMock.get().thenReturn(ApiMock.success(TEXT_2).forPath(path)) + + wrapper.findComponent(ApiWrapper).vm.reload() + + await waitForDebounce() + await flushPromises() + + expect(wrapper.find('div.e-form-container').element.getAttribute('value')).toBe( + TEXT_2 + ) + }) +}) diff --git a/frontend-old/src/components/form/api/__tests__/ApiTimePicker.spec.js b/frontend-old/src/components/form/api/__tests__/ApiTimePicker.spec.js new file mode 100644 index 0000000000..463ba9b04f --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiTimePicker.spec.js @@ -0,0 +1,89 @@ +import { describe, beforeEach, afterEach, vi, expect, it } from 'vitest' +import ApiTimePicker from '../ApiTimePicker.vue' +import { screen, waitFor } from '@testing-library/vue' +import { render, setTestLocale } from '@/test/renderWithVuetify.js' +import user from '@testing-library/user-event' +import { ApiMock } from '@/components/form/api/__tests__/ApiMock' + +describe('An ApiTimePicker', () => { + let apiMock + + const FIELD_PATH = 'test-field/123' + const FIELD_LABEL = 'Test field' + const TIME_1 = '2037-07-18T09:52:00+00:00' + const TIME_2 = '2037-07-18T00:52:00+00:00' + const PICKER_BUTTON_LABEL_TEXT = 'Dialog öffnen, um eine Zeit für Test field zu wählen' + + beforeEach(() => { + setTestLocale('de') + apiMock = ApiMock.create() + }) + + afterEach(() => { + vi.restoreAllMocks() + }) + + it('triggers api.patch and status update if input changes', async () => { + // given + apiMock.get().thenReturn(ApiMock.success(TIME_1).forPath(FIELD_PATH)) + apiMock.patch().thenReturn(ApiMock.success(TIME_2)) + render(ApiTimePicker, { + props: { + autoSave: false, + path: FIELD_PATH, + uri: 'test-field/123', + label: FIELD_LABEL, + required: true, + }, + mocks: { + api: apiMock.getMocks(), + }, + }) + + // when + // click the button to open the picker + await user.click(screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT)) + // Click the 0th hour. We can only click this one, because + // testing library is missing the vuetify styles, and all the + // number elements overlap + await user.click(await screen.findByText('0')) + // click the save button + await user.click(screen.getByLabelText('Speichern')) + + // then + await waitFor(async () => { + const inputField = await screen.findByLabelText(FIELD_LABEL) + expect(inputField.value).toBe('00:52') + expect(apiMock.getMocks().patch).toBeCalledTimes(1) + }) + }) + + it('updates state if value in store is refreshed and has new value', async () => { + // given + apiMock.get().thenReturn(ApiMock.networkError().forPath(FIELD_PATH)) + render(ApiTimePicker, { + props: { + autoSave: false, + path: FIELD_PATH, + uri: 'test-field/123', + label: FIELD_LABEL, + required: true, + }, + mocks: { + api: apiMock.getMocks(), + }, + }) + await screen.findByText('A network error occurred.') + expect((await screen.findByLabelText(FIELD_LABEL)).value).not.toBe('09:52') + const retryButton = await screen.findByText('Erneut versuchen') + apiMock.get().thenReturn(ApiMock.success(TIME_1).forPath(FIELD_PATH)) + + // when + await user.click(retryButton) + + // then + await waitFor(async () => { + expect((await screen.findByLabelText(FIELD_LABEL)).value).toBe('09:52') + }) + }) +}) diff --git a/frontend-old/src/components/form/api/__tests__/ApiWrapper.spec.js b/frontend-old/src/components/form/api/__tests__/ApiWrapper.spec.js new file mode 100644 index 0000000000..01dfe458b0 --- /dev/null +++ b/frontend-old/src/components/form/api/__tests__/ApiWrapper.spec.js @@ -0,0 +1,552 @@ +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' +import flushPromises from 'flush-promises' +import { createLocalVue, shallowMount } from '@vue/test-utils' +import veeValidatePlugin from '@/plugins/veeValidate' +import ApiWrapper from '../ApiWrapper.vue' +import { VBtn, VForm } from 'vuetify/lib' +import { ValidationObserver } from 'vee-validate' + +const { cloneDeep } = await vi.importActual('lodash-es') + +Vue.use(Vuetify) +Vue.use(veeValidatePlugin) +let vuetify + +let debounce +const resolveDebounce = () => debounce() + +vi.mock('lodash-es', async (importOriginal) => { + const lodash = await importOriginal() + return { + ...lodash, + debounce: (callback) => + function () { + return new Promise((resolve) => (debounce = resolve)).then(callback) + }, + set: lodash.set, + get: lodash.get, + } +}) + +let patch +const resolvePatch = (value) => patch(value) + +function resetPromises() { + patch = undefined +} + +// config factory +function createConfig(overrides) { + const mocks = { + api: { + patch: () => new Promise((resolve) => (patch = resolve)), + get: () => new Promise(), + }, + } + + const propsData = { + value: 'Test Value', + path: 'testField', + uri: '/testEntity/123', + label: 'Test Field', + } + + const stubs = { + VForm, + VBtn, + ValidationObserver, + } + + const scopedSlots = { + default: + '', + } + + const localVue = createLocalVue() + + return cloneDeep( + Object.assign({ mocks, propsData, vuetify, stubs, scopedSlots, localVue }, overrides) + ) +} + +beforeEach(() => { + resetPromises() + vi.useFakeTimers() +}) + +afterEach(() => { + vi.useRealTimers() +}) + +/** + * AutoSave = true + * External value + */ +describe('Testing ApiWrapper [autoSave=true; manual external value]', () => { + let wrapper + let vm + let config + let apiPatch + let validateResolveFunction + let validateCalled + + beforeEach(() => { + vuetify = new Vuetify() + + config = createConfig() + wrapper = shallowMount(ApiWrapper, config) + vm = wrapper.vm + + apiPatch = vi.spyOn(config.mocks.api, 'patch') + + validateCalled = new Promise((resolve) => (validateResolveFunction = resolve)) + + // mock validation Promise + const validate = vi.spyOn(vm.$refs.validationObserver, 'validate') + validate.mockImplementation(() => { + validateResolveFunction() + return true + }) + }) + + afterEach(() => { + wrapper?.destroy() + vi.resetAllMocks() + }) + + test('init correctly with default values', () => { + expect(vm.value).toBe(config.propsData.value) + expect(vm.dirty).toBe(false) + expect(vm.isSaving).toBe(false) + expect(vm.isLoading).toBe(false) + expect(vm.status).toBe('init') + expect(vm.autoSave).toBe(true) + + // no buttons expected in AutoSave Mode (which is default) + expect(wrapper.findAllComponents({ name: 'VBtn' })).toHaveLength(0) + }) + + test('calls api.patch after onInput was triggered', async () => { + const newValue = 'new value' + const newValueFromApi = 'new value' + + await vm.onInput(newValue) + + // value (from outside) is still the same + expect(vm.value).toBe(config.propsData.value) + + // local Value has changed and is dirty + expect(vm.dirty).toBe(true) + expect(vm.localValue).toBe(newValue) + + resolveDebounce() + await flushPromises() + + await validateCalled + + // saving started + expect(vm.isSaving).toBe(true) + expect(vm.dirty).toBe(true) + expect(vm.status).toBe('saving') + + // API patch method called + expect(apiPatch).toBeCalledTimes(1) + expect(apiPatch).toBeCalledWith(config.propsData.uri, { + [config.propsData.path]: newValue, + }) + + resolvePatch({}) + + // feedback changed return value from API & make sure it's taken over to localValue + await wrapper.setProps({ value: newValueFromApi }) + await wrapper.vm.$nextTick() + expect(vm.localValue).toBe(newValueFromApi) + expect(vm.dirty).toBe(false) + + // success state + expect(vm.status).toBe('success') + + // wait for success icon timer to finish + await vi.advanceTimersByTime(2000) + await flushPromises() + + // again in init state + expect(vm.status).toBe('init') + }) + + test('avoid double triggering of save for enter key', async () => { + // given + const input = wrapper.find('input') + + // when + await vm.onInput('new value') + await input.trigger('submit') // trigger submit event (simulates enter key) + + resolveDebounce() + await flushPromises() + + resolvePatch() + + // then + expect(apiPatch).toHaveBeenCalledTimes(1) + }) + + test('shows server error if api.patch failed', async () => { + // given + apiPatch.mockRejectedValueOnce(new Error('server error')) + + // when + await vm.onInput('new value') // Trigger patch + + resolveDebounce() + await flushPromises() + + // then + expect(vm.hasServerError).toBe(true) + expect(vm.errorMessages).toContain('server error') + }) + + test('can process server validation error', async () => { + const validationMsg = 'The input is less than 10 characters long' + apiPatch.mockRejectedValueOnce(new Error(validationMsg)) + + // when + await vm.onInput('new value') // Trigger patch + + resolveDebounce() + await flushPromises() + + // then + expect(vm.hasServerError).toBe(true) + expect(vm.errorMessages).toContain(validationMsg) + }) + + /* + test('shows error if `required` validation fails', async () => { + // given + wrapper.setProps({ required: true }) + + // when + await vm.onInput('') + + // then + expect(vm.hasValidationError).toBe(true) + expect(vm.errorMessages[0]).toMatch('is required') + }) */ + + /* + test('shows error if arbitrary validation fails & aborts save', async () => { + // given + wrapper.setProps({ validation: 'min:3|myOwnValidationRule' }) + validate.mockResolvedValue({ valid: false, errors: ['Validation failed'] }) + + // when + await vm.onInput('any value') + + // then + expect(validate).toHaveBeenCalledWith('any value', 'min:3|myOwnValidationRule', { name: 'Test Field' }) + expect(vm.hasValidationError).toBe(true) + expect(vm.errorMessages[0]).toMatch('Validation failed') + + // when + vm.save() + + // then + expect(apiPatch).not.toHaveBeenCalled() + }) + + test('clears error if arbitrary validation succedes', async () => { + // given + wrapper.setProps({ validation: 'required' }) + wrapper.vm.hasValidationError = true + validate.mockResolvedValue({ valid: true, errors: [] }) + + // when + await vm.onInput('any value') + + // then + expect(vm.hasValidationError).toBe(false) + expect(vm.errorMessages).toHaveLength(0) + }) */ +}) + +/** + * AutoSave = true + * Value from API + */ +describe('Testing ApiWrapper [autoSave=true; value from API]', () => { + let wrapper + let vm + let config + // let apiPatch + let apiGet + + beforeEach(() => { + vuetify = new Vuetify() + + config = createConfig() + delete config.propsData.value + + apiGet = vi.spyOn(config.mocks.api, 'get') + + apiGet.mockReturnValue({ + [config.propsData.path]: 'api value', + _meta: { + load: Promise.resolve(), + }, + }) + }) + + afterEach(() => { + wrapper?.destroy() + }) + + test('loads value from API (path = primitive value)', async () => { + // given + const loadingValue = () => ({}) + loadingValue.loading = true + apiGet.mockReturnValue({ + [config.propsData.path]: loadingValue, + _meta: { + loading: true, + load: Promise.resolve(), + }, + }) + + // when + wrapper = shallowMount(ApiWrapper, config) + vm = wrapper.vm + + // then + expect(vm.isLoading).toBe(true) + expect(vm.localValue).toBe(null) + + // given + apiGet.mockReturnValue({ + [config.propsData.path]: 'api value', + _meta: { + load: Promise.resolve(), + }, + }) + + // when + await flushPromises() // wait for load promise to resolve + + // then + expect(vm.hasFinishedLoading).toBe(true) + expect(vm.isLoading).toBe(false) + expect(vm.localValue).toBe('api value') + }) + + test('shows error when loading value from API fails', async () => { + // given + const loadingValue = () => ({}) + loadingValue._meta = { loading: true } + apiGet.mockReturnValue({ + [config.propsData.path]: loadingValue, + _meta: { + load: Promise.reject(new Error('loading error')), + loading: true, + }, + }) + wrapper = shallowMount(ApiWrapper, config) + vm = wrapper.vm + + // when + await flushPromises() // wait for load promise to resolve + + // then + expect(vm.hasFinishedLoading).toBe(false) + expect(vm.isLoading).toBe(false) + expect(vm.hasLoadingError).toBe(true) + expect(vm.errorMessages[0]).toMatch('loading error') + }) + + test('loads IRI from API (path = embedded entity)', async () => { + // given + const loadingValue = () => ({}) + loadingValue._meta = { loading: true } + apiGet.mockReturnValue({ + [config.propsData.path]: loadingValue, + _meta: { + load: Promise.resolve(), + loading: true, + }, + }) + + wrapper = shallowMount(ApiWrapper, config) + vm = wrapper.vm + + apiGet.mockReturnValue({ + [config.propsData.path]: () => ({ + _meta: { + self: '/iri/5', + }, + }), + _meta: { + load: Promise.resolve(), + }, + }) + + // when + await flushPromises() // wait for load promise to resolve + + // then + expect(vm.hasFinishedLoading).toBe(true) + expect(vm.isLoading).toBe(false) + expect(vm.localValue).toBe('/iri/5') + }) + + test('loads array of IRIs from API (path = embedded collection)', async () => { + // given + const loadingValue = () => ({}) + loadingValue._meta = { loading: true } + apiGet.mockReturnValue({ + [config.propsData.path]: loadingValue, + _meta: { + load: Promise.resolve(), + loading: true, + }, + }) + + wrapper = shallowMount(ApiWrapper, config) + vm = wrapper.vm + + apiGet.mockReturnValue({ + [config.propsData.path]: () => ({ + items: [ + { + _meta: { + self: '/iri/5', + }, + }, + { + _meta: { + self: '/iri/6', + }, + }, + ], + }), + _meta: { + load: Promise.resolve(), + }, + }) + + // when + await flushPromises() // wait for load promise to resolve + + // then + expect(vm.hasFinishedLoading).toBe(true) + expect(vm.isLoading).toBe(false) + expect(vm.localValue).toStrictEqual(['/iri/5', '/iri/6']) + }) +}) + +/** + * Manual mode + */ +describe('Testing ApiWrapper [autoSave=false]', () => { + let wrapper + let vm + let config + let apiPatch + + beforeEach(() => { + vuetify = new Vuetify() + + config = createConfig() + config.propsData.autoSave = false + + wrapper = shallowMount(ApiWrapper, config) + vm = wrapper.vm + + apiPatch = vi.spyOn(config.mocks.api, 'patch') + }) + + afterEach(() => { + wrapper?.destroy() + }) + + test('init correctly with default values', () => { + expect(vm.value).toBe(config.propsData.value) + expect(vm.dirty).toBe(false) + expect(vm.isSaving).toBe(false) + expect(vm.status).toBe('init') + expect(vm.autoSave).toBe(false) + }) + + test('clears dirty flag when local value matches external value', async () => { + // local change + await vm.onInput('new local value') + expect(vm.dirty).toBe(true) + + // new value from external --> local value will not be changed + await wrapper.setProps({ value: 'new external value #1' }) + expect(vm.localValue).toBe('new local value') + + // local change to same value as external value + await vm.onInput('new external value #1') + await vm.$nextTick() // needed for watcher to trigger + expect(vm.dirty).toBe(false) + + // new value from external --> local value will be changed + await wrapper.setProps({ value: 'new external value #2' }) + await vm.$nextTick() // needed for watcher to trigger + expect(vm.localValue).toBe('new external value #2') + }) + + test('resets value and errors when `reset` is called', async () => { + // when + await vm.onInput('new local value') + // vm.hasValidationError = true + + // then + expect(vm.dirty).toBe(true) + expect(vm.localValue).toBe('new local value') + + // when + await vm.reset() + + // then + expect(vm.dirty).toBe(false) + expect(vm.localValue).toBe('Test Value') + // expect(vm.hasValidationError).toBe(false) + }) + + test('trigger save with enter key', async () => { + // given + const input = wrapper.find('input') + + // when + await input.trigger('submit') + await vm.$nextTick() + await flushPromises() // resolve validation + + // then + expect(apiPatch).toHaveBeenCalled() + }) + + test('abort save in readonly mode', async () => { + // given + await wrapper.setProps({ readonly: true }) + + // when + await vm.save() + + // then + expect(apiPatch).not.toHaveBeenCalled() + }) + + test('abort save in disabled mode', async () => { + // given + await wrapper.setProps({ disabled: true }) + + // when + await vm.save() + + // then + expect(apiPatch).not.toHaveBeenCalled() + }) +}) diff --git a/frontend-old/src/components/form/base/BaseComponent.vue b/frontend-old/src/components/form/base/BaseComponent.vue new file mode 100644 index 0000000000..5355e37543 --- /dev/null +++ b/frontend-old/src/components/form/base/BaseComponent.vue @@ -0,0 +1,43 @@ + + + diff --git a/frontend-old/src/components/form/base/BasePicker.vue b/frontend-old/src/components/form/base/BasePicker.vue new file mode 100644 index 0000000000..e33f25e594 --- /dev/null +++ b/frontend-old/src/components/form/base/BasePicker.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/frontend-old/src/components/form/base/ColorPicker/ColorSwatch.vue b/frontend-old/src/components/form/base/ColorPicker/ColorSwatch.vue new file mode 100644 index 0000000000..6959e6245d --- /dev/null +++ b/frontend-old/src/components/form/base/ColorPicker/ColorSwatch.vue @@ -0,0 +1,62 @@ + + + diff --git a/frontend-old/src/components/form/base/EAutocomplete.vue b/frontend-old/src/components/form/base/EAutocomplete.vue new file mode 100644 index 0000000000..3f62b7df26 --- /dev/null +++ b/frontend-old/src/components/form/base/EAutocomplete.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/frontend-old/src/components/form/base/ECheckbox.vue b/frontend-old/src/components/form/base/ECheckbox.vue new file mode 100644 index 0000000000..5e7015528b --- /dev/null +++ b/frontend-old/src/components/form/base/ECheckbox.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/frontend-old/src/components/form/base/EColorField.vue b/frontend-old/src/components/form/base/EColorField.vue new file mode 100644 index 0000000000..30ccabd7d3 --- /dev/null +++ b/frontend-old/src/components/form/base/EColorField.vue @@ -0,0 +1,107 @@ + + + diff --git a/frontend-old/src/components/form/base/EColorPicker.vue b/frontend-old/src/components/form/base/EColorPicker.vue new file mode 100644 index 0000000000..41ab434df0 --- /dev/null +++ b/frontend-old/src/components/form/base/EColorPicker.vue @@ -0,0 +1,259 @@ + + + + + + diff --git a/frontend-old/src/components/form/base/EDatePicker.vue b/frontend-old/src/components/form/base/EDatePicker.vue new file mode 100644 index 0000000000..37fb6ef196 --- /dev/null +++ b/frontend-old/src/components/form/base/EDatePicker.vue @@ -0,0 +1,192 @@ + + + + + + + diff --git a/frontend-old/src/components/form/base/EForm.vue b/frontend-old/src/components/form/base/EForm.vue new file mode 100644 index 0000000000..aafabf12a0 --- /dev/null +++ b/frontend-old/src/components/form/base/EForm.vue @@ -0,0 +1,19 @@ + + + diff --git a/frontend-old/src/components/form/base/ENumberField.vue b/frontend-old/src/components/form/base/ENumberField.vue new file mode 100644 index 0000000000..076a98507a --- /dev/null +++ b/frontend-old/src/components/form/base/ENumberField.vue @@ -0,0 +1,67 @@ + + + diff --git a/frontend-old/src/components/form/base/EParseField.vue b/frontend-old/src/components/form/base/EParseField.vue new file mode 100644 index 0000000000..0b1a74c4ba --- /dev/null +++ b/frontend-old/src/components/form/base/EParseField.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/frontend-old/src/components/form/base/ERichtext.vue b/frontend-old/src/components/form/base/ERichtext.vue new file mode 100644 index 0000000000..cf1e1a7d78 --- /dev/null +++ b/frontend-old/src/components/form/base/ERichtext.vue @@ -0,0 +1,41 @@ + + + diff --git a/frontend-old/src/components/form/base/ESelect.vue b/frontend-old/src/components/form/base/ESelect.vue new file mode 100644 index 0000000000..b9c2495604 --- /dev/null +++ b/frontend-old/src/components/form/base/ESelect.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/frontend-old/src/components/form/base/ESwitch.vue b/frontend-old/src/components/form/base/ESwitch.vue new file mode 100644 index 0000000000..f2015db3fa --- /dev/null +++ b/frontend-old/src/components/form/base/ESwitch.vue @@ -0,0 +1,42 @@ + + + diff --git a/frontend-old/src/components/form/base/ETextField.vue b/frontend-old/src/components/form/base/ETextField.vue new file mode 100644 index 0000000000..93d96e31a2 --- /dev/null +++ b/frontend-old/src/components/form/base/ETextField.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/frontend-old/src/components/form/base/ETextarea.vue b/frontend-old/src/components/form/base/ETextarea.vue new file mode 100644 index 0000000000..f9c04158b6 --- /dev/null +++ b/frontend-old/src/components/form/base/ETextarea.vue @@ -0,0 +1,41 @@ + + + diff --git a/frontend-old/src/components/form/base/ETimeDropdown.vue b/frontend-old/src/components/form/base/ETimeDropdown.vue new file mode 100644 index 0000000000..5aa5254a36 --- /dev/null +++ b/frontend-old/src/components/form/base/ETimeDropdown.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/frontend-old/src/components/form/base/ETimeField.vue b/frontend-old/src/components/form/base/ETimeField.vue new file mode 100644 index 0000000000..19abde7704 --- /dev/null +++ b/frontend-old/src/components/form/base/ETimeField.vue @@ -0,0 +1,104 @@ + + + diff --git a/frontend-old/src/components/form/base/ETimePicker.vue b/frontend-old/src/components/form/base/ETimePicker.vue new file mode 100644 index 0000000000..2f240d1f31 --- /dev/null +++ b/frontend-old/src/components/form/base/ETimePicker.vue @@ -0,0 +1,156 @@ + + + + + + + diff --git a/frontend-old/src/components/form/base/__tests__/ECheckbox.spec.js b/frontend-old/src/components/form/base/__tests__/ECheckbox.spec.js new file mode 100644 index 0000000000..da599827dd --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/ECheckbox.spec.js @@ -0,0 +1,101 @@ +import { describe, beforeEach, vi, test, expect } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' + +import formBaseComponents from '@/plugins/formBaseComponents' + +import { mount as mountComponent } from '@vue/test-utils' +import ECheckbox from '../ECheckbox.vue' +import { screen } from '@testing-library/vue' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An ECheckbox', () => { + let vuetify + + const mount = (options) => { + const app = Vue.component('App', { + components: { ECheckbox }, + data: function () { + return { + data: null, + } + }, + template: ` +
+ + ${options?.children} + +
+ `, + }) + return mountComponent(app, { vuetify, attachTo: document.body, ...options }) + } + beforeEach(() => { + vuetify = new Vuetify() + }) + test('looks like a checkbox', async () => { + const wrapper = mount() + await wrapper.setData({ data: false }) + expect(wrapper).toMatchSnapshot('unchecked') + + await wrapper.setData({ data: true }) + expect(wrapper).toMatchSnapshot('checked') + }) + + test('is checked when initialized checked', () => { + const wrapper = mount({ + data: function () { + return { + data: true, + } + }, + }) + expect( + wrapper.find('input[type=checkbox]').element.getAttribute('aria-checked') + ).toBe('true') + }) + + test('updates checkbox when vModel changes', async () => { + const wrapper = mount() + await wrapper.setData({ data: false }) + expect( + wrapper.find('input[type=checkbox]').element.getAttribute('aria-checked') + ).toBe('false') + + await wrapper.setData({ data: true }) + expect( + wrapper.find('input[type=checkbox]').element.getAttribute('aria-checked') + ).toBe('true') + + await wrapper.setData({ data: false }) + expect( + wrapper.find('input[type=checkbox]').element.getAttribute('aria-checked') + ).toBe('false') + }) + + test('updates vModel when user clicks on checkbox', async () => { + const wrapper = mount() + const input = wrapper.find('input') + + await input.trigger('click') + expect(wrapper.vm.data).toBe(true) + + vi.resetAllMocks() + await input.trigger('click') + expect(wrapper.vm.data).toBe(false) + }) + + test('allows to use the append slot', async () => { + mount({ + children: ` + + `, + }) + + expect(await screen.findByText('append')).toBeVisible() + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/EColorField.spec.js b/frontend-old/src/components/form/base/__tests__/EColorField.spec.js new file mode 100644 index 0000000000..0161d8591b --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/EColorField.spec.js @@ -0,0 +1,90 @@ +import { describe, beforeEach, test, expect } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' + +import formBaseComponents from '@/plugins/formBaseComponents' + +import EColorField from '@/components/form/base/EColorField.vue' +import { mount as mountComponent } from '@vue/test-utils' +import { ColorSpace, sRGB } from 'colorjs.io/fn' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +ColorSpace.register(sRGB) + +describe('An EColorField', () => { + let vuetify + + const mount = (options) => { + const app = Vue.component('App', { + components: { EColorField }, + data: function () { + return { + data: null, + } + }, + methods: { + parse: (value) => { + return value === 'true' ? true : value === 'false' ? false : null + }, + format: (value) => { + return value === null ? '' : `${value}` + }, + }, + template: `
`, + }) + return mountComponent(app, { vuetify, attachTo: document.body, ...options }) + } + + beforeEach(() => { + vuetify = new Vuetify() + }) + + test('looks like a textfield', async () => { + const wrapper = mount() + expect(wrapper).toMatchSnapshot('empty') + + await wrapper.setData({ data: '#FF0000' }) + expect(wrapper).toMatchSnapshot('with text') + }) + + test('updates text when vModel changes', async () => { + const wrapper = mount() + const input = wrapper.find('input').element + expect(input.value).toBeDefined() + + const firstValue = '#A1E1E1' + await wrapper.setData({ data: firstValue }) + expect(input.value).toBe(`${firstValue}`) + + const secondValue = '#FF00FF' + await wrapper.setData({ data: secondValue }) + expect(input.value).toBe(`${secondValue}`) + }) + + test('updates vModel when value of input field changes', async () => { + const wrapper = mount() + const input = wrapper.find('input') + const value = '#123456' + + input.element.value = `${value}` + await input.trigger('input') + + expect(wrapper.vm.data).toBe(value) + }) + + test.each([ + ['#00FF00', '#00FF00'], + ['red', '#FF0000'], + ['', null], + ])('parses "%s" as "%s"', async (string, expected) => { + const wrapper = mount() + const input = wrapper.find('input') + + input.element.value = `${string}` + await input.trigger('input') + + expect(wrapper.vm.data).toBe(expected) + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/EColorPicker.spec.js b/frontend-old/src/components/form/base/__tests__/EColorPicker.spec.js new file mode 100644 index 0000000000..d3a4694341 --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/EColorPicker.spec.js @@ -0,0 +1,252 @@ +import { describe, beforeEach, expect, it } from 'vitest' +import { fireEvent, screen, waitFor } from '@testing-library/vue' +import { render, setTestLocale, snapshotOf } from '@/test/renderWithVuetify.js' +import user from '@testing-library/user-event' +import EColorPicker from '../EColorPicker.vue' + +import { regex } from 'vee-validate/dist/rules' +import { extend } from 'vee-validate' +import { ColorSpace, sRGB } from 'colorjs.io/fn' + +extend('regex', regex) + +ColorSpace.register(sRGB) +describe('An EColorPicker', () => { + const COLOR1 = '#FF0000' + const COLOR2 = '#FF00FF' + const COLOR3 = '#FAFFAF' + const INVALID_COLOR = 'some new color' + const PICKER_BUTTON_LABEL_TEXT = 'Dialog öffnen, um eine Farbe für test zu wählen' + const VALIDATION_MESSAGE = 'Bitte gültige Farbe eingeben.' + + beforeEach(() => { + setTestLocale('de') + }) + + it('renders the component', async () => { + // given + + // when + render(EColorPicker, { + props: { + value: COLOR1, + label: 'test', + }, + }) + + // then + await screen.findByDisplayValue(COLOR1) + screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT) + }) + + it('looks like a color picker', async () => { + // given + + // when + const { container } = render(EColorPicker, { + props: { value: COLOR1, label: 'test' }, + }) + + // then + expect(snapshotOf(container)).toMatchSnapshot('pickerclosed') + + // when + await user.click(screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT)) + + // then + await screen.findByTestId('colorpicker') + expect(snapshotOf(container)).toMatchSnapshot('pickeropen') + }) + + it('opens the picker when the text field is clicked', async () => { + // given + render(EColorPicker, { + props: { value: COLOR1, label: 'test' }, + }) + const inputField = await screen.findByDisplayValue(COLOR1) + + // when + await user.click(inputField) + + // then + await waitFor(async () => { + expect(await screen.findByTestId('colorpicker')).toBeVisible() + }) + }) + + it('opens the picker when the icon button is clicked', async () => { + // given + render(EColorPicker, { + props: { value: COLOR1, label: 'test' }, + }) + const button = await screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT) + + // when + await user.click(button) + + // then + await waitFor(async () => { + expect(await screen.findByTestId('colorpicker')).toBeVisible() + }) + }) + + it('closes the picker when clicking outside', async () => { + // given + render(EColorPicker, { + props: { value: COLOR1, label: 'test' }, + }) + const button = await screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByTestId('colorpicker')).toBeVisible() + }) + + // when + await user.click(document.body) + + // then + await waitFor(async () => { + expect(await screen.queryByTestId('colorpicker')).not.toBeVisible() + }) + }) + + it('closes the picker when pressing escape', async () => { + // given + render(EColorPicker, { + props: { value: COLOR1, label: 'test' }, + }) + const button = await screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByTestId('colorpicker')).toBeVisible() + }) + + // when + await user.keyboard('{Escape}') + + // then + await waitFor(async () => { + expect(await screen.queryByTestId('colorpicker')).not.toBeVisible() + }) + }) + + it('does not close the picker when selecting a color', async () => { + // given + const { container } = render(EColorPicker, { + props: { value: COLOR1, label: 'test' }, + }) + const button = await screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByTestId('colorpicker')).toBeVisible() + }) + + // when + // click inside the color picker canvas to select a different color + const canvas = container.querySelector('canvas') + await user.click(canvas, { clientX: 10, clientY: 10 }) + + // then + // close button should stay visible + await expect( + waitFor(() => { + expect(screen.queryByTestId('colorpicker')).not.toBeVisible() + }) + ).rejects.toThrow(/Received element is visible/) + }) + + it('updates v-model when the value changes', async () => { + // given + const { emitted } = render(EColorPicker, { + props: { value: COLOR1, label: 'test' }, + }) + const inputField = await screen.findByDisplayValue(COLOR1) + + // when + await user.clear(inputField) + await user.keyboard(COLOR2) + + // then + await waitFor(async () => { + const events = emitted().input + // some input events were fired + expect(events.length).toBeGreaterThan(0) + // the last one included the parsed version of our entered time + expect(events[events.length - 1]).toEqual([COLOR2]) + }) + // Our entered time should be visible... + screen.getByDisplayValue(COLOR2) + // ...and stay visible + await expect( + waitFor(() => { + expect(screen.getByDisplayValue(COLOR2)).not.toBeVisible() + }) + ).rejects.toThrow(/Received element is visible/) + }) + + it('updates v-model when a new color is selected in the picker', async () => { + // given + const { emitted, container } = render(EColorPicker, { + props: { value: COLOR1, label: 'test' }, + }) + await screen.findByDisplayValue(COLOR1) + const button = await screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT) + + // when + // click the button to open the picker + await user.click(button) + // click inside the color picker canvas to select a different color + const canvas = container.querySelector('canvas') + await user.click(canvas, { clientX: 10, clientY: 10 }) + // click the close button + await user.click(screen.getByTestId('colorpicker')) + + // then + await waitFor(async () => { + const events = emitted().input + // some input events were fired + expect(events.length).toBeGreaterThan(0) + // the last one included the parsed version of our entered time + expect(events[events.length - 1]).toEqual([COLOR3]) + }) + // Our entered time should be visible... + screen.getByDisplayValue(COLOR3) + // ...and stay visible + await expect( + waitFor(() => { + expect(screen.getByDisplayValue(COLOR3)).not.toBeVisible() + }) + ).rejects.toThrow(/Received element is visible/) + }) + + it('validates the input', async () => { + // given + render(EColorPicker, { + props: { value: COLOR1, path: 'test', validationLabelOverride: 'test' }, + }) + const inputField = await screen.findByDisplayValue(COLOR1) + + // when + await user.clear(inputField) + await user.keyboard(INVALID_COLOR) + await fireEvent.blur(inputField) + + // then + await screen.findByText(VALIDATION_MESSAGE) + }) + + it('accepts null', async () => { + render(EColorPicker, { + props: { value: COLOR2, label: 'test' }, + }) + const inputField = await screen.findByDisplayValue(COLOR2) + expect(inputField).toHaveValue(COLOR2) + const button = await screen.getByLabelText(PICKER_BUTTON_LABEL_TEXT) + // click the button to open the picker + await user.click(button) + + // when + await user.click(screen.getByTestId('colorpicker').querySelector('.reset')) + expect(inputField).toHaveValue('') + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/EDatePicker.spec.js b/frontend-old/src/components/form/base/__tests__/EDatePicker.spec.js new file mode 100644 index 0000000000..ce842fc677 --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/EDatePicker.spec.js @@ -0,0 +1,406 @@ +import { describe, beforeEach, expect, it } from 'vitest' +import { screen, waitFor } from '@testing-library/vue' +import { render, setTestLocale, snapshotOf } from '@/test/renderWithVuetify.js' +import user from '@testing-library/user-event' +import EDatePicker from '../EDatePicker.vue' + +describe('An EDatePicker', () => { + const DATE1_ISO = '2020-03-01' + const DATE2_ISO = '2020-03-19' + + const localeData = { + de: { + date1: '01.03.2020', + date2: '19.03.2020', + dateShort: '2.4.2021', + dateInWrongLocale: '03/19/2020', + labelText: 'Dialog öffnen, um ein Datum für test zu wählen', + date1Heading: 'März 2020', + date3Heading: 'Januar 2111', + date4Heading: 'Januar 1999', + closeButton: 'Schliessen', + validationMessage: + 'Ungültiges Format, bitte gib das Datum im Format DD.MM.YYYY ein', + }, + en: { + date1: '03/01/2020', + date2: '03/19/2020', + dateShort: '4/2/2021', + dateInWrongLocale: '19.03.2020', + labelText: 'Open dialog to select a date for test', + date1Heading: 'March 2020', + date3Heading: 'January 2111', + date4Heading: 'January 1999', + closeButton: 'Close', + validationMessage: 'Invalid format, please enter the date in the format MM/DD/YYYY', + }, + } + + describe.each(Object.entries(localeData))('in locale %s', (locale, data) => { + beforeEach(() => { + setTestLocale(locale) + }) + + it('renders the component', async () => { + // given + + // when + render(EDatePicker, { props: { value: DATE1_ISO, label: 'test' } }) + + // then + await screen.findByDisplayValue(data.date1) + screen.getByLabelText(data.labelText) + }) + + it('looks like a date picker', async () => { + // given + + // when + const { container } = render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + + // then + expect(snapshotOf(container)).toMatchSnapshot('pickerclosed') + + // when + await user.click(screen.getByLabelText(data.labelText)) + + // then + await screen.findByText(data.closeButton) + await screen.findByText(data.date1Heading) + expect(snapshotOf(container)).toMatchSnapshot('pickeropen') + }) + + it('does not open the picker when the text field is clicked', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + const inputField = await screen.findByDisplayValue(data.date1) + + // when + await user.click(inputField) + + // then + // menu should not appear + await expect(screen.findByText(data.date1Heading)).rejects.toThrow( + /Unable to find an element with the text/ + ) + }) + + it('opens the picker when the icon button is clicked', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + + // when + await user.click(button) + + // then + await waitFor(async () => { + expect(await screen.findByText(data.date1Heading)).toBeVisible() + }) + }) + + it('closes the picker when clicking the close button', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByText(data.date1Heading)).toBeVisible() + }) + const closeButton = screen.getByText(data.closeButton) + + // when + await user.click(closeButton) + + // then + await waitFor(async () => { + expect(await screen.queryByText(data.date1Heading)).not.toBeVisible() + }) + }) + + it('closes the picker when clicking outside', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByText(data.date1Heading)).toBeVisible() + }) + + // when + await user.click(document.body) + + // then + await waitFor(async () => { + expect(await screen.queryByText(data.date1Heading)).not.toBeVisible() + }) + }) + + it('closes the picker when pressing escape', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByText(data.date1Heading)).toBeVisible() + }) + + // when + await user.keyboard('{Escape}') + + // then + await waitFor(async () => { + expect(await screen.queryByText(data.date1Heading)).not.toBeVisible() + }) + }) + + it('closes the picker when selecting a date', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByText(data.date1Heading)).toBeVisible() + }) + + // when + // click the 19th day of the month + await user.click(screen.getByText('19')) + + // then + await waitFor(async () => { + expect(await screen.queryByText(data.date1Heading)).not.toBeVisible() + }) + }) + + it('re-opens the picker when clicking the button again after selecting a date', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByText(data.date1Heading)).toBeVisible() + }) + // click the 19th day of the month + await user.click(screen.getByText('19')) + await waitFor(async () => { + expect(await screen.queryByText(data.date1Heading)).not.toBeVisible() + }) + + // when + await user.click(button) + + // then + await waitFor(async () => { + expect(await screen.findByText(data.date1Heading)).toBeVisible() + }) + }) + + it('updates v-model when the input field is changed', async () => { + // given + const { emitted } = render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + const inputField = await screen.findByDisplayValue(data.date1) + + // when + await user.clear(inputField) + await user.keyboard(data.date2) + + // then + await waitFor(async () => { + const events = emitted().input + // some input events were fired + expect(events.length).toBeGreaterThan(0) + // the last one included the parsed version of our entered date + expect(events[events.length - 1]).toEqual([DATE2_ISO]) + }) + // Our entered date should be visible... + screen.getByDisplayValue(data.date2) + // ...and stay visible + await expect( + waitFor(() => { + expect(screen.getByDisplayValue(data.date2)).not.toBeVisible() + }) + ).rejects.toThrow(/Received element is visible/) + }) + + it('updates v-model when a new date is selected in the picker', async () => { + // given + const { emitted } = render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + await screen.findByDisplayValue(data.date1) + const button = await screen.getByLabelText(data.labelText) + + // when + // click the button to open the picker + await user.click(button) + // click the 19th day of the month + await user.click(screen.getByText('19')) + + // then + await waitFor(async () => { + const events = emitted().input + // some input events were fired + expect(events.length).toBeGreaterThan(0) + // the last one included the parsed version of our entered date + expect(events[events.length - 1]).toEqual([DATE2_ISO]) + }) + // Our selected date should be visible... + screen.getByDisplayValue(data.date2) + // ...and stay visible + await expect( + waitFor(() => { + expect(screen.getByDisplayValue(data.date2)).not.toBeVisible() + }) + ).rejects.toThrow(/Received element is visible/) + }) + + it('validates the input', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + const inputField = await screen.findByDisplayValue(data.date1) + + // when + await user.clear(inputField) + await user.keyboard(data.dateInWrongLocale) + + // then + await screen.findByText(data.validationMessage) + }) + + it('allows inputting a date in short format', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test' }, + }) + const inputField = await screen.findByDisplayValue(data.date1) + + // when + await user.clear(inputField) + await user.keyboard(data.dateShort) + + // then + expect(screen.queryByText(data.validationMessage)).not.toBeInTheDocument() + // validation message should not appear + await expect(screen.findByText(data.validationMessage)).rejects.toThrow( + /Unable to find an element with the text/ + ) + }) + + it('autoscrolls forward to the earliest allowable month based on min', async () => { + // given + render(EDatePicker, { + props: { value: '', label: 'test', min: '2111-01-01' }, + }) + const button = await screen.getByLabelText(data.labelText) + + // when + await user.click(button) + + // then + await waitFor(async () => { + expect(await screen.findByText(data.date3Heading)).toBeVisible() + }) + }) + + it('does not autoscroll forward if given a value', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test', min: '2111-01-01' }, + }) + const button = await screen.getByLabelText(data.labelText) + + // when + await user.click(button) + + // then + await expect(async () => { + await screen.findByText(data.date3Heading) + }).rejects.toThrow(/Unable to find an element with the text/) + }) + + it('does not autoscroll backward based on min', async () => { + // given + render(EDatePicker, { + props: { value: '', label: 'test', min: '1999-01-01' }, + }) + const button = await screen.getByLabelText(data.labelText) + + // when + await user.click(button) + + // then + await expect(async () => { + await screen.findByText(data.date4Heading) + }).rejects.toThrow(/Unable to find an element with the text/) + }) + + it('autoscrolls back to the latest allowable month based on max', async () => { + // given + render(EDatePicker, { + props: { value: '', label: 'test', max: '1999-01-01' }, + }) + const button = await screen.getByLabelText(data.labelText) + + // when + await user.click(button) + + // then + await waitFor(async () => { + expect(await screen.findByText(data.date4Heading)).toBeVisible() + }) + }) + + it('does not autoscroll forward based on max', async () => { + // given + render(EDatePicker, { + props: { value: '', label: 'test', max: '2111-01-01' }, + }) + const button = await screen.getByLabelText(data.labelText) + + // when + await user.click(button) + + // then + await expect(async () => { + await screen.findByText(data.date3Heading) + }).rejects.toThrow(/Unable to find an element with the text/) + }) + + it('does not autoscroll backward if given a value', async () => { + // given + render(EDatePicker, { + props: { value: DATE1_ISO, label: 'test', max: '1999-01-01' }, + }) + const button = await screen.getByLabelText(data.labelText) + + // when + await user.click(button) + + // then + await expect(async () => { + await screen.findByText(data.date4Heading) + }).rejects.toThrow(/Unable to find an element with the text/) + }) + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/ENumberField.spec.js b/frontend-old/src/components/form/base/__tests__/ENumberField.spec.js new file mode 100644 index 0000000000..6f2b3c720e --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/ENumberField.spec.js @@ -0,0 +1,133 @@ +import { describe, beforeEach, test, expect } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' + +import formBaseComponents from '@/plugins/formBaseComponents' + +import { mount as mountComponent } from '@vue/test-utils' +import ENumberField from '../ENumberField.vue' +import { screen } from '@testing-library/vue' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An ENumberField', () => { + let vuetify + + const mount = (options) => { + const app = Vue.component('App', { + components: { ENumberField }, + data: function () { + return { + data: null, + } + }, + template: ` +
+ + ${options?.children} + +
+ `, + }) + return mountComponent(app, { vuetify, attachTo: document.body, ...options }) + } + + beforeEach(() => { + vuetify = new Vuetify() + }) + + test('looks like a numberfield', async () => { + const wrapper = mount() + expect(wrapper).toMatchSnapshot('empty') + + await wrapper.setData({ data: 3.14 }) + expect(wrapper).toMatchSnapshot('with text') + }) + + test('updates text when vModel changes', async () => { + const wrapper = mount() + const input = wrapper.find('input').element + expect(input.value).toBeDefined() + + const firstNumber = 0 + await wrapper.setData({ data: firstNumber }) + expect(input.value).toBe(`${firstNumber}`) + + const secondNumber = 3.14 + await wrapper.setData({ data: secondNumber }) + expect(input.value).toBe(`${secondNumber}`) + }) + + test('updates vModel when value of input field changes', async () => { + const wrapper = mount() + const input = wrapper.find('input') + const number = 3.14 + + input.element.value = `${number}` + await input.trigger('input') + + expect(wrapper.vm.data).toBe(number) + }) + + test('updates vModel with null or valid numbers', async () => { + const wrapper = mount() + const input = wrapper.find('input') + + expect(wrapper.vm.data).toBeNull() + + input.element.value = '.' + await input.trigger('input') + expect(wrapper.vm.data).toBeNull() + + input.element.value = '.0' + await input.trigger('input') + expect(wrapper.vm.data).toBeNull() + + input.element.value = '.01' + await input.trigger('input') + expect(wrapper.vm.data).toBe(0.01) + }) + + test.each([ + ['1', 1], + ['1.', 1], + ['1..2', 1.2], + ['39.5.', 39.5], + ["2'000", 2000], + ['8.000.000,20', 8000000.2], + ['10e3', 103], + ['2kg', 2], + ['8,000.20', 8000.2], + ['abc123', 123], + ['Hello, World?', null], + ['eCamp. Super!', null], + ['+123..456..789', 123.456789], + ['-10', -10], + ['2-4 Stück', 24], + ['-0', -0], + ['.', null], + ['.a', null], + ['.a02', 0.02], + ])('parses "%s" as "%s"', async (string, expected) => { + const wrapper = mount() + const input = wrapper.find('input') + + input.element.value = string + await input.trigger('input') + + expect(wrapper.vm.data).toBe(expected) + }) + + test('allows to use the append slot', async () => { + mount({ + children: ` + + `, + }) + + expect(await screen.findByText('append')).toBeVisible() + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/EParseField.spec.js b/frontend-old/src/components/form/base/__tests__/EParseField.spec.js new file mode 100644 index 0000000000..34f09ba6c6 --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/EParseField.spec.js @@ -0,0 +1,109 @@ +import { describe, beforeEach, test, expect } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' + +import formBaseComponents from '@/plugins/formBaseComponents' + +import EParseField from '@/components/form/base/EParseField.vue' +import { mount as mountComponent } from '@vue/test-utils' +import { screen } from '@testing-library/vue' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An EParseField', () => { + let vuetify + + const mount = (options) => { + const app = Vue.component('App', { + components: { EParseField }, + data: function () { + return { + data: null, + } + }, + methods: { + parse: (value) => { + return value === 'true' ? true : value === 'false' ? false : null + }, + format: (value) => { + return value === null ? '' : `${value}` + }, + }, + template: ` +
+ + ${options?.children} + +
+ `, + }) + return mountComponent(app, { vuetify, attachTo: document.body, ...options }) + } + + beforeEach(() => { + vuetify = new Vuetify() + }) + + test('looks like a textfield', async () => { + const wrapper = mount() + expect(wrapper).toMatchSnapshot('empty') + + await wrapper.setData({ data: true }) + expect(wrapper).toMatchSnapshot('with text') + }) + + test('updates text when vModel changes', async () => { + const wrapper = mount() + const input = wrapper.find('input').element + expect(input.value).toBeDefined() + + const firstValue = true + await wrapper.setData({ data: firstValue }) + expect(input.value).toBe(`${firstValue}`) + + const secondValue = false + await wrapper.setData({ data: secondValue }) + expect(input.value).toBe(`${secondValue}`) + }) + + test('updates vModel when value of input field changes', async () => { + const wrapper = mount() + const input = wrapper.find('input') + const value = true + + input.element.value = `${value}` + await input.trigger('input') + + expect(wrapper.vm.data).toBe(value) + }) + + test.each([ + ['true', true], + ['false', false], + ['', null], + ['s', null], + ['0', null], + ['1', null], + ])('parses "%s" as "%s"', async (string, expected) => { + const wrapper = mount() + const input = wrapper.find('input') + + input.element.value = `${string}` + await input.trigger('input') + + expect(wrapper.vm.data).toBe(expected) + }) + + test('allows to use the append slot', async () => { + mount({ + children: ` + + `, + }) + + expect(await screen.findByText('append')).toBeVisible() + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/ESelect.spec.js b/frontend-old/src/components/form/base/__tests__/ESelect.spec.js new file mode 100644 index 0000000000..d44dd7375b --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/ESelect.spec.js @@ -0,0 +1,140 @@ +import { describe, beforeEach, test, expect } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' + +import { formBaseComponents } from '@/plugins' + +import { mount as mountComponent } from '@vue/test-utils' +import ESelect from '../ESelect.vue' +import { screen } from '@testing-library/vue' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An ESelect', () => { + let vuetify + + const FIRST_OPTION = { + value: 1, + text: 'firstOption', + } + const SECOND_OPTION = { + value: '2', + text: 'secondOption', + } + const THIRD_OPTION = { + value: { key: 'value', array: [1, 2, 3], nestedObject: { key: 'value' } }, + text: 'thirdOption', + } + const selectValues = [FIRST_OPTION, SECOND_OPTION, THIRD_OPTION] + + const mount = (options) => { + const app = Vue.component('App', { + components: { ESelect }, + data: function () { + return { + selectValues: selectValues, + data: null, + } + }, + template: ` +
+ + ${options?.children} + +
+ `, + }) + return mountComponent(app, { vuetify, attachTo: document.body, ...options }) + } + + beforeEach(() => { + vuetify = new Vuetify() + }) + test('looks like a dropdown', async () => { + const wrapper = mount() + expect(wrapper).toMatchSnapshot('no item selected') + + await wrapper.find('.v-input__slot').trigger('click') + expect(wrapper).toMatchSnapshot('dropdown open') + + await wrapper.findAll('[role="option"]').at(0).trigger('click') + expect(wrapper).toMatchSnapshot('dropdown closed with selected value') + + await wrapper.find('.v-input__slot').trigger('click') + expect(wrapper).toMatchSnapshot('dropdown open with selected value') + }) + + test('update viewmodel with selected value', async () => { + const wrapper = mount() + expect(wrapper.vm.data).toBeNull() + + await wrapper.find('.v-input__slot').trigger('click') + await wrapper.findAll('[role="option"]').at(0).trigger('click') + expect(wrapper.vm.data).toBe(FIRST_OPTION.value) + + await wrapper.find('.v-input__slot').trigger('click') + await wrapper.findAll('[role="option"]').at(2).trigger('click') + expect(wrapper.vm.data).toBe(THIRD_OPTION.value) + }) + + test('update selected value with viewmodel', async () => { + const wrapper = mount() + + await wrapper.setData({ data: SECOND_OPTION.value }) + expect(wrapper.html()).toContain(SECOND_OPTION.text) + expect(wrapper.html()).not.toContain(FIRST_OPTION.text) + + await wrapper.setData({ data: FIRST_OPTION.value }) + expect(wrapper.html()).toContain(FIRST_OPTION.text) + expect(wrapper.html()).not.toContain(SECOND_OPTION.text) + }) + + test('update selected value after it was open', async () => { + const wrapper = mount() + + await wrapper.find('.v-input__slot').trigger('click') + await wrapper.findAll('[role="option"]').at(0).trigger('click') + expect(wrapper.vm.data).toBe(FIRST_OPTION.value) + + await wrapper.setData({ data: SECOND_OPTION.value }) + expect( + wrapper.findAll('[role="option"]').at(1).element.getAttribute('aria-selected') + ).toBe('true') + expect( + wrapper.findAll('[role="option"]').at(0).element.getAttribute('aria-selected') + ).not.toBe('true') + }) + + test('allows to use the append slot', async () => { + mount({ + children: ` + + `, + }) + + expect(await screen.findByText('append')).toBeVisible() + }) + + test('allows to use the append slot with scope', async () => { + const textText = 'myTestText' + const wrapper = mount({ + children: ` + + `, + }) + + await wrapper.find('.v-input__slot').trigger('click') + + expect(await screen.findAllByText(textText)).toHaveLength(3) + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/ESwitch.spec.js b/frontend-old/src/components/form/base/__tests__/ESwitch.spec.js new file mode 100644 index 0000000000..7ce1b90d9d --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/ESwitch.spec.js @@ -0,0 +1,126 @@ +import { describe, beforeEach, vi, test, expect } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' + +import formBaseComponents from '@/plugins/formBaseComponents' + +import { mount as mountComponent } from '@vue/test-utils' +import ESwitch from '@/components/form/base/ESwitch.vue' +import { touch } from '@/test/util' +import { screen } from '@testing-library/vue' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An ESwitch', () => { + let vuetify + + const mount = (options) => { + const app = Vue.component('App', { + components: { ESwitch }, + data: function () { + return { + data: null, + } + }, + template: ` +
+ + ${options?.children} + +
+ `, + }) + return mountComponent(app, { vuetify, attachTo: document.body, ...options }) + } + beforeEach(() => { + vuetify = new Vuetify() + }) + test('looks like a switch', async () => { + const wrapper = mount() + await wrapper.setData({ data: false }) + expect(wrapper).toMatchSnapshot('unchecked') + + await wrapper.setData({ data: true }) + expect(wrapper).toMatchSnapshot('checked') + }) + + test('is checked when initialized checked', () => { + const wrapper = mount({ + data: function () { + return { + data: true, + } + }, + }) + expect( + wrapper.find('input[type=checkbox]').element.getAttribute('aria-checked') + ).toBe('true') + }) + + test('updates switch when vModel changes', async () => { + const wrapper = mount() + expect( + wrapper.find('input[type=checkbox]').element.getAttribute('aria-checked') + ).toBe('false') + + await wrapper.setData({ data: true }) + expect( + wrapper.find('input[type=checkbox]').element.getAttribute('aria-checked') + ).toBe('true') + + await wrapper.setData({ data: false }) + expect( + wrapper.find('input[type=checkbox]').element.getAttribute('aria-checked') + ).toBe('false') + }) + + test('updates vModel when user toggles with click', async () => { + const wrapper = mount() + const input = wrapper.find('input') + + await input.trigger('click') + expect(wrapper.vm.data).toBe(true) + + await input.trigger('click') + expect(wrapper.vm.data).toBe(false) + }) + + test('updates vModel when user toggles with touch swipe', async () => { + const wrapper = mount() + + touch(wrapper.find('.v-input--selection-controls__ripple')).start(0, 0).end(20, 0) + expect(wrapper.vm.data).toBe(true) + + vi.resetAllMocks() + touch(wrapper.find('.v-input--selection-controls__ripple')).start(0, 0).end(-20, 0) + expect(wrapper.vm.data).toBe(false) + }) + + test('updates vModel when user toggles with keys', async () => { + const wrapper = mount() + const input = wrapper.find('input') + + input.trigger('keydown.right') + expect(wrapper.vm.data).toBe(true) + + input.trigger('keydown.right') + expect(wrapper.vm.data).toBe(true) + + vi.resetAllMocks() + input.trigger('keydown.left') + expect(wrapper.vm.data).toBe(false) + }) + + test('allows to use the append slot', async () => { + mount({ + children: ` + + `, + }) + + expect(await screen.findByText('append')).toBeVisible() + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/ETextArea.spec.js b/frontend-old/src/components/form/base/__tests__/ETextArea.spec.js new file mode 100644 index 0000000000..2f1944903a --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/ETextArea.spec.js @@ -0,0 +1,93 @@ +import { describe, beforeEach, test, expect } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' + +import formBaseComponents from '@/plugins/formBaseComponents' + +import { mount as mountComponent } from '@vue/test-utils' +import ETextarea from '../ETextarea.vue' +import { mockEventClass } from '@/test/mockEventClass' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +mockEventClass('ClipboardEvent') +mockEventClass('DragEvent') + +describe('An ETextArea', () => { + let vuetify + + const multiLineText = ` + Here comes a text + with new lines + and new lines with \n in them + and tags a + ` + + const mount = ( + options, + template = ` +
+ +
+ ` + ) => { + const app = Vue.component('App', { + components: { ETextarea }, + data: () => ({ data: null }), + template: template, + }) + return mountComponent(app, { vuetify, attachTo: document.body, ...options }) + } + beforeEach(() => { + vuetify = new Vuetify() + }) + test('looks like a textarea', async () => { + const wrapper = mount() + expect(wrapper).toMatchSnapshot('notext') + + await wrapper.setData({ data: multiLineText }) + expect(wrapper).toMatchSnapshot('withtext') + + const mountWithMultiLine = mount( + { data: () => ({ data: multiLineText }) }, + ` +
+ +
+ ` + ) + expect(mountWithMultiLine).toMatchSnapshot('multiline') + + const mountAsinControls = mount( + { data: () => ({ data: multiLineText }) }, + ` +
+ +
+ ` + ) + expect(mountAsinControls).toMatchSnapshot('mountAsInControls') + }) + + test('updates the text with the viewmodel', async () => { + const wrapper = mount() + await wrapper.setData({ data: multiLineText }) + const textWithoutMultiLine = multiLineText + .replace(/\n\s*/g, ' ') + .replace(' ', ' ') + .replace('', '') + .replace('', '') + .trim() + expect(wrapper.find('.editor__content').text()).toBe(textWithoutMultiLine) + expect(wrapper.find('.e-form-container').element.getAttribute('value')).toBe( + multiLineText + ) + expect(wrapper.vm.data).toBe(multiLineText) + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/ETextField.spec.js b/frontend-old/src/components/form/base/__tests__/ETextField.spec.js new file mode 100644 index 0000000000..f0efa36c8d --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/ETextField.spec.js @@ -0,0 +1,87 @@ +import { describe, beforeEach, test, expect } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' + +import formBaseComponents from '@/plugins/formBaseComponents' + +import { mount as mountComponent } from '@vue/test-utils' +import ETextField from '../ETextField.vue' +import { screen } from '@testing-library/vue' + +Vue.use(Vuetify) +Vue.use(formBaseComponents) + +describe('An ETextField', () => { + let vuetify + + const mount = (options) => { + const app = Vue.component('App', { + components: { ETextField }, + data: function () { + return { + data: null, + } + }, + template: ` +
+ + ${options?.children} + +
+ `, + }) + return mountComponent(app, { vuetify, attachTo: document.body, ...options }) + } + + beforeEach(() => { + vuetify = new Vuetify() + }) + + test('looks like a textfield', async () => { + const wrapper = mount() + expect(wrapper).toMatchSnapshot('empty') + + await wrapper.setData({ data: 'MyText' }) + expect(wrapper).toMatchSnapshot('with text') + }) + + test('updates text when vModel changes', async () => { + const wrapper = mount() + expect(wrapper.find('.e-form-container').element.getAttribute('value')).toBeNull() + + const firstText = 'myText' + await wrapper.setData({ data: firstText }) + expect(wrapper.find('.e-form-container').element.getAttribute('value')).toBe( + firstText + ) + + const secondText = 'myText2' + await wrapper.setData({ data: secondText }) + expect(wrapper.find('.e-form-container').element.getAttribute('value')).toBe( + secondText + ) + }) + + test('updates vModel when value of input field changes', async () => { + const wrapper = mount() + const input = wrapper.find('input') + const text = 'bla' + + input.element.value = text + await input.trigger('input') + + expect(wrapper.vm.data).toBe(text) + }) + + test('allows to use the append slot', async () => { + mount({ + children: ` + + `, + }) + + expect(await screen.findByText('append')).toBeVisible() + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/ETimeField.spec.js b/frontend-old/src/components/form/base/__tests__/ETimeField.spec.js new file mode 100644 index 0000000000..59c579dc7b --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/ETimeField.spec.js @@ -0,0 +1,51 @@ +import { describe, beforeEach, expect, test } from 'vitest' +import Vue from 'vue' +import Vuetify from 'vuetify' + +import formBaseComponents from '@/plugins/formBaseComponents' +import dayjs from '@/plugins/dayjs.js' + +import ETimeField from '@/components/form/base/ETimeField.vue' +import { mount as mountComponent } from '@vue/test-utils' + +Vue.use(Vuetify) +Vue.use(dayjs) +Vue.use(formBaseComponents) + +describe('An ETimeField', () => { + let vuetify + + const mount = (options) => { + const app = Vue.component('App', { + components: { ETimeField }, + data: function () { + return { + data: null, + } + }, + template: `
`, + }) + return mountComponent(app, { vuetify, attachTo: document.body, ...options }) + } + + beforeEach(() => { + vuetify = new Vuetify() + }) + + test.each([ + ['8', '08:00'], + [' 9 ', '09:00'], + ['2400', null], + ['19,34', '19:34'], + ['19h34', '19:34'], + ['', null], + ])('parses "%s" as "%s"', async (string, expected) => { + const wrapper = mount() + const input = wrapper.find('input') + + input.element.value = `${string}` + await input.trigger('input') + + expect(wrapper.vm.data).toBe(expected) + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/ETimePicker.spec.js b/frontend-old/src/components/form/base/__tests__/ETimePicker.spec.js new file mode 100644 index 0000000000..120a6de719 --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/ETimePicker.spec.js @@ -0,0 +1,357 @@ +import { describe, beforeEach, expect, it } from 'vitest' +import { screen, waitFor } from '@testing-library/vue' +import { render, setTestLocale, snapshotOf } from '@/test/renderWithVuetify.js' +import user from '@testing-library/user-event' +import ETimePicker from '../ETimePicker.vue' + +describe('An ETimePicker', () => { + const TIME1_ISO = '2037-07-18T09:52:00+00:00' + const TIME1_HHMM = '09:52' + const TIME2_ISO = '2037-07-18T18:33:00+00:00' + const TIME3_ISO = '2037-07-18T00:52:00+00:00' + + const localeData = { + de: { + time1: '09:52', + time2: '18:33', + time3: '00:52', + firstHour: '0', + labelText: 'Dialog öffnen, um eine Zeit für test zu wählen', + closeButton: 'Schliessen', + validationMessage: 'Ungültiges Format, bitte gib die Zeit im Format HH:MM ein', + }, + en: { + time1: '9:52 AM', + time2: '6:33 PM', + time3: '12:52 AM', + firstHour: '12', + labelText: 'Open dialog to select a time for test', + closeButton: 'Close', + validationMessage: + 'Invalid format, please enter the time in the format HH:MM AM/PM', + }, + } + + describe.each(Object.entries(localeData))('in locale %s', (locale, data) => { + beforeEach(() => { + setTestLocale(locale) + }) + + it('renders the component', async () => { + // given + + // when + render(ETimePicker, { + props: { + value: TIME1_ISO, + label: 'test', + }, + }) + + // then + await screen.findByDisplayValue(data.time1) + screen.getByLabelText(data.labelText) + }) + + it('looks like a time picker', async () => { + // given + + // when + const { container } = render(ETimePicker, { + props: { value: TIME1_ISO, label: 'test' }, + }) + + // then + expect(snapshotOf(container)).toMatchSnapshot('pickerclosed') + + // when + await user.click(screen.getByLabelText(data.labelText)) + + // then + await screen.findByText(data.closeButton) + expect(snapshotOf(container)).toMatchSnapshot('pickeropen') + }) + + it('allows setting a different valueFormat', async () => { + // given + + // when + render(ETimePicker, { + props: { + value: TIME1_HHMM, + label: 'test', + valueFormat: 'HH:mm', + }, + }) + + // then + await screen.findByDisplayValue(data.time1) + screen.getByLabelText(data.labelText) + }) + + it('does not open the picker when the text field is clicked', async () => { + // given + render(ETimePicker, { + props: { value: TIME1_ISO, label: 'test' }, + }) + const inputField = await screen.findByDisplayValue(data.time1) + + // when + await user.click(inputField) + + // then + // menu should not appear + await expect(screen.findByText(data.closeButton)).rejects.toThrow( + /Unable to find an element with the text/ + ) + }) + + it('opens the picker when the icon button is clicked', async () => { + // given + render(ETimePicker, { + props: { value: TIME1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + + // when + await user.click(button) + + // then + await waitFor(async () => { + expect(await screen.findByText(data.closeButton)).toBeVisible() + }) + }) + + it('closes the picker when clicking the close button', async () => { + // given + render(ETimePicker, { + props: { value: TIME1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByText(data.closeButton)).toBeVisible() + }) + const closeButton = screen.getByText(data.closeButton) + + // when + await user.click(closeButton) + + // then + await waitFor(async () => { + expect(await screen.queryByText(data.closeButton)).not.toBeVisible() + }) + }) + + it('closes the picker when clicking outside', async () => { + // given + render(ETimePicker, { + props: { value: TIME1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByText(data.closeButton)).toBeVisible() + }) + + // when + await user.click(document.body) + + // then + await waitFor(async () => { + expect(await screen.queryByText(data.closeButton)).not.toBeVisible() + }) + }) + + it('closes the picker when pressing escape', async () => { + // given + render(ETimePicker, { + props: { value: TIME1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByText(data.closeButton)).toBeVisible() + }) + + // when + await user.click(document.body) + + // then + await waitFor(async () => { + expect(await screen.queryByText(data.closeButton)).not.toBeVisible() + }) + }) + + it('does not close the picker when selecting a time', async () => { + // given + render(ETimePicker, { + props: { value: TIME1_ISO, label: 'test' }, + }) + const button = await screen.getByLabelText(data.labelText) + await user.click(button) + await waitFor(async () => { + expect(await screen.findByText(data.closeButton)).toBeVisible() + }) + + // when + // Click the 0th hour + await user.click(await screen.findByText(data.firstHour)) + // Click the 45th minute + await user.click(await screen.findByText('45')) + + // then + // close button should stay visible + await expect( + waitFor(() => { + expect(screen.queryByText(data.closeButton)).not.toBeVisible() + }) + ).rejects.toThrow(/Received element is visible/) + }) + + describe('updates v-model when the input field is changed', async () => { + const timeConfig1 = { + iso: TIME1_ISO, + localizedTime: data.time1, + textInput: data.time1, + } + const timeConfig2 = { + iso: TIME2_ISO, + localizedTime: data.time2, + textInput: data.time2, + } + const timeConfig3 = { + iso: TIME3_ISO, + localizedTime: data.time3, + textInput: data.time3, + } + it.each([ + { + from: timeConfig1, + to: timeConfig2, + }, + { + from: timeConfig2, + to: timeConfig1, + }, + { + from: timeConfig1, + to: timeConfig3, + }, + ])( + `from $from.localizedTime to $to.textInput`, + async ({ + from: { iso: fromIso, localizedTime: fromLocalizedTime }, + to: { iso: toIso, localizedTime: toLocalizedTime, textInput }, + }) => { + // given + const { emitted } = render(ETimePicker, { + props: { value: fromIso, label: 'test' }, + }) + const inputField = await screen.findByDisplayValue(fromLocalizedTime) + + // when + await user.clear(inputField) + await user.keyboard(textInput) + + // then + await waitFor(async () => { + const events = emitted().input + // some input events were fired + expect(events.length).toBeGreaterThan(0) + // the last one included the parsed version of our entered time + expect(events[events.length - 1]).toEqual([toIso]) + }) + // Our entered time should be visible... + screen.getByDisplayValue(toLocalizedTime) + // ...and stay visible + await expect( + waitFor(() => { + expect(screen.getByDisplayValue(toLocalizedTime)).not.toBeVisible() + }) + ).rejects.toThrow(/Received element is visible/) + } + ) + }) + + it('updates v-model when a new time is selected in the picker', async () => { + // given + const { emitted } = render(ETimePicker, { + props: { value: TIME1_ISO, label: 'test' }, + }) + await screen.findByDisplayValue(data.time1) + const button = await screen.getByLabelText(data.labelText) + + // when + // click the button to open the picker + await user.click(button) + // Click the 0th hour. We can only click this one, because + // testing library is missing the vuetify styles, and all the + // number elements overlap + await user.click(await screen.findByText(data.firstHour)) + // click the close button + await user.click(screen.getByText(data.closeButton)) + + // then + await waitFor(() => { + expect(screen.queryByText(data.closeButton)).not.toBeVisible() + }) + await waitFor(async () => { + const events = emitted().input + // some input events were fired + expect(events.length).toBeGreaterThan(0) + // the last one included the parsed version of our entered time + expect(events[events.length - 1]).toEqual([TIME3_ISO]) + }) + // Our entered time should be visible... + screen.getByDisplayValue(data.time3) + // ...and stay visible + await expect( + waitFor(() => { + expect(screen.getByDisplayValue(data.time3)).not.toBeVisible() + }) + ).rejects.toThrow(/Received element is visible/) + }) + + describe('validates the input', async () => { + it.each(['not a time', data.time1.replace(':', '/')])('%s', async (textInput) => { + // given + render(ETimePicker, { + props: { value: TIME1_ISO, label: 'test' }, + }) + const inputField = await screen.findByDisplayValue(data.time1) + + // when + await user.clear(inputField) + await user.keyboard(textInput) + + // then + await screen.findByText(data.validationMessage) + }) + }) + + it('works with invalid initialization', async () => { + // given + + // when + render(ETimePicker, { + props: { + value: 'abc', + label: 'test', + }, + }) + + // then + const inputField = await screen.findByDisplayValue('Invalid Date') + + // when + await user.clear(inputField) + await user.keyboard(data.time2) + + // then + waitFor(() => { + expect(screen.queryByText('Invalid Date')).not.toBeInTheDocument() + }) + }) + }) +}) diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/ECheckbox.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/ECheckbox.spec.js.snap new file mode 100644 index 0000000000..033ec7e16c --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/ECheckbox.spec.js.snap @@ -0,0 +1,53 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An ECheckbox > looks like a checkbox > checked 1`] = ` +
+ +
+
+
+
+ + +
+
+ +
+
+
+
+
+`; + +exports[`An ECheckbox > looks like a checkbox > unchecked 1`] = ` +
+ +
+
+
+
+ + +
+
+ +
+
+
+
+
+`; diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/EColorField.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/EColorField.spec.js.snap new file mode 100644 index 0000000000..12dfeb4f69 --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/EColorField.spec.js.snap @@ -0,0 +1,58 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An EColorField > looks like a textfield > empty 1`] = ` +
+
+
+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+
+`; + +exports[`An EColorField > looks like a textfield > with text 1`] = ` +
+
+
+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+
+`; diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/EColorPicker.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/EColorPicker.spec.js.snap new file mode 100644 index 0000000000..641d2e0aee --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/EColorPicker.spec.js.snap @@ -0,0 +1,246 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An EColorPicker > looks like a color picker > pickerclosed 1`] = ` +
+
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+
+ +
+
+
+`; + +exports[`An EColorPicker > looks like a color picker > pickeropen 1`] = ` +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+
+
+ +
+
+ +
+`; diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/EDatePicker.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/EDatePicker.spec.js.snap new file mode 100644 index 0000000000..cf6641369a --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/EDatePicker.spec.js.snap @@ -0,0 +1,815 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An EDatePicker > in locale de > looks like a date picker > pickerclosed 1`] = ` +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+ +
+
+
+`; + +exports[`An EDatePicker > in locale de > looks like a date picker > pickeropen 1`] = ` +
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+
+ +
+
+ +
+`; + +exports[`An EDatePicker > in locale en > looks like a date picker > pickerclosed 1`] = ` +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+ +
+
+
+`; + +exports[`An EDatePicker > in locale en > looks like a date picker > pickeropen 1`] = ` +
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+
+ +
+
+ +
+`; diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/ENumberField.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/ENumberField.spec.js.snap new file mode 100644 index 0000000000..8edadfeef6 --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/ENumberField.spec.js.snap @@ -0,0 +1,43 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An ENumberField > looks like a numberfield > empty 1`] = ` +
+
+
+
+
+
+ + +
+
+
+
+
+
+`; + +exports[`An ENumberField > looks like a numberfield > with text 1`] = ` +
+
+
+
+
+
+ + +
+
+
+
+
+
+`; diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/EParseField.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/EParseField.spec.js.snap new file mode 100644 index 0000000000..cb85b99c7d --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/EParseField.spec.js.snap @@ -0,0 +1,41 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An EParseField > looks like a textfield > empty 1`] = ` +
+
+
+
+
+
+ + +
+
+
+
+
+
+`; + +exports[`An EParseField > looks like a textfield > with text 1`] = ` +
+
+
+
+
+
+ + +
+
+
+
+
+
+`; diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/ESelect.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/ESelect.spec.js.snap new file mode 100644 index 0000000000..31d24d86bb --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/ESelect.spec.js.snap @@ -0,0 +1,272 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An ESelect > looks like a dropdown > dropdown closed with selected value 1`] = ` +
+
+
+
+ +
+
+
+ +
+`; + +exports[`An ESelect > looks like a dropdown > dropdown open 1`] = ` +
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+`; + +exports[`An ESelect > looks like a dropdown > dropdown open with selected value 1`] = ` +
+
+
+
+
+
+ +
+
firstOption
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+`; + +exports[`An ESelect > looks like a dropdown > no item selected 1`] = ` +
+
+
+
+ +
+
+
+
+`; diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/ESwitch.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/ESwitch.spec.js.snap new file mode 100644 index 0000000000..14d8c48196 --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/ESwitch.spec.js.snap @@ -0,0 +1,57 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An ESwitch > looks like a switch > checked 1`] = ` +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+`; + +exports[`An ESwitch > looks like a switch > unchecked 1`] = ` +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+`; diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/ETextArea.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/ETextArea.spec.js.snap new file mode 100644 index 0000000000..9a08f89911 --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/ETextArea.spec.js.snap @@ -0,0 +1,128 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An ETextArea > looks like a textarea > mountAsInControls 1`] = ` +
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+`; + +exports[`An ETextArea > looks like a textarea > multiline 1`] = ` +
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+`; + +exports[`An ETextArea > looks like a textarea > notext 1`] = ` +
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+`; + +exports[`An ETextArea > looks like a textarea > withtext 1`] = ` +
+
+
+
+
+
+ +
+ +
+
+

Here comes a text with new lines and new lines with in them and tags a

+
+
+
+
+
+
+
+
+
+`; diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/ETextField.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/ETextField.spec.js.snap new file mode 100644 index 0000000000..e4d2333125 --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/ETextField.spec.js.snap @@ -0,0 +1,42 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An ETextField > looks like a textfield > empty 1`] = ` +
+
+
+
+
+
+ + +
+
+
+
+
+
+`; + +exports[`An ETextField > looks like a textfield > with text 1`] = ` +
+
+
+
+
+
+ + +
+
+
+
+
+
+`; diff --git a/frontend-old/src/components/form/base/__tests__/__snapshots__/ETimePicker.spec.js.snap b/frontend-old/src/components/form/base/__tests__/__snapshots__/ETimePicker.spec.js.snap new file mode 100644 index 0000000000..d1fd281416 --- /dev/null +++ b/frontend-old/src/components/form/base/__tests__/__snapshots__/ETimePicker.spec.js.snap @@ -0,0 +1,358 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`An ETimePicker > in locale de > looks like a time picker > pickerclosed 1`] = ` +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+ +
+
+
+`; + +exports[`An ETimePicker > in locale de > looks like a time picker > pickeropen 1`] = ` +
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+
+ +
+
+ +
+`; + +exports[`An ETimePicker > in locale en > looks like a time picker > pickerclosed 1`] = ` +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+ +
+
+
+`; + +exports[`An ETimePicker > in locale en > looks like a time picker > pickeropen 1`] = ` +
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+
+ +
+
+ +
+`; diff --git a/frontend-old/src/components/form/tiptap/AutoLinkDecoration.js b/frontend-old/src/components/form/tiptap/AutoLinkDecoration.js new file mode 100644 index 0000000000..667ba03a75 --- /dev/null +++ b/frontend-old/src/components/form/tiptap/AutoLinkDecoration.js @@ -0,0 +1,77 @@ +import { Extension } from '@tiptap/vue-2' +import { Plugin, PluginKey } from '@tiptap/pm/state' +import { Decoration, DecorationSet } from '@tiptap/pm/view' +import LinkifyIt from 'linkify-it' + +export const AutoLinkKey = new PluginKey('autoLinkDecoration') + +export const AutoLinkDecoration = Extension.create({ + name: 'autoLinkDecoration', + addProseMirrorPlugins() { + const linkify = new LinkifyIt() + /** + * @param {import('prosemirror-model').Node} doc + */ + const urlDecoration = (doc) => { + const decorations = [] + doc.descendants((node, pos) => { + if (node.isText && linkify.pretest(node.text)) { + const matches = linkify.match(node.text) + matches?.forEach(({ index, lastIndex, url }) => { + if (url.charAt(0) === '/') { + return + } + let link + try { + link = new URL(url) + } catch { + /* It can't be parsed as an url */ + } + if (!link.host.includes('.') && !link.port) { + return + } + if (!['http:', 'https:'].includes(link.protocol)) { + return + } + const attrs = { + nodeName: 'a', + href: url, + class: 'autolink', + target: '_blank', + rel: 'noopener noreferrer', + } + if (this.editor.isEditable) { + attrs.onclick = `(event.metaKey || event.ctrlKey || event.detail > 1) && window.open("${link}", "_blank");` + } + decorations.push( + Decoration.inline(pos + index, pos + lastIndex, attrs, { + start: pos + index, + end: pos + lastIndex, + }) + ) + }) + } + }) + return DecorationSet.create(doc, decorations) + } + + return [ + new Plugin({ + key: AutoLinkKey, + state: { + init: (_, { doc }) => { + return urlDecoration(doc) + }, + apply: (tr, oldState) => { + return tr.docChanged ? urlDecoration(tr.doc) : oldState + }, + }, + props: { + decorations(state) { + return this.getState(state) + }, + }, + }), + ] + }, +}) diff --git a/frontend-old/src/components/form/tiptap/TiptapEditor.vue b/frontend-old/src/components/form/tiptap/TiptapEditor.vue new file mode 100644 index 0000000000..fffe75849f --- /dev/null +++ b/frontend-old/src/components/form/tiptap/TiptapEditor.vue @@ -0,0 +1,394 @@ + + + + diff --git a/frontend-old/src/components/form/tiptap/TiptapToolbarButton.vue b/frontend-old/src/components/form/tiptap/TiptapToolbarButton.vue new file mode 100644 index 0000000000..8d22690a42 --- /dev/null +++ b/frontend-old/src/components/form/tiptap/TiptapToolbarButton.vue @@ -0,0 +1,13 @@ + + diff --git a/frontend-old/src/components/form/tiptap/VTiptapEditor.vue b/frontend-old/src/components/form/tiptap/VTiptapEditor.vue new file mode 100644 index 0000000000..a831997d77 --- /dev/null +++ b/frontend-old/src/components/form/tiptap/VTiptapEditor.vue @@ -0,0 +1,87 @@ + + + diff --git a/frontend-old/src/components/generic/AvatarRow.vue b/frontend-old/src/components/generic/AvatarRow.vue new file mode 100644 index 0000000000..087e70b676 --- /dev/null +++ b/frontend-old/src/components/generic/AvatarRow.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/frontend-old/src/components/generic/CategoryChip.vue b/frontend-old/src/components/generic/CategoryChip.vue new file mode 100644 index 0000000000..869c333270 --- /dev/null +++ b/frontend-old/src/components/generic/CategoryChip.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/frontend-old/src/components/generic/ClipboardInfoDialog.vue b/frontend-old/src/components/generic/ClipboardInfoDialog.vue new file mode 100644 index 0000000000..497ae9d21c --- /dev/null +++ b/frontend-old/src/components/generic/ClipboardInfoDialog.vue @@ -0,0 +1,87 @@ + + + diff --git a/frontend-old/src/components/generic/DetailPane.vue b/frontend-old/src/components/generic/DetailPane.vue new file mode 100644 index 0000000000..2b0185cc5a --- /dev/null +++ b/frontend-old/src/components/generic/DetailPane.vue @@ -0,0 +1,40 @@ + + + diff --git a/frontend-old/src/components/generic/GenericChip.vue b/frontend-old/src/components/generic/GenericChip.vue new file mode 100644 index 0000000000..ea18b308cd --- /dev/null +++ b/frontend-old/src/components/generic/GenericChip.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/frontend-old/src/components/generic/GenericPage.vue b/frontend-old/src/components/generic/GenericPage.vue new file mode 100644 index 0000000000..3faea56de5 --- /dev/null +++ b/frontend-old/src/components/generic/GenericPage.vue @@ -0,0 +1,26 @@ + + + diff --git a/frontend-old/src/components/generic/IconWithTooltip.vue b/frontend-old/src/components/generic/IconWithTooltip.vue new file mode 100644 index 0000000000..6ebfc0f2af --- /dev/null +++ b/frontend-old/src/components/generic/IconWithTooltip.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/frontend-old/src/components/generic/LockButton.vue b/frontend-old/src/components/generic/LockButton.vue new file mode 100644 index 0000000000..6781835859 --- /dev/null +++ b/frontend-old/src/components/generic/LockButton.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/frontend-old/src/components/generic/LockUnlockListItem.vue b/frontend-old/src/components/generic/LockUnlockListItem.vue new file mode 100644 index 0000000000..93147d8cdb --- /dev/null +++ b/frontend-old/src/components/generic/LockUnlockListItem.vue @@ -0,0 +1,27 @@ + + + diff --git a/frontend-old/src/components/generic/useClipboardEntity.js b/frontend-old/src/components/generic/useClipboardEntity.js new file mode 100644 index 0000000000..2ca7e74604 --- /dev/null +++ b/frontend-old/src/components/generic/useClipboardEntity.js @@ -0,0 +1,89 @@ +import { computed, ref } from 'vue' + +export function useClipboardEntity({ + fetchClipboardEntity, + onEntityLoaded, + onEntityLoadFailed, +}) { + const clipboardPermission = ref('unknown') + const clipboardEntity = ref(null) + const _clipoardEntityUrl = ref(null) + const loading = ref(false) + + const clipboardEntityUrl = computed({ + get() { + return _clipoardEntityUrl.value + }, + set: setClipboardEntityUrl, + }) + + async function setClipboardEntityUrl(url) { + loading.value = true + _clipoardEntityUrl.value = url + + return fetchClipboardEntity(url) + .then((entityProxy) => { + if (entityProxy == null) return Promise.reject('not found') + return entityProxy?._meta.load + }) + .then((entity) => { + clipboardEntity.value = entity + onEntityLoaded(entity) + loading.value = false + }) + .catch(() => { + clipboardEntity.value = null + onEntityLoadFailed(url) + loading.value = false + }) + } + + const clipboardAccessDenied = computed(() => { + return ( + clipboardPermission.value === 'unaccessible' || + clipboardPermission.value === 'denied' + ) + }) + + const showClipboardPrompt = computed(() => clipboardPermission.value === 'prompt') + + const hasClipboardEntity = computed(() => { + return clipboardEntity.value != null && clipboardEntity.value._meta.self != null + }) + + const attemptLoadingEntityFromClipboard = async () => { + clipboardEntity.value = null + return navigator.permissions + .query({ name: 'clipboard-read' }) + .then(async (p) => { + clipboardPermission.value = p.state + if (p.state === 'granted') { + const url = await navigator.clipboard.readText() + if (url) return setClipboardEntityUrl(url) + } + // If we get here, we have failed to get the url from the clipboard + onEntityLoadFailed(null) + }) + .catch(() => { + clipboardPermission.value = 'unaccessible' + console.warn('clipboard permission not requestable') + }) + } + + const clearClipboard = async () => { + await navigator.clipboard.writeText('') + attemptLoadingEntityFromClipboard() + } + + return { + clipboardAccessDenied, + showClipboardPrompt, + hasClipboardEntity, + clipboardEntity, + clipboardEntityUrl, + clipboardEntityLoading: loading, + attemptLoadingEntityFromClipboard, + setClipboardEntityUrl, + clearClipboard, + } +} diff --git a/frontend-old/src/components/layout/AuthContainer.vue b/frontend-old/src/components/layout/AuthContainer.vue new file mode 100644 index 0000000000..3a47f90c4c --- /dev/null +++ b/frontend-old/src/components/layout/AuthContainer.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/frontend-old/src/components/layout/ContentActions.vue b/frontend-old/src/components/layout/ContentActions.vue new file mode 100644 index 0000000000..628f58f75e --- /dev/null +++ b/frontend-old/src/components/layout/ContentActions.vue @@ -0,0 +1,13 @@ + + + diff --git a/frontend-old/src/components/layout/ContentCard.vue b/frontend-old/src/components/layout/ContentCard.vue new file mode 100644 index 0000000000..16d5705f00 --- /dev/null +++ b/frontend-old/src/components/layout/ContentCard.vue @@ -0,0 +1,78 @@ + + + + + + + + + diff --git a/frontend-old/src/components/layout/ContentGroup.vue b/frontend-old/src/components/layout/ContentGroup.vue new file mode 100644 index 0000000000..809d4ce4c1 --- /dev/null +++ b/frontend-old/src/components/layout/ContentGroup.vue @@ -0,0 +1,48 @@ + + + + + + + diff --git a/frontend-old/src/components/layout/HorizontalRule.vue b/frontend-old/src/components/layout/HorizontalRule.vue new file mode 100644 index 0000000000..5979df154d --- /dev/null +++ b/frontend-old/src/components/layout/HorizontalRule.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/frontend-old/src/components/layout/IconSpacer.vue b/frontend-old/src/components/layout/IconSpacer.vue new file mode 100644 index 0000000000..6340c82a7e --- /dev/null +++ b/frontend-old/src/components/layout/IconSpacer.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/frontend-old/src/components/layout/LanguageSwitcher.vue b/frontend-old/src/components/layout/LanguageSwitcher.vue new file mode 100644 index 0000000000..c63b12d083 --- /dev/null +++ b/frontend-old/src/components/layout/LanguageSwitcher.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/frontend-old/src/components/layout/SidebarListItem.vue b/frontend-old/src/components/layout/SidebarListItem.vue new file mode 100644 index 0000000000..2982b3edb5 --- /dev/null +++ b/frontend-old/src/components/layout/SidebarListItem.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/frontend-old/src/components/layout/TextAlignBaseline.vue b/frontend-old/src/components/layout/TextAlignBaseline.vue new file mode 100644 index 0000000000..d28a2c7c3b --- /dev/null +++ b/frontend-old/src/components/layout/TextAlignBaseline.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/frontend-old/src/components/material/DialogMaterialItemCreate.vue b/frontend-old/src/components/material/DialogMaterialItemCreate.vue new file mode 100644 index 0000000000..ded58f7e9e --- /dev/null +++ b/frontend-old/src/components/material/DialogMaterialItemCreate.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/frontend-old/src/components/material/DialogMaterialItemEdit.vue b/frontend-old/src/components/material/DialogMaterialItemEdit.vue new file mode 100644 index 0000000000..c47530a7fd --- /dev/null +++ b/frontend-old/src/components/material/DialogMaterialItemEdit.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/frontend-old/src/components/material/DialogMaterialItemForm.vue b/frontend-old/src/components/material/DialogMaterialItemForm.vue new file mode 100644 index 0000000000..3a52631509 --- /dev/null +++ b/frontend-old/src/components/material/DialogMaterialItemForm.vue @@ -0,0 +1,46 @@ + + + diff --git a/frontend-old/src/components/material/MaterialCreateItem.vue b/frontend-old/src/components/material/MaterialCreateItem.vue new file mode 100644 index 0000000000..b235c06dc8 --- /dev/null +++ b/frontend-old/src/components/material/MaterialCreateItem.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/frontend-old/src/components/material/MaterialLists.vue b/frontend-old/src/components/material/MaterialLists.vue new file mode 100644 index 0000000000..1dbede490a --- /dev/null +++ b/frontend-old/src/components/material/MaterialLists.vue @@ -0,0 +1,100 @@ + + + diff --git a/frontend-old/src/components/material/MaterialListsEdit.vue b/frontend-old/src/components/material/MaterialListsEdit.vue new file mode 100644 index 0000000000..2bfbe50cef --- /dev/null +++ b/frontend-old/src/components/material/MaterialListsEdit.vue @@ -0,0 +1,42 @@ + + diff --git a/frontend-old/src/components/material/MaterialTable.vue b/frontend-old/src/components/material/MaterialTable.vue new file mode 100644 index 0000000000..acfa08dd14 --- /dev/null +++ b/frontend-old/src/components/material/MaterialTable.vue @@ -0,0 +1,536 @@ + + + + + diff --git a/frontend-old/src/components/material/PeriodMaterialLists.vue b/frontend-old/src/components/material/PeriodMaterialLists.vue new file mode 100644 index 0000000000..8bbcad20a5 --- /dev/null +++ b/frontend-old/src/components/material/PeriodMaterialLists.vue @@ -0,0 +1,40 @@ + + + diff --git a/frontend-old/src/components/material/ScheduleEntryLinks.vue b/frontend-old/src/components/material/ScheduleEntryLinks.vue new file mode 100644 index 0000000000..394679943d --- /dev/null +++ b/frontend-old/src/components/material/ScheduleEntryLinks.vue @@ -0,0 +1,85 @@ + + + diff --git a/frontend-old/src/components/material/__tests__/shortScheduleEntryDescription.spec.js b/frontend-old/src/components/material/__tests__/shortScheduleEntryDescription.spec.js new file mode 100644 index 0000000000..fa9c67a8ba --- /dev/null +++ b/frontend-old/src/components/material/__tests__/shortScheduleEntryDescription.spec.js @@ -0,0 +1,40 @@ +import { describe, expect, it } from 'vitest' +import shortScheduleEntryDescription from '../shortScheduleEntryDescription.js' +import createI18n from '@/components/print/print-client/i18n.js' +import { i18n } from '@/plugins/i18n' + +describe('shortScheduleEntryDescription', () => { + const { translate } = createI18n(i18n.messages, 'en') + const tc = (key, _count, params) => translate(key, params) + + it.each([ + [{ _meta: { loading: true } }, ''], + [null, ''], + [undefined, ''], + [ + { + _meta: { loading: false }, + number: '1.2', + activity: () => ({ + title: 'foo', + }), + dayNumber: '3', + }, + '1.2', + ], + [ + { + _meta: { loading: false }, + number: '', + activity: () => ({ + title: 'foo', + }), + dayNumber: '3', + start: '2024-01-01T10:00:00+00:00', + }, + 'day 3 10:00', + ], + ])('maps %o to "%s"', (input, expected) => { + expect(shortScheduleEntryDescription(input, tc)).toEqual(expected) + }) +}) diff --git a/frontend-old/src/components/material/__tests__/useMaterialViewHelper.spec.js b/frontend-old/src/components/material/__tests__/useMaterialViewHelper.spec.js new file mode 100644 index 0000000000..caa5011797 --- /dev/null +++ b/frontend-old/src/components/material/__tests__/useMaterialViewHelper.spec.js @@ -0,0 +1,51 @@ +import { describe, expect, it } from 'vitest' +import { toWorkbook } from '@/components/material/useMaterialViewHelper.js' + +describe('toWorkBook', () => { + it('replaces invalid characters', () => { + const sheets = createSheets('s?h*e[]e/t:1:') + + const workbook = toWorkbook(sheets) + + expect(workbook.SheetNames).toEqual(['sheet1']) + }) + + it('shortens sheets names with more than 31 characters', () => { + const sheetName = 'a'.repeat(32) + const sheets = createSheets(sheetName) + + const workbook = toWorkbook(sheets) + + expect(workbook.SheetNames).toEqual([sheetName.slice(0, 31)]) + }) + + it('does not overwrite sheets when shortening them makes them not unique anymore', () => { + const sheets = [ + ...createSheets('a'.repeat(32)), + ...createSheets('a'.repeat(33)), + ...createSheets('a'.repeat(34)), + ] + const workbook = toWorkbook(sheets) + + expect(Object.entries(workbook.Sheets)).toHaveLength(sheets.length) + expect(workbook.SheetNames.filter((name) => name.length > 31)).toEqual([]) + }) + + it('does not overwrite sheets when they have the same name', () => { + const sheets = [...createSheets('sheet1'), ...createSheets('sheet1')] + const workbook = toWorkbook(sheets) + + expect(Object.entries(workbook.Sheets)).toHaveLength(sheets.length) + }) +}) + +const data = [['row1']] + +function createSheets(sheetName) { + return [ + { + sheetName: sheetName, + data, + }, + ] +} diff --git a/frontend-old/src/components/material/shortScheduleEntryDescription.js b/frontend-old/src/components/material/shortScheduleEntryDescription.js new file mode 100644 index 0000000000..7eedb20b9b --- /dev/null +++ b/frontend-old/src/components/material/shortScheduleEntryDescription.js @@ -0,0 +1,13 @@ +import { hourShort } from '@/common/helpers/dateHelperUTCFormatted.js' + +export default function shortScheduleEntryDescription(scheduleEntry, tc) { + if (!scheduleEntry || scheduleEntry._meta.loading) return '' + return ( + scheduleEntry?.number || + // For numbering style "none", display the activity title and day number instead + tc('global.shortScheduleEntryDescription', 1, { + dayNumber: scheduleEntry.dayNumber, + startTime: hourShort(scheduleEntry.start, tc), + }) + ) +} diff --git a/frontend-old/src/components/material/useMaterialViewHelper.js b/frontend-old/src/components/material/useMaterialViewHelper.js new file mode 100644 index 0000000000..4ce39712ea --- /dev/null +++ b/frontend-old/src/components/material/useMaterialViewHelper.js @@ -0,0 +1,164 @@ +import { computed, onMounted, ref } from 'vue' +import { useRoute } from 'vue-router/composables' +import * as XLSX from 'xlsx' +import { slugify } from '@/plugins/slugify.js' +import i18n from '@/plugins/i18n/index.js' +import dayjs from '@/common/helpers/dayjs.js' +import { campShortTitle } from '@/common/helpers/campShortTitle.js' +import { apiStore } from '@/plugins/store/index.js' +import { materialListFromRoute } from '@/router.js' +import shortScheduleEntryDescription from './shortScheduleEntryDescription.js' + +function generateFilename(camp, materialList) { + const description = materialList + ? [i18n.tc('components.material.useMaterialViewHelper.detail'), materialList] + : [i18n.tc('components.material.useMaterialViewHelper.overview')] + const filename = [campShortTitle(camp), ...description].map(slugify) + return [...filename, dayjs().format('YYMMDDHHmmss')].join('_') + '.xlsx' +} + +async function getActivity(camp, materialItem) { + if (!materialItem.materialNode) { + return null + } + const root = await materialItem.materialNode().$href('root') + return camp + .activities() + .items.find((activity) => activity.rootContentNode()._meta.self === root) +} + +async function getSheets(camp, collection, materialList) { + return await Promise.all( + collection.map(async ({ period, materialItems }) => { + const data = [ + [ + `${ + materialList ?? i18n.tc('components.material.useMaterialViewHelper.overview') + }: ${period.description}`, + ], + [ + i18n.tc('entity.materialItem.fields.quantity'), + i18n.tc('entity.materialItem.fields.unit'), + i18n.tc('entity.materialItem.fields.article'), + ...(!materialList ? [i18n.tc('entity.materialItem.fields.list')] : []), + i18n.tc('entity.materialItem.fields.reference'), + ], + ] + await Promise.all( + materialItems.items.map(async (materialItem) => { + const activity = await getActivity(camp, materialItem) + const scheduleEntries = activity + ?.scheduleEntries() + .items.map((item) => shortScheduleEntryDescription(item, i18n.tc.bind(i18n))) + .join(', ') + data.push([ + materialItem.quantity, + materialItem.unit, + materialItem.article, + ...(!materialList ? [materialItem.materialList?.().name] : []), + activity?.title + ? `${activity.category().short} ${activity?.title}: ${scheduleEntries}` + : period.description, + ]) + }) + ) + return { sheetName: period.description, data } + }) + ) +} + +function randomString(len) { + const p = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + return [...Array(len)].reduce((a) => a + p[~~(Math.random() * p.length)], '') +} + +/** + * @param sheets {array} array of {sheetName: string, data: array} + * @returns {object} an XLSX workbook + */ +export function toWorkbook(sheets) { + const workbook = XLSX.utils.book_new() + sheets.forEach(({ sheetName, data }) => { + const worksheet = XLSX.utils.aoa_to_sheet(data) + const validSheetName = sheetName.replaceAll(/[?*[\]/\\:]/g, '') + let slicedSheetName = validSheetName.slice(0, 31) + if (workbook.SheetNames.includes(slicedSheetName)) { + slicedSheetName = validSheetName.slice(0, 28) + randomString(3) + } + workbook.SheetNames.push(slicedSheetName) + workbook.Sheets[slicedSheetName] = worksheet + }) + return workbook +} + +/** + * @param {object} camp + * @param {{value: {period: object, materialItems: {items: array}}[]}} collection + * @param {string} materialList materialList name if set + */ +function downloadMaterialList(camp, collection, materialList) { + return async () => { + await camp.activities().$loadItems() + + const sheets = await getSheets(camp, collection.value, materialList) + const workbook = toWorkbook(sheets) + XLSX.writeFile(workbook, generateFilename(camp, materialList)) + } +} + +function loadPeriods(camp) { + const openPeriods = ref([]) + + camp.periods()._meta.load.then((period) => + period.items.forEach((period, index) => { + if (Date.parse(period.end) >= Date.now()) { + openPeriods.value.push(index) + } + }) + ) + + return openPeriods +} + +/** + * @param {Object} camp + * @param {boolean} [list] + */ +export function useMaterialViewHelper(camp, list) { + const computedList = computed(() => (list ? materialListFromRoute(useRoute()) : null)) + + const collection = computed(() => { + const materialList = computedList.value?._meta.self + return camp.periods().items.map((period) => ({ + period, + materialItems: apiStore.get().materialItems({ + period: period._meta.self, + materialList, + }), + })) + }) + + const downloadXlsx = downloadMaterialList(camp, collection, computedList.value?.name) + const openPeriods = loadPeriods(camp) + + onMounted(async () => { + await Promise.all([ + apiStore + .get() + .contentNodes({ + isRoot: 'true', + camp: camp._meta.self, + }) + .$loadItems(), + ...collection.value.map(({ materialItems }) => materialItems.$reload()), + camp.categories().$loadItems(), + ]) + }) + + return { + collection, + downloadXlsx, + downloadMaterialList, + openPeriods, + } +} diff --git a/frontend-old/src/components/navigation/Logo.vue b/frontend-old/src/components/navigation/Logo.vue new file mode 100644 index 0000000000..5612890004 --- /dev/null +++ b/frontend-old/src/components/navigation/Logo.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend-old/src/components/navigation/SideBar.vue b/frontend-old/src/components/navigation/SideBar.vue new file mode 100644 index 0000000000..8e80346fcb --- /dev/null +++ b/frontend-old/src/components/navigation/SideBar.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/frontend-old/src/components/navigation/UserMeta.vue b/frontend-old/src/components/navigation/UserMeta.vue new file mode 100644 index 0000000000..6eefa15abd --- /dev/null +++ b/frontend-old/src/components/navigation/UserMeta.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/frontend-old/src/components/personal_invitations/DialogPersonalInvitationReject.vue b/frontend-old/src/components/personal_invitations/DialogPersonalInvitationReject.vue new file mode 100644 index 0000000000..5a22f40878 --- /dev/null +++ b/frontend-old/src/components/personal_invitations/DialogPersonalInvitationReject.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/frontend-old/src/components/personal_invitations/PersonalInvitations.vue b/frontend-old/src/components/personal_invitations/PersonalInvitations.vue new file mode 100644 index 0000000000..4ad264aa70 --- /dev/null +++ b/frontend-old/src/components/personal_invitations/PersonalInvitations.vue @@ -0,0 +1,137 @@ + + diff --git a/frontend-old/src/components/print/PrintConfigurator.vue b/frontend-old/src/components/print/PrintConfigurator.vue new file mode 100644 index 0000000000..72e1498e44 --- /dev/null +++ b/frontend-old/src/components/print/PrintConfigurator.vue @@ -0,0 +1,315 @@ + + + + + diff --git a/frontend-old/src/components/print/__tests__/repairPrintConfig.spec.js b/frontend-old/src/components/print/__tests__/repairPrintConfig.spec.js new file mode 100644 index 0000000000..e6ef25191d --- /dev/null +++ b/frontend-old/src/components/print/__tests__/repairPrintConfig.spec.js @@ -0,0 +1,4163 @@ +import { describe, test, expect } from 'vitest' +import repairConfig from '../repairPrintConfig.js' +import PicassoConfig from '../config/PicassoConfig.vue' +import ActivityConfig from '../config/ActivityConfig.vue' +import CoverConfig from '../config/CoverConfig.vue' +import ProgramConfig from '../config/ProgramConfig.vue' +import StoryConfig from '../config/StoryConfig.vue' +import SafetyConsiderationsConfig from '../config/SafetyConsiderationsConfig.vue' +import TocConfig from '../config/TocConfig.vue' +import ActivityListConfig from '../config/ActivityListConfig.vue' + +describe('repairConfig', () => { + const camp = { + _meta: { self: '/camps/1a2b3c4d' }, + shortTitle: 'test camp', + periods: () => ({ + items: [ + { + _meta: { self: '/periods/1a2b3c4d' }, + days: () => ({ + items: [ + { + _meta: { self: '/days/1a2b3c4d' }, + }, + ], + }), + }, + ], + }), + categories: () => ({ + items: [ + { + _meta: { self: '/categories/1a2b3c4d' }, + }, + ], + }), + campCollaborations: () => ({ + items: [ + { + _meta: { self: '/camp_collaborations/1a2b3c4d' }, + }, + ], + }), + progressLabels: () => ({ + items: [ + { + _meta: { self: '/progress_labels/1a2b3c4d' }, + }, + ], + }), + } + const multiPeriodCamp = { + ...camp, + periods: () => ({ + items: [ + { + _meta: { self: '/periods/1a2b3c4d' }, + days: () => ({ + items: [ + { + _meta: { self: '/days/1a2b3c4d' }, + }, + ], + }), + }, + { + _meta: { self: '/periods/11223344' }, + days: () => ({ + items: [ + { + _meta: { self: '/days/bbbbbbbb' }, + }, + ], + }), + }, + ], + }), + } + const availableLocales = ['en-GB', 'de-CH', 'de-CH-scout'] + const componentRepairers = Object.fromEntries( + [ + ActivityConfig, + CoverConfig, + PicassoConfig, + ProgramConfig, + SafetyConsiderationsConfig, + StoryConfig, + TocConfig, + ActivityListConfig, + ].map((component) => [component.name.replace(/Config$/, ''), component.repairConfig]) + ) + const defaultFilter = { + period: null, + day: [], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + } + const defaultContents = [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ] + const args = [camp, availableLocales, 'en', componentRepairers, defaultContents] + const multiPeriodArgs = [ + multiPeriodCamp, + availableLocales, + 'en', + componentRepairers, + defaultContents, + ] + + test('fills empty config with default data', async () => { + // given + const config = {} + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('leaves valid config alone', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('allows valid language', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'de-CH-scout', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'de-CH-scout', + }) + }) + + test('replaces invalid language with fallback language', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'definitely-not-a-supported-language', + } + + // when + const result = repairConfig( + config, + camp, + availableLocales, + 'de-CH-scout', + componentRepairers, + defaultContents + ) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'de-CH-scout', + }) + }) + + test('replaces invalid language with any valid language if fallback language is also invalid', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'definitely-not-a-supported-language', + } + + // when + const result = repairConfig( + config, + camp, + availableLocales, + 'definitely-not-a-valid-language', + componentRepairers, + defaultContents + ) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('leaves custom documentName alone', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'foobar', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'foobar', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('fills in missing documentName', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: '', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('overwrites camp URI', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d?something', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('overwrites invalid contents with default', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: {}, + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('overwrites null contents with default', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: null, + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('leaves empty content alone', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('filters out unknown content', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SomethingUnsupported', + options: {}, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + describe('activity', () => { + test('leaves config alone', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Activity', + foo: 'bar', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Activity', + foo: 'bar', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + }) + + describe('cover', () => { + test('leaves config alone', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Cover', + foo: 'bar', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Cover', + foo: 'bar', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + }) + + describe('picasso', () => { + test('adds missing options', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('allows landscape mode', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('allows portrait mode', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'P', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'P', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('allows empty periods', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { periods: [], orientation: 'L', filter: defaultFilter }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...multiPeriodArgs) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { periods: [], orientation: 'L', filter: defaultFilter }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('does not allow empty periods if there is only one period in the camp', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { periods: [], orientation: 'L', filter: defaultFilter }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('overwrites invalid orientation', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'hello', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('filters out unknown periods', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/11112222', '/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Picasso', + options: { + periods: ['/periods/1a2b3c4d'], + orientation: 'L', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + }) + + describe('program', () => { + test('adds missing options', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: true, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds missing dayOverview flag', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: true, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('allows dayOverview false', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('allows empty periods', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: [], + dayOverview: true, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...multiPeriodArgs) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: [], + dayOverview: true, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('does not allow empty periods if there is only one period in the camp', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: true, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: true, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('filters out unknown periods', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/11112222', '/periods/1a2b3c4d'], + dayOverview: true, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: true, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + describe('filter', () => { + test('leaves valid filter as is', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: '/periods/1a2b3c4d', + day: ['/days/1a2b3c4d'], + category: ['/categories/1a2b3c4d'], + progressLabel: ['/progress_labels/1a2b3c4d'], + responsible: ['/camp_collaborations/1a2b3c4d'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: '/periods/1a2b3c4d', + day: ['/days/1a2b3c4d'], + category: ['/categories/1a2b3c4d'], + progressLabel: ['/progress_labels/1a2b3c4d'], + responsible: ['/camp_collaborations/1a2b3c4d'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds default filter if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds period if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + day: [], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid period', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: '/periods/00000000', + day: [], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds responsible filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid responsible', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + responsible: ['/camp_collaborations/00000000'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds category filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: null, + day: [], + responsible: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid category', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: null, + day: [], + category: ['/categories/00000000'], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds day filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: null, + category: [], + responsible: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid day', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: null, + day: ['/days/00000000'], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds progressLabel filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: null, + day: [], + category: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid progressLabel', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: null, + day: [], + category: [], + progressLabel: ['/progress_labels/00000000'], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds dummy activityCount if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + responsible: [], + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Program', + options: { + periods: ['/periods/1a2b3c4d'], + dayOverview: false, + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + }) + }) + + describe('story', () => { + test('adds missing options', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('allows empty periods', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { periods: [], contentType: 'Storycontext', filter: defaultFilter }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...multiPeriodArgs) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { periods: [], contentType: 'Storycontext', filter: defaultFilter }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('does not allow empty periods if there is only one period in the camp', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('filters out unknown periods', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/11112222', '/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('uses known contentType', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storyboard', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + describe('filter', () => { + test('leaves valid filter as is', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: '/periods/1a2b3c4d', + day: ['/days/1a2b3c4d'], + category: ['/categories/1a2b3c4d'], + progressLabel: ['/progress_labels/1a2b3c4d'], + responsible: ['/camp_collaborations/1a2b3c4d'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: '/periods/1a2b3c4d', + day: ['/days/1a2b3c4d'], + category: ['/categories/1a2b3c4d'], + progressLabel: ['/progress_labels/1a2b3c4d'], + responsible: ['/camp_collaborations/1a2b3c4d'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds default filter if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds period if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + day: [], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid period', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: '/periods/00000000', + day: [], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds responsible filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid responsible', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + responsible: ['/camp_collaborations/00000000'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds category filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: null, + day: [], + responsible: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid category', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: null, + day: [], + category: ['/categories/00000000'], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds day filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: null, + category: [], + responsible: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid day', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: null, + day: ['/days/00000000'], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds progressLabel filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: null, + day: [], + category: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid progressLabel', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: null, + day: [], + category: [], + progressLabel: ['/progress_labels/00000000'], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds dummy activityCount if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + responsible: [], + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Story', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storycontext', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + }) + }) + + describe('safetyConsiderations', () => { + test('adds missing options', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('allows empty periods', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: [], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...multiPeriodArgs) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: [], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('does not allow empty period when there is only one period in the camp', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: [], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('filters out unknown periods', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/11112222', '/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('uses known contentType', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'Storyboard', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + describe('filter', () => { + test('leaves valid filter as is', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: '/periods/1a2b3c4d', + day: ['/days/1a2b3c4d'], + category: ['/categories/1a2b3c4d'], + progressLabel: ['/progress_labels/1a2b3c4d'], + responsible: ['/camp_collaborations/1a2b3c4d'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: '/periods/1a2b3c4d', + day: ['/days/1a2b3c4d'], + category: ['/categories/1a2b3c4d'], + progressLabel: ['/progress_labels/1a2b3c4d'], + responsible: ['/camp_collaborations/1a2b3c4d'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds default filter if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds period if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + day: [], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid period', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: '/periods/00000000', + day: [], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds responsible filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid responsible', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + responsible: ['/camp_collaborations/00000000'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds category filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: null, + day: [], + responsible: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid category', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: null, + day: [], + category: ['/categories/00000000'], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds day filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: null, + category: [], + responsible: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid day', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: null, + day: ['/days/00000000'], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds progressLabel filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: null, + day: [], + category: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid progressLabel', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: null, + day: [], + category: [], + progressLabel: ['/progress_labels/00000000'], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds dummy activityCount if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + responsible: [], + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'SafetyConsiderations', + options: { + periods: ['/periods/1a2b3c4d'], + contentType: 'SafetyConsiderations', + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + }) + }) + + describe('toc', () => { + test('leaves config alone', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Toc', + foo: 'bar', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'Toc', + foo: 'bar', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + }) + + describe('activityList', () => { + test('adds missing options', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { periods: ['/periods/1a2b3c4d'], filter: defaultFilter }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('allows empty periods', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { periods: [], filter: defaultFilter }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...multiPeriodArgs) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { periods: [], filter: defaultFilter }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('does not allow empty period if there is only one period in the camp', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { periods: [], filter: defaultFilter }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('filters out unknown periods', async () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/11112222', '/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + describe('filter', () => { + test('leaves valid filter as is', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: '/periods/1a2b3c4d', + day: ['/days/1a2b3c4d'], + category: ['/categories/1a2b3c4d'], + progressLabel: ['/progress_labels/1a2b3c4d'], + responsible: ['/camp_collaborations/1a2b3c4d'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: '/periods/1a2b3c4d', + day: ['/days/1a2b3c4d'], + category: ['/categories/1a2b3c4d'], + progressLabel: ['/progress_labels/1a2b3c4d'], + responsible: ['/camp_collaborations/1a2b3c4d'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds default filter if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds period if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + day: [], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid period', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: '/periods/00000000', + day: [], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds responsible filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid responsible', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + responsible: ['/camp_collaborations/00000000'], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds category filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: null, + day: [], + responsible: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid category', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: null, + day: [], + category: ['/categories/00000000'], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds day filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: null, + category: [], + responsible: [], + progressLabel: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid day', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: null, + day: ['/days/00000000'], + category: [], + progressLabel: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds progressLabel filter when missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: null, + day: [], + category: [], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('removes invalid progressLabel', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: null, + day: [], + category: [], + progressLabel: ['/progress_labels/00000000'], + responsible: [], + activityCount: 0, + }, + }, + }, + ], + documentName: 'test camp', + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + + test('adds dummy activityCount if missing', () => { + // given + const config = { + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: { + period: null, + day: [], + category: [], + progressLabel: [], + responsible: [], + }, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + } + + // when + const result = repairConfig(config, ...args) + + // then + expect(result).toEqual({ + camp: '/camps/1a2b3c4d', + contents: [ + { + type: 'ActivityList', + options: { + periods: ['/periods/1a2b3c4d'], + filter: defaultFilter, + }, + }, + ], + documentName: 'test camp', + options: { pageNumbers: false }, + language: 'en-GB', + }) + }) + }) + }) +}) diff --git a/frontend-old/src/components/print/config/ActivityConfig.vue b/frontend-old/src/components/print/config/ActivityConfig.vue new file mode 100644 index 0000000000..1df660008c --- /dev/null +++ b/frontend-old/src/components/print/config/ActivityConfig.vue @@ -0,0 +1,73 @@ + + + diff --git a/frontend-old/src/components/print/config/ActivityListConfig.vue b/frontend-old/src/components/print/config/ActivityListConfig.vue new file mode 100644 index 0000000000..8401300b36 --- /dev/null +++ b/frontend-old/src/components/print/config/ActivityListConfig.vue @@ -0,0 +1,92 @@ + + + diff --git a/frontend-old/src/components/print/config/CoverConfig.vue b/frontend-old/src/components/print/config/CoverConfig.vue new file mode 100644 index 0000000000..53070670be --- /dev/null +++ b/frontend-old/src/components/print/config/CoverConfig.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend-old/src/components/print/config/DialogScheduleEntryFilter.vue b/frontend-old/src/components/print/config/DialogScheduleEntryFilter.vue new file mode 100644 index 0000000000..837eaec22e --- /dev/null +++ b/frontend-old/src/components/print/config/DialogScheduleEntryFilter.vue @@ -0,0 +1,130 @@ + + + diff --git a/frontend-old/src/components/print/config/PicassoConfig.vue b/frontend-old/src/components/print/config/PicassoConfig.vue new file mode 100644 index 0000000000..aecd1e43ba --- /dev/null +++ b/frontend-old/src/components/print/config/PicassoConfig.vue @@ -0,0 +1,117 @@ + + + diff --git a/frontend-old/src/components/print/config/ProgramConfig.vue b/frontend-old/src/components/print/config/ProgramConfig.vue new file mode 100644 index 0000000000..f5dc92d793 --- /dev/null +++ b/frontend-old/src/components/print/config/ProgramConfig.vue @@ -0,0 +1,99 @@ + + + diff --git a/frontend-old/src/components/print/config/SafetyConsiderationsConfig.vue b/frontend-old/src/components/print/config/SafetyConsiderationsConfig.vue new file mode 100644 index 0000000000..fa02d08ace --- /dev/null +++ b/frontend-old/src/components/print/config/SafetyConsiderationsConfig.vue @@ -0,0 +1,62 @@ + + + diff --git a/frontend-old/src/components/print/config/StoryConfig.vue b/frontend-old/src/components/print/config/StoryConfig.vue new file mode 100644 index 0000000000..63fc415f04 --- /dev/null +++ b/frontend-old/src/components/print/config/StoryConfig.vue @@ -0,0 +1,62 @@ + + + diff --git a/frontend-old/src/components/print/config/SummaryConfig.vue b/frontend-old/src/components/print/config/SummaryConfig.vue new file mode 100644 index 0000000000..af20659458 --- /dev/null +++ b/frontend-old/src/components/print/config/SummaryConfig.vue @@ -0,0 +1,52 @@ + diff --git a/frontend-old/src/components/print/config/TocConfig.vue b/frontend-old/src/components/print/config/TocConfig.vue new file mode 100644 index 0000000000..8f23f06f4a --- /dev/null +++ b/frontend-old/src/components/print/config/TocConfig.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend-old/src/components/print/configurator/PagesConfig.vue b/frontend-old/src/components/print/configurator/PagesConfig.vue new file mode 100644 index 0000000000..23dfd525d8 --- /dev/null +++ b/frontend-old/src/components/print/configurator/PagesConfig.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/frontend-old/src/components/print/configurator/PagesOverview.vue b/frontend-old/src/components/print/configurator/PagesOverview.vue new file mode 100644 index 0000000000..ded9c4240f --- /dev/null +++ b/frontend-old/src/components/print/configurator/PagesOverview.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/frontend-old/src/components/print/print-client/DownloadClientPdfButton.vue b/frontend-old/src/components/print/print-client/DownloadClientPdfButton.vue new file mode 100644 index 0000000000..54310b6e19 --- /dev/null +++ b/frontend-old/src/components/print/print-client/DownloadClientPdfButton.vue @@ -0,0 +1,50 @@ + + + + diff --git a/frontend-old/src/components/print/print-client/DownloadClientPdfListItem.vue b/frontend-old/src/components/print/print-client/DownloadClientPdfListItem.vue new file mode 100644 index 0000000000..8a0bee99fe --- /dev/null +++ b/frontend-old/src/components/print/print-client/DownloadClientPdfListItem.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/frontend-old/src/components/print/print-client/PrintPreviewClient.vue b/frontend-old/src/components/print/print-client/PrintPreviewClient.vue new file mode 100644 index 0000000000..8ab6e8ac3e --- /dev/null +++ b/frontend-old/src/components/print/print-client/PrintPreviewClient.vue @@ -0,0 +1,123 @@ +