From 1d81b5b23696097e0e093b94f4df170c41a289e3 Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Sat, 30 Aug 2025 18:05:56 +0000 Subject: [PATCH 01/20] Vite and modularization --- Build/.github/dependabot.yml | 11 + Build/.github/workflows/codeql.yml | 100 + Build/.github/workflows/static.yml | 45 + Build/.gitignore | 42 + Build/Build/Buildscripts/build-all.sh | 16 + Build/Build/Buildscripts/build-inline.sh | 67 + Build/Build/Buildscripts/build.sh | 21 + Build/Build/package-lock.json | 5997 ++++ Build/Build/package.json | 53 + Build/Build/src/console.ts | 129 + Build/Build/src/editor.ts | 139 + Build/Build/src/index.html | 112 + Build/Build/src/main.ts | 542 + Build/Build/src/runner.ts | 207 + Build/Build/src/state.ts | 148 + Build/Build/src/styles.css | 559 + Build/Build/src/types.ts | 51 + Build/Build/src/ui.ts | 144 + Build/Build/src/utils.ts | 19 + Build/Build/tsconfig.json | 16 + Build/Build/webpack.config.js | 39 + Build/LICENSE | 21 + Build/README.md | 210 + Build/eslint.config.mjs | 15 + Build/export.mjs | 37 + Build/favicon.png | Bin 0 -> 145568 bytes Build/index.html | 112 + Build/main.js | 34940 +++++++++++++++++++++ Build/manifest.json | 20 + Build/package-lock.json | 8375 +++++ Build/package.json | 45 + Build/public/source.svg | 1 + Build/service-worker.js | 15 + Build/src/book.js | 174 + Build/src/indexedDB.js | 31 + Build/src/library.js | 107 + Build/src/main.js | 55 + Build/src/style.css | 264 + Build/styles.css | 559 + Build/vite.config.mjs | 43 + apple-touch-icon-180x180.png | Bin 0 -> 1004 bytes assets/index-D-qNE1dZ.js | 22 + assets/index-D-qNE1dZ.js.map | 1 + assets/index-D7CYcCYQ.css | 1 + favicon.ico | Bin 0 -> 632 bytes manifest.webmanifest | 1 + maskable-icon-512x512.png | Bin 0 -> 3391 bytes pwa-192x192.png | Bin 0 -> 1400 bytes pwa-512x512.png | Bin 0 -> 4168 bytes pwa-64x64.png | Bin 0 -> 556 bytes registerSW.js | 1 + source.svg | 1 + sw.js | 2 + sw.js.map | 1 + workbox-3bd99cbd.js | 2 + workbox-3bd99cbd.js.map | 1 + 56 files changed, 53514 insertions(+) create mode 100644 Build/.github/dependabot.yml create mode 100644 Build/.github/workflows/codeql.yml create mode 100644 Build/.github/workflows/static.yml create mode 100644 Build/.gitignore create mode 100755 Build/Build/Buildscripts/build-all.sh create mode 100755 Build/Build/Buildscripts/build-inline.sh create mode 100755 Build/Build/Buildscripts/build.sh create mode 100644 Build/Build/package-lock.json create mode 100644 Build/Build/package.json create mode 100644 Build/Build/src/console.ts create mode 100644 Build/Build/src/editor.ts create mode 100644 Build/Build/src/index.html create mode 100644 Build/Build/src/main.ts create mode 100644 Build/Build/src/runner.ts create mode 100644 Build/Build/src/state.ts create mode 100644 Build/Build/src/styles.css create mode 100644 Build/Build/src/types.ts create mode 100644 Build/Build/src/ui.ts create mode 100644 Build/Build/src/utils.ts create mode 100644 Build/Build/tsconfig.json create mode 100644 Build/Build/webpack.config.js create mode 100644 Build/LICENSE create mode 100644 Build/README.md create mode 100644 Build/eslint.config.mjs create mode 100644 Build/export.mjs create mode 100644 Build/favicon.png create mode 100644 Build/index.html create mode 100644 Build/main.js create mode 100644 Build/manifest.json create mode 100644 Build/package-lock.json create mode 100644 Build/package.json create mode 100644 Build/public/source.svg create mode 100644 Build/service-worker.js create mode 100644 Build/src/book.js create mode 100644 Build/src/indexedDB.js create mode 100644 Build/src/library.js create mode 100644 Build/src/main.js create mode 100644 Build/src/style.css create mode 100644 Build/styles.css create mode 100644 Build/vite.config.mjs create mode 100644 apple-touch-icon-180x180.png create mode 100644 assets/index-D-qNE1dZ.js create mode 100644 assets/index-D-qNE1dZ.js.map create mode 100644 assets/index-D7CYcCYQ.css create mode 100644 favicon.ico create mode 100644 manifest.webmanifest create mode 100644 maskable-icon-512x512.png create mode 100644 pwa-192x192.png create mode 100644 pwa-512x512.png create mode 100644 pwa-64x64.png create mode 100644 registerSW.js create mode 100644 source.svg create mode 100644 sw.js create mode 100644 sw.js.map create mode 100644 workbox-3bd99cbd.js create mode 100644 workbox-3bd99cbd.js.map diff --git a/Build/.github/dependabot.yml b/Build/.github/dependabot.yml new file mode 100644 index 0000000..9d5c666 --- /dev/null +++ b/Build/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "/Build" # Location of package manifests + schedule: + interval: "weekly" diff --git a/Build/.github/workflows/codeql.yml b/Build/.github/workflows/codeql.yml new file mode 100644 index 0000000..3f15667 --- /dev/null +++ b/Build/.github/workflows/codeql.yml @@ -0,0 +1,100 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL Advanced" + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + schedule: + - cron: '18 23 * * 4' + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + include: + - language: actions + build-mode: none + - language: javascript-typescript + build-mode: none + # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Add any setup steps before running the `github/codeql-action/init` action. + # This includes steps like installing compilers or runtimes (`actions/setup-node` + # or others). This is typically only required for manual builds. + # - name: Setup runtime (example) + # uses: actions/setup-example@v1 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/Build/.github/workflows/static.yml b/Build/.github/workflows/static.yml new file mode 100644 index 0000000..f1d3dcb --- /dev/null +++ b/Build/.github/workflows/static.yml @@ -0,0 +1,45 @@ +# .github/workflows/static.yml +name: Deploy static content to Pages + +on: + push: + branches: ["main"] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Run build script + run: | + chmod +x Build/Buildscripts/build.sh + ./Build/Buildscripts/build.sh + + - name: Upload GitHub Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: 'Build/dist' + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/Build/.gitignore b/Build/.gitignore new file mode 100644 index 0000000..f64c21b --- /dev/null +++ b/Build/.gitignore @@ -0,0 +1,42 @@ +# Node modules +node_modules/ + +# Logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Build output +dist/ +build/ +out/ + +# TypeScript cache +*.tsbuildinfo + +# Environment variables +.env +.env.* + +# IDE files +.vscode/ +.idea/ +*.suo +*.ntvs* +*.njsproj +*.sln + +# OS files +.DS_Store +Thumbs.db + +# Coverage +coverage/ + +# Optional npm cache directory +.npm/ + +# Optional eslint cache +.eslintcache \ No newline at end of file diff --git a/Build/Build/Buildscripts/build-all.sh b/Build/Build/Buildscripts/build-all.sh new file mode 100755 index 0000000..7ac046f --- /dev/null +++ b/Build/Build/Buildscripts/build-all.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e # Exit immediately on error + +echo "Starting full build..." +echo "" + +# Determine the directory of this script +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Run each script relative to this directory +"$SCRIPT_DIR/build.sh" +echo "" +"$SCRIPT_DIR/build-inline.sh" +echo "" + +echo "Full build completed." diff --git a/Build/Build/Buildscripts/build-inline.sh b/Build/Build/Buildscripts/build-inline.sh new file mode 100755 index 0000000..0b06d26 --- /dev/null +++ b/Build/Build/Buildscripts/build-inline.sh @@ -0,0 +1,67 @@ +#!/bin/bash +set -euo pipefail + +echo "Starting inlining process..." + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DIST_DIR="$SCRIPT_DIR/../dist" + +HTML_FILE="$DIST_DIR/index.html" +CSS_FILE="$DIST_DIR/styles.css" +JS_FILE="$DIST_DIR/main.js" +OUTPUT_FILE="$DIST_DIR/index-inline.html" + +# Check that required files exist +if [[ ! -f "$HTML_FILE" || ! -f "$CSS_FILE" || ! -f "$JS_FILE" ]]; then + echo "Missing one or more required files in $DIST_DIR." + exit 1 +fi + +# Step 1: Create a backup of the original HTML +cp "$HTML_FILE" "$OUTPUT_FILE" + +# Step 2: Read and indent CSS and JS +INDENTED_CSS=$(sed 's/^/ /' "$CSS_FILE") +INDENTED_JS=$(sed 's/^/ /' "$JS_FILE") + +# Step 3: Replace and |@@INLINE_JS@@|g' "$OUTPUT_FILE" +sed -i.bak "s|]*data-inline=\"true\"[^>]*src='main\.js'[^>]*>|@@INLINE_JS@@|g" "$OUTPUT_FILE" + +# Step 4: Write indented CSS and JS to temporary files +INLINE_CSS_FILE=$(mktemp) +INLINE_JS_FILE=$(mktemp) + +{ + echo " " +} > "$INLINE_CSS_FILE" + +{ + echo " " +} > "$INLINE_JS_FILE" + +# Step 5: Replace placeholders with inline content +awk -v css="$INLINE_CSS_FILE" -v js="$INLINE_JS_FILE" ' +/@@INLINE_CSS@@/ { + while ((getline line < css) > 0) print line + close(css) + next +} +/@@INLINE_JS@@/ { + while ((getline line < js) > 0) print line + close(js) + next +} +{ print } +' "$OUTPUT_FILE" > "$OUTPUT_FILE.tmp" && mv "$OUTPUT_FILE.tmp" "$OUTPUT_FILE" + +# Clean up +rm -f "$INLINE_CSS_FILE" "$INLINE_JS_FILE" "$OUTPUT_FILE.bak" + +echo "Inlined output written to $OUTPUT_FILE" diff --git a/Build/Build/Buildscripts/build.sh b/Build/Build/Buildscripts/build.sh new file mode 100755 index 0000000..15690e0 --- /dev/null +++ b/Build/Build/Buildscripts/build.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -e + +echo "Building HTMLRunner" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" # project root +BUILD_DIR="$ROOT_DIR/Build" # e.g., Build/ +DIST_DIR="$BUILD_DIR/dist" # final output + +cd "$BUILD_DIR" + +npm install +npm run build + +echo "Copying extra files..." +cp "$ROOT_DIR/favicon.png" "$DIST_DIR/" +cp "$ROOT_DIR/manifest.json" "$DIST_DIR/" +cp "$ROOT_DIR/service-worker.js" "$DIST_DIR/" + +echo "Build completed." diff --git a/Build/Build/package-lock.json b/Build/Build/package-lock.json new file mode 100644 index 0000000..cceec70 --- /dev/null +++ b/Build/Build/package-lock.json @@ -0,0 +1,5997 @@ +{ + "name": "htmlrunner", + "version": "1.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "htmlrunner", + "version": "1.1.0", + "license": "ISC", + "dependencies": { + "@babel/core": "^7.28.3", + "@babel/parser": "^7.27.5", + "@babel/runtime": "^7.28.2", + "@codemirror/commands": "^6.8.1", + "@codemirror/lang-css": "^6.3.1", + "@codemirror/lang-html": "^6.4.9", + "@codemirror/lang-javascript": "^6.2.4", + "@codemirror/lint": "^6.8.5", + "@codemirror/state": "^6.5.2", + "@codemirror/view": "^6.38.1", + "@prettier/plugin-xml": "^3.4.2", + "@types/codemirror": "^5.60.16", + "@uiw/codemirror-theme-bbedit": "^4.25.1", + "@uiw/codemirror-theme-monokai": "^4.25.1", + "codemirror": "^6.0.2", + "copy-webpack-plugin": "^13.0.0", + "eslint": "^9.34.0", + "eslint-linter-browserify": "^9.31.0", + "file-saver": "^2.0.5", + "fontawesome": "^5.6.3", + "jszip": "^3.10.1", + "prettier": "^3.6.2", + "prettier-plugin-css-order": "^2.1.2", + "split.js": "^1.6.5" + }, + "devDependencies": { + "@types/file-saver": "^2.0.7", + "@types/prettier": "^3.0.0", + "@types/split.js": "^1.6.0", + "copy-webpack-plugin": "^13.0.0", + "htmlhint": "^1.6.3", + "ts-loader": "^9.5.2", + "typescript": "^5.9.2", + "webpack": "^5.100.1", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "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.27.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz", + "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@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.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "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/core/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/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==", + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "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-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==", + "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-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "license": "MIT", + "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==", + "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==", + "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-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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", + "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", + "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==", + "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.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", + "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/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==", + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.18.6", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", + "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz", + "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.9.tgz", + "integrity": "sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.0" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz", + "integrity": "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz", + "integrity": "sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", + "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.5.11", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.11.tgz", + "integrity": "sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", + "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.38.1", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.1.tgz", + "integrity": "sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "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==", + "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==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "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==", + "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-array/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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-array/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==" + }, + "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==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "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==", + "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==", + "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/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/@eslint/eslintrc/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==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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==" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/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==" + }, + "node_modules/@eslint/js": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "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==", + "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==", + "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/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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==", + "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==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", + "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", + "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lezer/common": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", + "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", + "license": "MIT" + }, + "node_modules/@lezer/css": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.2.1.tgz", + "integrity": "sha512-2F5tOqzKEKbCUNraIXc0f6HKeyKlmMWJnBB0i4XW6dJgssrZO/YlZ2pY5xgyqDleqqhiNJ3dQhbrV2aClZQMvg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", + "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz", + "integrity": "sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.1.tgz", + "integrity": "sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" + }, + "node_modules/@prettier/plugin-xml": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-3.4.2.tgz", + "integrity": "sha512-/UyNlHfkuLXG6Ed85KB0WBF283xn2yavR+UtRibBRUcvEJId2DSLdGXwJ/cDa1X++SWDPzq3+GSFniHjkNy7yg==", + "license": "MIT", + "dependencies": { + "@xml-tools/parser": "^1.0.11" + }, + "peerDependencies": { + "prettier": "^3.0.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/codemirror": { + "version": "5.60.16", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.16.tgz", + "integrity": "sha512-V/yHdamffSS075jit+fDxaOAmdP2liok8NSNJnAZfDJErzOheuygHZEhAJrfmk5TEyM32MhkZjwo/idX791yxw==", + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz", + "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/file-saver": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.7.tgz", + "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.15.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.24.tgz", + "integrity": "sha512-w9CZGm9RDjzTh/D+hFwlBJ3ziUaVw7oufKA3vOFSOZlzmW9AkZnfjPb+DLnrV6qtgL/LNmP0/2zBNCFHL3F0ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==", + "deprecated": "This is a stub types definition. prettier provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sarif": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", + "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/split.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/split.js/-/split.js-1.6.0.tgz", + "integrity": "sha512-tR/wWtnfZ+ZiEFrusKHn1qKUnZlpROff7a6wvRwS9ImI3pD6ytrRmgt4mbPM2FpRUUTIKsfZXGXBmuvalMUVzw==", + "deprecated": "This is a stub types definition. split.js provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "split.js": "*" + } + }, + "node_modules/@types/tern": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@uiw/codemirror-theme-bbedit": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-bbedit/-/codemirror-theme-bbedit-4.25.1.tgz", + "integrity": "sha512-PF2WmeES5lP6HWLW95RS3dExvcxWQBg68pwSVwFUbtLm26nxcmsx/YDIOwAHemv5+jBRQuVU+sxiK9AQSEybkg==", + "license": "MIT", + "dependencies": { + "@uiw/codemirror-themes": "4.25.1" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + } + }, + "node_modules/@uiw/codemirror-theme-bbedit/node_modules/@uiw/codemirror-themes": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.25.1.tgz", + "integrity": "sha512-6o8tQ8bdq14RuVFpZ7l9u8KnuPq824uG3U1VV933Uhv8mfaxaoaOQSjv6T2bQUPhjH6ZlEu5+tAMkOfIL21eIQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/language": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@uiw/codemirror-theme-monokai": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-monokai/-/codemirror-theme-monokai-4.25.1.tgz", + "integrity": "sha512-UWGDOTdeosGSnVar56E2/8ktPVNeGmjAz2rJmHCqiGPB+Jb49WqNT8m9aGVB8/BZiFwv7Dv0EIyL71tR9ILzmA==", + "license": "MIT", + "dependencies": { + "@uiw/codemirror-themes": "4.25.1" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + } + }, + "node_modules/@uiw/codemirror-theme-monokai/node_modules/@uiw/codemirror-themes": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.25.1.tgz", + "integrity": "sha512-6o8tQ8bdq14RuVFpZ7l9u8KnuPq824uG3U1VV933Uhv8mfaxaoaOQSjv6T2bQUPhjH6ZlEu5+tAMkOfIL21eIQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/language": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@uiw/codemirror-themes": { + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.24.1.tgz", + "integrity": "sha512-hduBbFNiWNW6nYa2/giKQ9YpzhWNw87BGpCjC+cXYMZ7bCD6q5DC6Hw+7z7ZwSzEaOQvV91lmirOjJ8hn9+pkg==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/language": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", + "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", + "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", + "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xml-tools/parser": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", + "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", + "license": "Apache-2.0", + "dependencies": { + "chevrotain": "7.1.1" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.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==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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==", + "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/anymatch/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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "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==", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "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/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "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/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/browserslist": { + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "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": { + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/chevrotain": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", + "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", + "license": "Apache-2.0", + "dependencies": { + "regexp-to-ast": "0.5.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/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "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==", + "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/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/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-webpack-plugin": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", + "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-parent": "^6.0.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "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==" + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "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/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.159", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.159.tgz", + "integrity": "sha512-CEvHptWAMV5p6GJ0Lq8aheyvVbfzVrv5mmidu1D3pidoVNkB3tTBsTMVtPJ+rzRK5oV229mCLz9Zj/hNvU8GBA==", + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.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.34.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-linter-browserify": { + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/eslint-linter-browserify/-/eslint-linter-browserify-9.31.0.tgz", + "integrity": "sha512-Utv/GchpL5EkPK1FcYvPjdfcYl6nEr2SaJgY4cZHRt/IVGxvojhdZQLHSC9CTpWVWt1fQ7McrzyfCCD1QxB9ow==", + "license": "MIT" + }, + "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": "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==", + "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/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/eslint/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==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "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/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/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==" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/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==" + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "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/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "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==", + "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==", + "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==", + "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/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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-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==" + }, + "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==" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fdir": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", + "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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==", + "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/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "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==", + "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==" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fontawesome": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/fontawesome/-/fontawesome-5.6.3.tgz", + "integrity": "sha512-FCc+CawwsJWWprVEg9X14yI7zI+l9YVAyhzgu70qwGeDn0tLLDH/dVfqgij72g4BBGgLGfK2qnvFGAmYUkhaWg==", + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "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": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "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/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/htmlhint": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-1.6.3.tgz", + "integrity": "sha512-AVmlXD75nRVcb+a+6PZxUgSFIR67KbzrwooCzyx0lV5A17EJioxtOUuM1k9z+xXjzhZt0z3vntcu5JPSH/XHxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "3.2.6", + "chalk": "4.1.2", + "commander": "11.1.0", + "glob": "^8.1.0", + "is-glob": "^4.0.3", + "node-sarif-builder": "^3.2.0", + "strip-json-comments": "3.1.1", + "xml": "1.0.1" + }, + "bin": { + "htmlhint": "bin/htmlhint" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "type": "Open Collective", + "url": "https://opencollective.com/htmlhint" + } + }, + "node_modules/htmlhint/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "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==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "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==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "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==", + "engines": { + "node": ">=0.8.19" + } + }, + "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/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "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-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-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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==", + "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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "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==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "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==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "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==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "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==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "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==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", + "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/micromatch/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/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "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", + "peer": true, + "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==" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/node-sarif-builder": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.2.0.tgz", + "integrity": "sha512-kVIOdynrF2CRodHZeP/97Rh1syTUHBNiw17hUCIVhlhEsWlfJm19MuO56s4MdKbr22xWx6mzMnNAgXzVlIYM9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "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/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/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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/open": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "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==", + "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/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "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-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" + }, + "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": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "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", + "peer": true, + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-less": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz", + "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "postcss": "^8.3.5" + } + }, + "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==", + "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/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "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==", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-css-order": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-css-order/-/prettier-plugin-css-order-2.1.2.tgz", + "integrity": "sha512-vomxPjHI6pOMYcBuouSJHxxQClJXaUpU9rsV9IAO2wrSTZILRRlrxAAR8t9UF6wtczLkLfNRFUwM+ZbGXOONUA==", + "license": "ISC", + "dependencies": { + "css-declaration-sorter": "^7.1.1", + "postcss-less": "^6.0.0", + "postcss-scss": "^4.0.9" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "prettier": "3.x" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/readdirp/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/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "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/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "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/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/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/spdy/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/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/split.js": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", + "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-mod": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", + "license": "MIT" + }, + "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==", + "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/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.40.0.tgz", + "integrity": "sha512-cfeKl/jjwSR5ar7d0FGmave9hFGJT8obyo0z+CrQOylLDbk7X81nPU6vq9VORa5jU30SkDnT2FXjLbR8HLP+xA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-dump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", + "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/ts-loader": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "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/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "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": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.100.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.100.1.tgz", + "integrity": "sha512-YJB/ESPUe2Locd0NKXmw72Dx8fZQk1gTzI6rc9TAT4+Sypbnhl8jd8RywB1bDsDF9Dy1RUR7gn3q/ZJTd0OZZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.2", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", + "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.6.1", + "@webpack-cli/configtest": "^3.0.1", + "@webpack-cli/info": "^3.0.1", + "@webpack-cli/serve": "^3.0.1", + "colorette": "^2.0.14", + "commander": "^12.1.0", + "cross-spawn": "^7.0.3", + "envinfo": "^7.14.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^6.0.1" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.82.0" + }, + "peerDependenciesMeta": { + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.21.2", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "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/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "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==", + "license": "ISC" + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/Build/Build/package.json b/Build/Build/package.json new file mode 100644 index 0000000..7f714e5 --- /dev/null +++ b/Build/Build/package.json @@ -0,0 +1,53 @@ +{ + "name": "htmlrunner", + "version": "1.1.0", + "description": "A small live HTML/JS runner with console capture.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "webpack", + "watch": "webpack --watch", + "start": "webpack serve --open" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@babel/core": "^7.28.3", + "@babel/parser": "^7.27.5", + "@babel/runtime": "^7.28.2", + "@codemirror/commands": "^6.8.1", + "@codemirror/lang-css": "^6.3.1", + "@codemirror/lang-html": "^6.4.9", + "@codemirror/lang-javascript": "^6.2.4", + "@codemirror/lint": "^6.8.5", + "@codemirror/state": "^6.5.2", + "@codemirror/view": "^6.38.1", + "@prettier/plugin-xml": "^3.4.2", + "@types/codemirror": "^5.60.16", + "@uiw/codemirror-theme-bbedit": "^4.25.1", + "@uiw/codemirror-theme-monokai": "^4.25.1", + "codemirror": "^6.0.2", + "eslint": "^9.34.0", + "eslint-linter-browserify": "^9.31.0", + "file-saver": "^2.0.5", + "fontawesome": "^5.6.3", + "jszip": "^3.10.1", + "prettier": "^3.6.2", + "prettier-plugin-css-order": "^2.1.2", + "split.js": "^1.6.5", + "copy-webpack-plugin": "^13.0.0" + }, + "devDependencies": { + "@types/file-saver": "^2.0.7", + "@types/prettier": "^3.0.0", + "@types/split.js": "^1.6.0", + "copy-webpack-plugin": "^13.0.0", + "htmlhint": "^1.6.3", + "ts-loader": "^9.5.2", + "typescript": "^5.9.2", + "webpack": "^5.100.1", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.2" + } +} diff --git a/Build/Build/src/console.ts b/Build/Build/src/console.ts new file mode 100644 index 0000000..9cfb18a --- /dev/null +++ b/Build/Build/src/console.ts @@ -0,0 +1,129 @@ +import { ConsoleMessage, StackInfo } from './types'; + +export const consoleOutput = document.getElementById('console') as HTMLDivElement; + +// Console interceptor code that will be injected into the preview iframe +export const consoleInterceptor = ` + const originalConsole = { log: console.log, error: console.error, warn: console.warn, info: console.info }; + function sendToConsole(level, ...args) { + window.parent.postMessage({ type: 'console', level, data: args, timestamp: new Date().toISOString() }, '*'); + originalConsole[level].apply(console, args); + } + console.log = (...args) => sendToConsole('log', ...args); + console.error = (...args) => sendToConsole('error', ...args); + console.warn = (...args) => sendToConsole('warn', ...args); + console.info = (...args) => sendToConsole('info', ...args); + window.onerror = (message, source, lineno, colno, error) => { + sendToConsole('error', error || message, { stack: error?.stack }); + return true; + }; + window.onunhandledrejection = (event) => { + sendToConsole('error', event.reason, { stack: event.reason?.stack }); + }; +`; + +// Initialize console message handler +export function initializeConsole(): void { + window.addEventListener('message', handleConsoleMessage); +} + +function handleConsoleMessage(event: MessageEvent): void { + if (event.data.type === 'console') { + const entry = document.createElement('div'); + entry.className = 'console-entry'; + const timestamp = document.createElement('span'); + timestamp.className = 'timestamp'; + timestamp.textContent = new Date(event.data.timestamp).toLocaleTimeString(); + const message = document.createElement('span'); + message.className = `console-${event.data.level}`; + if (event.data.data && event.data.data.length) { + event.data.data.forEach((item: any, i: number) => { + if (i > 0) message.appendChild(document.createTextNode(' ')); + if (item && typeof item === 'object') { + message.appendChild(renderObject(item)); + } else { + message.appendChild(document.createTextNode(String(item))); + } + }); + } + if (event.data.data[1]?.stack) { + const stack = document.createElement('div'); + stack.className = 'console-stack'; + stack.textContent = event.data.data[1].stack; + stack.addEventListener('click', () => stack.classList.toggle('expanded')); + message.appendChild(stack); + } + entry.appendChild(timestamp); + entry.appendChild(document.createTextNode(' ')); + entry.appendChild(message); + consoleOutput.appendChild(entry); + consoleOutput.scrollTop = consoleOutput.scrollHeight; + } +} + +function renderObject(obj: any, level = 0, visited = new WeakSet()): Node { + if (obj === null) return document.createTextNode('null'); + if (typeof obj !== 'object') return document.createTextNode(String(obj)); + if (visited.has(obj)) return document.createTextNode('[Circular]'); + if (level > 3) return document.createTextNode('[...]'); + visited.add(obj); + + const container = document.createElement('span'); + if (obj instanceof Error) { + const errorEl = document.createElement('span'); + errorEl.className = 'console-error'; + errorEl.textContent = `${obj.name}: ${obj.message}`; + if (obj.stack) errorEl.textContent += `\n${obj.stack.split('\n').slice(1).join('\n')}`; + container.appendChild(errorEl); + return container; + } + + const preview = document.createElement('span'); + preview.className = 'console-object'; + preview.textContent = Array.isArray(obj) ? `Array(${obj.length})` : '{...}'; + const content = document.createElement('div'); + content.className = 'console-object-content'; + + Object.entries(obj).forEach(([key, value]) => { + const prop = document.createElement('div'); + prop.textContent = `${key}: `; + prop.appendChild(renderObject(value, level + 1, visited)); + content.appendChild(prop); + }); + + preview.addEventListener('click', (e) => { + e.stopPropagation(); + preview.classList.toggle('expanded'); + }); + + container.appendChild(preview); + container.appendChild(content); + return container; +} + +export function clearConsole(): void { + consoleOutput.innerHTML = ''; +} + +export function logConsoleError(message: string, stack: StackInfo = {}): void { + const entry = document.createElement('div'); + entry.className = 'console-entry'; + const timestamp = document.createElement('span'); + timestamp.className = 'timestamp'; + timestamp.textContent = new Date().toLocaleTimeString(); + const msg = document.createElement('span'); + msg.className = 'console-error'; + msg.textContent = message; + if (stack.stack) { + const stackEl = document.createElement('div'); + stackEl.className = 'console-stack'; + stackEl.textContent = stack.stack; + stackEl.addEventListener('click', () => stackEl.classList.toggle('expanded')); + msg.appendChild(stackEl); + } + entry.appendChild(timestamp); + entry.appendChild(document.createTextNode(' ')); + entry.appendChild(msg); + consoleOutput.appendChild(entry); + consoleOutput.scrollTop = consoleOutput.scrollHeight; +} diff --git a/Build/Build/src/editor.ts b/Build/Build/src/editor.ts new file mode 100644 index 0000000..3fd56f8 --- /dev/null +++ b/Build/Build/src/editor.ts @@ -0,0 +1,139 @@ +import { Compartment, EditorState, Extension } from "@codemirror/state"; +import { EditorView, lineNumbers, keymap } from "@codemirror/view"; // Add standardKeymap, defaultKeymap +import { defaultKeymap, standardKeymap } from "@codemirror/commands"; +import { html } from "@codemirror/lang-html"; +import { css } from "@codemirror/lang-css"; +import { javascript } from "@codemirror/lang-javascript"; +import { linter, lintGutter } from "@codemirror/lint"; +import { monokai } from "@uiw/codemirror-theme-monokai"; +import { bbedit } from "@uiw/codemirror-theme-bbedit"; +import { CodeMirrorEditor, Editors } from "./types"; +import { runCode } from "./runner"; +import { toggleSearch } from "./main"; +import { debounce } from "./utils"; +import { saveState } from "./state"; +import { search } from "@codemirror/search"; +import { toggleComment } from "@codemirror/commands"; // Ensure toggleComment is imported + +export let isDarkMode: boolean = localStorage.getItem("darkMode") === "true"; +export let isAutoRun: boolean = localStorage.getItem("autoRun") === "true"; + +export const editors: Editors = { + html: null as unknown as CodeMirrorEditor, + css: null as unknown as CodeMirrorEditor, + js: null as unknown as CodeMirrorEditor, +}; + +export function setDarkMode(value: boolean): void { + isDarkMode = value; + Object.values(editors).forEach((editor) => { + editor.view.dispatch({ + effects: editor.themeCompartment.reconfigure( + isDarkMode ? monokai : bbedit + ), + }); + }); +} + +export function setAutoRun(value: boolean): void { + isAutoRun = value; +} + +function createEditorConfig( + language: Extension, + container: HTMLElement, + content: string +): CodeMirrorEditor { + const themeCompartment = new Compartment(); + const autoRunCompartment = new Compartment(); + + const view = new EditorView({ + state: EditorState.create({ + doc: content, + extensions: [ + lineNumbers(), + language, + themeCompartment.of(isDarkMode ? monokai : bbedit), + EditorView.lineWrapping, + EditorState.tabSize.of(2), + EditorView.theme({ + "&": { height: "100%" }, + ".cm-scroller": { overflow: "auto" }, + ".cm-content": { minHeight: "100%" } + }), + search(), + linter( + (view) => { + return []; + }, + { delay: 100 } + ), + lintGutter(), + keymap.of([ + ...standardKeymap, // Add standard keymap + ...defaultKeymap, // Add default keymap + { + key: "Ctrl-/", + run: (view: EditorView) => { + view.dispatch({ + changes: { from: 0, to: view.state.doc.length, insert: "" }, + }); + return true; + }, + preventDefault: true, + }, + ]), + autoRunCompartment.of( + isAutoRun + ? EditorView.updateListener.of((update) => { + if (update.docChanged) { + debounce(runCode, 1000)(); + } + }) + : [] + ), + // Autosave listener + EditorView.updateListener.of((update) => { + if (update.docChanged) { + debounce(saveState, 1000)(); + } + }), + ], + }), + parent: container, + }); + + // Prevent Enter from submitting a form + view.dom.addEventListener("keydown", (event) => { + if (event.key === "Enter") { + event.stopPropagation(); // Prevent form submission + } + }); + + return { + view, + state: view.state, + themeCompartment, + autoRunCompartment, + }; +} + +export function initializeEditors(): void { + const htmlContainer = document.getElementById( + "html-editor-container" + ) as HTMLElement; + const cssContainer = document.getElementById( + "css-editor-container" + ) as HTMLElement; + const jsContainer = document.getElementById( + "js-editor-container" + ) as HTMLElement; + + if (!htmlContainer || !cssContainer || !jsContainer) { + throw new Error("Editor containers not found"); + } + + editors.html = createEditorConfig(html(), htmlContainer, ""); + editors.css = createEditorConfig(css(), cssContainer, ""); + editors.js = createEditorConfig(javascript(), jsContainer, ""); +} \ No newline at end of file diff --git a/Build/Build/src/index.html b/Build/Build/src/index.html new file mode 100644 index 0000000..36e8835 --- /dev/null +++ b/Build/Build/src/index.html @@ -0,0 +1,112 @@ + + + + + + HTMLRunner + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ +
+ + + + + + + + +
+
+
+
+
+
HTML
+
CSS
+
JavaScript
+
+
+ + +
+
+
+
Preview
+
Console
+
+
+ +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/Build/Build/src/main.ts b/Build/Build/src/main.ts new file mode 100644 index 0000000..f40111b --- /dev/null +++ b/Build/Build/src/main.ts @@ -0,0 +1,542 @@ +import { initializeEditors, setDarkMode, setAutoRun } from "./editor"; +import { EditorView, keymap } from "@codemirror/view"; +import { EditorState, StateEffect } from "@codemirror/state"; +import { + search, + openSearchPanel, + searchPanelOpen, + closeSearchPanel, +} from "@codemirror/search"; +import { toggleComment } from "@codemirror/commands"; +import Split from "split.js"; +import * as prettier from "prettier/standalone"; +import * as parserHtml from "prettier/plugins/html"; +import * as parserCss from "prettier/plugins/postcss"; +import * as parserFlow from "prettier/plugins/flow"; +import * as prettierPluginEstree from "prettier/plugins/estree"; +import JSZip from "jszip"; +import { saveAs } from "file-saver"; +import { copyToClipboard } from "./utils"; +import { editors } from "./editor"; +import { + Editors, + State, + ConsoleMessage, + StackInfo, + CodeMirrorEditor, +} from "./types"; +import { consoleInterceptor, consoleOutput, clearConsole, logConsoleError } from "./console"; +import { runCode, formatCode } from "./runner"; +import { resetCode, state, saveState, loadState } from "./state"; +import { switchTab, switchOutput, showError, showLoading, hideLoading, updateThemeIcon, setPageDarkMode } from "./ui"; // Import updateThemeIcon + +// Type declarations for global window properties +declare global { + interface Window { + prettierPlugins: any[]; + runCode: () => void; + clearConsole: () => void; + resetCode: () => void; + formatCode: () => Promise; + toggleAutoRun: () => void; + toggleDarkMode: () => void; + switchTab: (tab: string) => void; + switchOutput: (output: string) => void; + exportAsZip: () => Promise; + copyAllConsole: () => void; + copyEditorContent: (editor: string) => void; + toggleSearch: () => void; + } +} + +// Register Prettier plugins +const plugins = [parserHtml, parserCss, parserFlow]; +window.prettierPlugins = plugins; + +let currentTab: string = "html"; +let currentOutput: string = "preview"; +let isDarkMode: boolean = localStorage.getItem("darkMode") === "true"; +let isAutoRun: boolean = localStorage.getItem("autoRun") === "true"; +let splitInstance: Split.Instance; +const loadingEl = document.getElementById("loading") as HTMLDivElement; +const errorEl = document.getElementById("error-message") as HTMLDivElement; +const preview = document.getElementById("preview") as HTMLIFrameElement; + +if (!consoleOutput || !loadingEl || !errorEl || !preview) { + throw new Error("Required DOM elements not found"); +} + +// Initialize Split.js +function initializeSplit() { + if (splitInstance) { + splitInstance.destroy(); + } + + const elements = ["#editor-panel", "#output-panel"]; + const direction = window.innerWidth <= 768 ? "vertical" : "horizontal"; + + if (!elements.every((id) => document.querySelector(id))) { + console.error("Split.js elements not found"); + return; + } + + splitInstance = Split(elements, { + sizes: state.splitSizes || [50, 50], + minSize: 200, + gutterSize: 10, + snapOffset: 0, + dragInterval: 1, + direction, + elementStyle: (dimension, size, gutterSize) => ({ + "flex-basis": `calc(${size}% - ${gutterSize}px)`, + }), + gutterStyle: (dimension, gutterSize) => ({ + "flex-basis": `${gutterSize}px`, + }), + onDragStart: function () { + document.body.style.cursor = + direction === "horizontal" ? "col-resize" : "row-resize"; + }, + onDrag: function () { + Object.values(editors).forEach((editor) => editor.view.requestMeasure()); + }, + onDragEnd: function (sizes) { + document.body.style.cursor = ""; + state.splitSizes = sizes; + saveState(); + Object.values(editors).forEach((editor) => editor.view.requestMeasure()); + }, + }); + + setTimeout(() => { + Object.values(editors).forEach((editor) => editor.view.requestMeasure()); + }, 0); +} + +// Handle window resize +let resizeTimeout: number; +const handleResize = () => { + if (resizeTimeout) { + window.clearTimeout(resizeTimeout); + } + resizeTimeout = window.setTimeout(() => { + initializeSplit(); + }, 250); +}; + +window.removeEventListener("resize", handleResize); +window.addEventListener("resize", handleResize); + +window.addEventListener("beforeunload", () => { + if (splitInstance) { + splitInstance.destroy(); + } +}); + +// Add global keyboard shortcut handler for search +function addGlobalSearchShortcuts() { + const preventDefault = (e: KeyboardEvent) => { + if ((e.ctrlKey || e.metaKey) && (e.key === "f" || e.key === "h")) { + e.preventDefault(); + e.stopPropagation(); + toggleSearch(e.key === "f" ? "find" : "replace"); + } + }; + window.addEventListener("keydown", preventDefault, true); +} + +// Initialize search controls +function initializeSearchControls(tabsContainer: Element): void { + const searchControls = document.createElement("div"); + searchControls.className = "search-controls"; + + const searchBtn = document.createElement("button"); + searchBtn.className = "search-btn"; + searchBtn.innerHTML = ''; + searchBtn.title = "Search (Ctrl+F)"; + searchBtn.onclick = () => toggleSearch("find"); + + const replaceBtn = document.createElement("button"); + replaceBtn.className = "replace-btn"; + replaceBtn.innerHTML = ''; + replaceBtn.title = "Replace (Ctrl+H)"; + replaceBtn.onclick = () => toggleSearch("replace"); + + searchControls.appendChild(searchBtn); + searchControls.appendChild(replaceBtn); + tabsContainer.appendChild(searchControls); +} + +// Console message handling +window.addEventListener("message", (event: MessageEvent) => { + if (event.data.type === "console") { + const entry = document.createElement("div"); + entry.className = `console-entry ${!activeFilters.has(event.data.level) ? "filtered" : ""}`; + + const timestamp = document.createElement("span"); + timestamp.className = "timestamp"; + timestamp.textContent = new Date(event.data.timestamp).toLocaleTimeString(); + + const message = document.createElement("span"); + message.className = `console-${event.data.level}`; + if (event.data.data && event.data.data.length) { + event.data.data.forEach((item: any, i: number) => { + if (i > 0) message.appendChild(document.createTextNode(" ")); + if (item && typeof item === "object") { + message.appendChild(renderObject(item)); + } else { + message.appendChild(document.createTextNode(String(item))); + } + }); + } + + if (event.data.data[1]?.stack) { + const stack = document.createElement("div"); + stack.className = "console-stack"; + stack.textContent = event.data.data[1].stack; + stack.addEventListener("click", () => stack.classList.toggle("expanded")); + message.appendChild(stack); + } + + const copyBtn = document.createElement("button"); + copyBtn.className = "copy-btn"; + copyBtn.innerHTML = ''; + copyBtn.addEventListener("click", () => { + const text = event.data.data + .map((item: any) => + typeof item === "object" + ? JSON.stringify(item, null, 2) + : String(item) + ) + .join(" "); + copyToClipboard(text); + copyBtn.innerHTML = ''; + setTimeout(() => { + copyBtn.innerHTML = ''; + }, 2000); + }); + + entry.appendChild(timestamp); + entry.appendChild(document.createTextNode(" ")); + entry.appendChild(message); + entry.appendChild(copyBtn); + consoleOutput.appendChild(entry); + consoleOutput.scrollTop = consoleOutput.scrollHeight; + } +}); + +// Render objects with depth limit and circular reference handling +function renderObject(obj: any, level = 0, visited = new WeakSet()): Node { + if (obj === null) return document.createTextNode("null"); + if (typeof obj !== "object") return document.createTextNode(String(obj)); + if (visited.has(obj)) return document.createTextNode("[Circular]"); + if (level > 3) return document.createTextNode("[...]"); + visited.add(obj); + + const container = document.createElement("span"); + if (obj instanceof Error) { + const errorEl = document.createElement("span"); + errorEl.className = "console-error"; + errorEl.textContent = `${obj.name}: ${obj.message}`; + if (obj.stack) + errorEl.textContent += `\n${obj.stack.split("\n").slice(1).join("\n")}`; + container.appendChild(errorEl); + return container; + } + + const preview = document.createElement("span"); + preview.className = "console-object"; + preview.textContent = Array.isArray(obj) ? `Array(${obj.length})` : "{...}"; + const content = document.createElement("div"); + content.className = "console-object-content"; + + Object.entries(obj).forEach(([key, value]) => { + const prop = document.createElement("div"); + prop.textContent = `${key}: `; + prop.appendChild(renderObject(value, level + 1, visited)); + content.appendChild(prop); + }); + + preview.addEventListener("click", (e) => { + e.stopPropagation(); + preview.classList.toggle("expanded"); + }); + + container.appendChild(preview); + container.appendChild(content); + return container; +} + +// Toggle auto-run +function toggleAutoRun(): void { + isAutoRun = !isAutoRun; + setAutoRun(isAutoRun); + localStorage.setItem("autoRun", String(isAutoRun)); + updateAutoRunStatus(); + + Object.values(editors).forEach((editor) => { + const listener = isAutoRun + ? EditorView.updateListener.of((update) => { + if (update.docChanged) { + debounce(runCode, 1000)(); + } + }) + : []; + editor.view.dispatch({ + effects: editor.autoRunCompartment.reconfigure(listener), + }); + }); +} + +function updateAutoRunStatus(): void { + const statusEl = document.getElementById("auto-run-status"); + if (statusEl) { + statusEl.textContent = isAutoRun ? "On" : "Off"; + } +} + +// Toggle dark mode +function toggleDarkMode(): void { + isDarkMode = !isDarkMode; + setDarkMode(isDarkMode); + document.body.classList.toggle("dark-mode"); + localStorage.setItem("darkMode", String(isDarkMode)); + updateThemeIcon(); +} + +// Export editors' content as ZIP +async function exportAsZip() { + const html = editors.html.view.state.doc.toString().trim(); + const css = editors.css.view.state.doc.toString().trim(); + const js = editors.js.view.state.doc.toString().trim(); + + const files: { name: string; content: string }[] = []; + if (html) files.push({ name: "index.html", content: html }); + if (css) files.push({ name: "styles.css", content: css }); + if (js) files.push({ name: "script.js", content: js }); + + if (files.length === 0) { + alert("Nothing to export!"); + return; + } + + if (files.length === 1) { + const blob = new Blob([files[0].content], { type: "text/plain" }); + saveAs(blob, files[0].name); + return; + } + + const zip = new JSZip(); + for (const file of files) { + zip.file(file.name, file.content); + } + + const content = await zip.generateAsync({ type: "blob" }); + saveAs(content, "htmlrunner-export.zip"); +} + + +// Copy console content +function copyAllConsole(): void { + const entries = Array.from(consoleOutput.children); + const text = entries + .map((entry) => { + const timestamp = entry.querySelector(".timestamp")?.textContent || ""; + const message = Array.from( + entry.querySelectorAll( + ".console-log, .console-error, .console-warn, .console-info" + ) + ) + .map((el) => el.textContent) + .join(""); + return `${timestamp} ${message}`; + }) + .join("\n"); + copyToClipboard(text); +} + +// Copy editor content +function copyEditorContent(editor: string): void { + const content = editors[editor].view.state.doc.toString(); + copyToClipboard(content); +} + +// Initialize copy buttons +function initializeCopyButtons(): void { + ["html", "css", "js"].forEach((editorType) => { + const container = document.getElementById(`${editorType}-editor-container`); + if (container) { + const copyBtn = document.createElement("button"); + copyBtn.className = "copy-btn"; + copyBtn.innerHTML = ''; + copyBtn.addEventListener("click", () => { + copyEditorContent(editorType); + copyBtn.innerHTML = ''; + setTimeout(() => { + copyBtn.innerHTML = ''; + }, 2000); + }); + container.appendChild(copyBtn); + } + }); + + const consoleTab = document.querySelector( + '.output-tabs .tab[data-output="console"]' + ); + if (consoleTab) { + const copyAllBtn = document.createElement("button"); + copyAllBtn.className = "copy-btn"; + copyAllBtn.style.position = "static"; + copyAllBtn.style.marginLeft = "auto"; + copyAllBtn.style.opacity = "1"; + copyAllBtn.innerHTML = ' Copy All'; + copyAllBtn.addEventListener("click", () => { + copyAllConsole(); + copyAllBtn.innerHTML = ' Copied!'; + setTimeout(() => { + copyAllBtn.innerHTML = ' Copy All'; + }, 2000); + }); + consoleTab.parentElement?.appendChild(copyAllBtn); + } +} + +// Log filter state +let activeFilters = new Set(["log", "error", "warn", "info"]); + +function toggleLogFilter(type: "log" | "error" | "warn" | "info"): void { + const button = document.querySelector(`.filter-toggle.${type}`); + if (button) { + const isActive = button.classList.contains("active"); + if (isActive) { + activeFilters.delete(type); + button.classList.remove("active"); + } else { + activeFilters.add(type); + button.classList.add("active"); + } + localStorage.setItem( + "logFilters", + JSON.stringify(Array.from(activeFilters)) + ); + applyLogFilters(); + } +} + +function applyLogFilters(): void { + document.querySelectorAll(".console-entry").forEach((entry) => { + const messageElement = entry.querySelector( + ".console-log, .console-error, .console-warn, .console-info" + ); + if (messageElement) { + const logType = Array.from(messageElement.classList) + .find((cls) => cls.startsWith("console-")) + ?.replace("console-", ""); + if (logType && !activeFilters.has(logType)) { + entry.className = "console-entry filtered"; + } else { + entry.className = "console-entry"; + } + } + }); +} + +function initializeLogFilters(): void { + try { + const savedFilters = localStorage.getItem("logFilters"); + if (savedFilters) { + activeFilters = new Set(JSON.parse(savedFilters)); + } + } catch (e) { + console.error("Failed to load log filters:", e); + } + + const consoleTab = document.querySelector(".output-tabs"); + if (consoleTab) { + const filtersDiv = document.createElement("div"); + filtersDiv.className = "console-filters"; + + ["log", "error", "warn", "info"].forEach((type) => { + const button = document.createElement("button"); + button.className = `filter-toggle ${type} ${activeFilters.has(type) ? "active" : ""}`; + button.innerHTML = `${type.charAt(0).toUpperCase() + type.slice(1)}`; + button.onclick = () => toggleLogFilter(type as any); + filtersDiv.appendChild(button); + }); + + consoleTab.insertBefore(filtersDiv, consoleTab.lastElementChild); + } +} + +// Search toggle function +export function toggleSearch(mode: "find" | "replace" = "find"): void { + const editor = editors[currentTab].view; + if (editor) { + const isOpen = searchPanelOpen(editor.state); + if (isOpen) { + closeSearchPanel(editor); + } else { + openSearchPanel(editor); + } + } +} + +function debounce any>( + func: T, + wait: number +): (...args: Parameters) => void { + let timeout: number | undefined; + return function (this: any, ...args: Parameters): void { + if (timeout) window.clearTimeout(timeout); + timeout = window.setTimeout(() => func.apply(this, args), wait); + }; +} + +// Expose functions to window object +Object.assign(window, { + runCode, + clearConsole, + resetCode, + formatCode, + toggleAutoRun, + toggleDarkMode, + switchTab, + switchOutput, + exportAsZip, + copyAllConsole, + copyEditorContent, + toggleSearch, +}); + +// Initialize +document.addEventListener("DOMContentLoaded", async () => { + initializeEditors(); + initializeCopyButtons(); + initializeSplit(); + updateAutoRunStatus(); + initializeLogFilters(); + addGlobalSearchShortcuts(); + + const editorTabs = document.querySelector(".editor-tabs"); + if (editorTabs) { + initializeSearchControls(editorTabs); + } + + // Apply dark mode to page and editors on load + if (isDarkMode) { + setPageDarkMode(true); + } + + loadState(); + formatCode().catch((error) => { + showError(`Error formatting code: ${error.message}`); + }); +}); \ No newline at end of file diff --git a/Build/Build/src/runner.ts b/Build/Build/src/runner.ts new file mode 100644 index 0000000..24cebc1 --- /dev/null +++ b/Build/Build/src/runner.ts @@ -0,0 +1,207 @@ +import { editors } from "./editor"; +import { consoleInterceptor } from "./console"; +import { showError, showLoading, hideLoading, switchOutput } from "./ui"; +import { clearConsole, logConsoleError } from "./console"; +import { saveState } from "./state"; +import * as prettier from "prettier/standalone"; +import * as parserHtml from "prettier/plugins/html"; +import * as parserCss from "prettier/plugins/postcss"; +import * as parserBabel from "prettier/plugins/babel"; // Use Babel instead of Flow +import * as prettierPluginEstree from "prettier/plugins/estree"; + +export function runCode(): void { + showLoading(); + clearConsole(); + try { + const html = editors.html.view.state.doc.toString(); + const css = editors.css.view.state.doc.toString(); + const js = editors.js.view.state.doc.toString(); + + // Pre-parse JS + try { + if (js.trim()) new Function(js); + } catch (syntaxError: any) { + logConsoleError(`SyntaxError: ${syntaxError.message}`); + hideLoading(); + return; + } + + let docContent; + const isFullHtml = /]|', + "", + " +

Hello, HTMLRunner!

+

This is a demo page.

+ + + +``` + +**CSS:** +```css +body { + font-family: Arial, sans-serif; + margin: 20px; + line-height: 1.6; +} +button { + background: #2196f3; + color: white; + border: none; + padding: 10px 15px; + border-radius: 4px; + cursor: pointer; + font-size: 16px; +} +button:hover { + background: #1976d2; +} +``` + +**JavaScript:** +```javascript +function testFunction() { + console.log('Button clicked!'); + console.warn('This is a warning'); + console.error('This is an error'); + console.info('This is an info'); + console.log('Object:', { name: 'Alice', age: 25, hobbies: ['coding', 'reading'] }); +} + +``` + +## Dependencies + +- **Code Editor:** CodeMirror 5 +- **Code Formatting:** Prettier +- **UI Layout:** Split.js for resizable panels +- **Webpack:** for compacting the code + +## 🔧 Development + +### Prerequisites +- Node.js (v18 or higher) +- npm or yarn + +### Local Installation and/or Development Setup +(this is if you want to install locally but not use the single file version, or if you want to contribute.) + +1. **Clone the repository** + ```bash + git clone https://github.com/NellowTCS/HTMLRunner.git + cd HTMLRunner/Build + ``` + +2. **Build** + ``` + ./build.sh + ``` + or (if you also want to build the single file version) + ``` + ./build-all.sh + ``` +3. **Or Build and auto serve locally** + ```bash + npm start + ``` + +### Contributing +1. Fork the repository +2. Create a feature branch (`git checkout -b feature/AmazingFeature`) +3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) +4. Push to the branch (`git push origin feature/AmazingFeature`) +5. Open a Pull Request + +## Browser Support + +HTMLRunner works on all modern browsers: +- ✅ Chrome 80+ +- ✅ Firefox 75+ +- ✅ Safari 13+ +- ✅ Edge 80+ + +## Future Features + +- [ ] **File System Integration** - Save/Load projects from Folders or IndexedDB +- [ ] **Multiple Projects/Files** +- [ ] **Importing Files** +- [ ] **Collaboration Features** - Share code with others +- [ ] **Plugin System** - Extend functionality +- [ ] **More Language Support** - TypeScript, WASM, etc. +- [ ] **Version Control** - Built-in Git integration? +- [ ] **Template Library** - Pre-built code snippets +- [ ] **Performance Profiler** - Analyze code performance +- [ ] **Auto Completion** (using the built in CodeMirror tools) +- [ ] **Code Folding** +- [ ] **Clickable Stack Traces** + +## License + +This project is licensed under the GNU GPL v3.0 License - see the [LICENSE](LICENSE) file for details. + +## Contributing + +Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change. + +--- + +**⭐ If you find HTMLRunner useful, please consider giving it a star on GitHub!** + +For questions, suggestions, or issues, please [open an issue](https://github.com/NellowTCS/HTMLRunner/issues) on GitHub. diff --git a/Build/eslint.config.mjs b/Build/eslint.config.mjs new file mode 100644 index 0000000..73df2be --- /dev/null +++ b/Build/eslint.config.mjs @@ -0,0 +1,15 @@ +import js from "@eslint/js"; +import globals from "globals"; +import json from "@eslint/json"; +import markdown from "@eslint/markdown"; +import css from "@eslint/css"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + { files: ["**/*.{js,mjs,cjs}"], plugins: { js }, extends: ["js/recommended"], languageOptions: { globals: globals.browser } }, + { files: ["**/*.json"], plugins: { json }, language: "json/json", extends: ["json/recommended"] }, + { files: ["**/*.jsonc"], plugins: { json }, language: "json/jsonc", extends: ["json/recommended"] }, + { files: ["**/*.json5"], plugins: { json }, language: "json/json5", extends: ["json/recommended"] }, + { files: ["**/*.md"], plugins: { markdown }, language: "markdown/gfm", extends: ["markdown/recommended"] }, + { files: ["**/*.css"], plugins: { css }, language: "css/css", extends: ["css/recommended"] }, +]); diff --git a/Build/export.mjs b/Build/export.mjs new file mode 100644 index 0000000..64c38ec --- /dev/null +++ b/Build/export.mjs @@ -0,0 +1,37 @@ +import fs from 'fs-extra'; +import path from 'path'; +import rimraf from 'rimraf'; +import { fileURLToPath } from 'url'; + +// ES module __dirname fix +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const root = path.resolve(__dirname, '..'); // repo root +const dist = path.join(__dirname, 'dist'); // build folder + +// Files/folders to keep +const keep = new Set(['README.md', 'LICENSE', 'Build']); + +// Clean repo root (skip hidden files/folders) +fs.readdirSync(root).forEach(file => { + if (!keep.has(file) && !file.startsWith('.')) { // <-- skip hidden + rimraf.sync(path.join(root, file)); + console.log('Deleted:', file); + } +}); + +// Copy each item inside dist individually +fs.readdirSync(dist).forEach(item => { + const srcPath = path.join(dist, item); + const destPath = path.join(root, item); + + // Skip copying if destination exists and is in keep set + if (keep.has(item)) { + console.log(`Skipping copy of ${item} (keep folder/file)`); + return; + } + + fs.copySync(srcPath, destPath, { overwrite: true }); + console.log('Copied:', item); +}); diff --git a/Build/favicon.png b/Build/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b11a5a828374324632986abbeccfea55f8f4d1c1 GIT binary patch literal 145568 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

u(+Ya(Q)bKELRk8>J2S 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 z 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 h + + + + + HTMLRunner + + + + + + + + + + + + + + + + + + +

+
+
+
+
+
+ +
+ + + + + + + + +
+
+
+
+
+
HTML
+
CSS
+
JavaScript
+
+
+ + +
+
+
+
Preview
+
Console
+
+
+ +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/Build/main.js b/Build/main.js new file mode 100644 index 0000000..32c06ef --- /dev/null +++ b/Build/main.js @@ -0,0 +1,34940 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/@babel/runtime/helpers/esm/extends.js": +/*!************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/extends.js ***! + \************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _extends) +/* harmony export */ }); +function _extends() { + return _extends = Object.assign ? Object.assign.bind() : function (n) { + for (var e = 1; e < arguments.length; e++) { + var t = arguments[e]; + for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); + } + return n; + }, _extends.apply(null, arguments); +} + + +/***/ }), + +/***/ "./node_modules/@codemirror/autocomplete/dist/index.js": +/*!*************************************************************!*\ + !*** ./node_modules/@codemirror/autocomplete/dist/index.js ***! + \*************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CompletionContext: () => (/* binding */ CompletionContext), +/* harmony export */ acceptCompletion: () => (/* binding */ acceptCompletion), +/* harmony export */ autocompletion: () => (/* binding */ autocompletion), +/* harmony export */ clearSnippet: () => (/* binding */ clearSnippet), +/* harmony export */ closeBrackets: () => (/* binding */ closeBrackets), +/* harmony export */ closeBracketsKeymap: () => (/* binding */ closeBracketsKeymap), +/* harmony export */ closeCompletion: () => (/* binding */ closeCompletion), +/* harmony export */ completeAnyWord: () => (/* binding */ completeAnyWord), +/* harmony export */ completeFromList: () => (/* binding */ completeFromList), +/* harmony export */ completionKeymap: () => (/* binding */ completionKeymap), +/* harmony export */ completionStatus: () => (/* binding */ completionStatus), +/* harmony export */ currentCompletions: () => (/* binding */ currentCompletions), +/* harmony export */ deleteBracketPair: () => (/* binding */ deleteBracketPair), +/* harmony export */ hasNextSnippetField: () => (/* binding */ hasNextSnippetField), +/* harmony export */ hasPrevSnippetField: () => (/* binding */ hasPrevSnippetField), +/* harmony export */ ifIn: () => (/* binding */ ifIn), +/* harmony export */ ifNotIn: () => (/* binding */ ifNotIn), +/* harmony export */ insertBracket: () => (/* binding */ insertBracket), +/* harmony export */ insertCompletionText: () => (/* binding */ insertCompletionText), +/* harmony export */ moveCompletionSelection: () => (/* binding */ moveCompletionSelection), +/* harmony export */ nextSnippetField: () => (/* binding */ nextSnippetField), +/* harmony export */ pickedCompletion: () => (/* binding */ pickedCompletion), +/* harmony export */ prevSnippetField: () => (/* binding */ prevSnippetField), +/* harmony export */ selectedCompletion: () => (/* binding */ selectedCompletion), +/* harmony export */ selectedCompletionIndex: () => (/* binding */ selectedCompletionIndex), +/* harmony export */ setSelectedCompletion: () => (/* binding */ setSelectedCompletion), +/* harmony export */ snippet: () => (/* binding */ snippet), +/* harmony export */ snippetCompletion: () => (/* binding */ snippetCompletion), +/* harmony export */ snippetKeymap: () => (/* binding */ snippetKeymap), +/* harmony export */ startCompletion: () => (/* binding */ startCompletion) +/* harmony export */ }); +/* harmony import */ var _codemirror_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @codemirror/state */ "./node_modules/@codemirror/state/dist/index.js"); +/* harmony import */ var _codemirror_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @codemirror/view */ "./node_modules/@codemirror/view/dist/index.js"); +/* harmony import */ var _codemirror_language__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @codemirror/language */ "./node_modules/@codemirror/language/dist/index.js"); + + + + +/** +An instance of this is passed to completion source functions. +*/ +class CompletionContext { + /** + Create a new completion context. (Mostly useful for testing + completion sources—in the editor, the extension will create + these for you.) + */ + constructor( + /** + The editor state that the completion happens in. + */ + state, + /** + The position at which the completion is happening. + */ + pos, + /** + Indicates whether completion was activated explicitly, or + implicitly by typing. The usual way to respond to this is to + only return completions when either there is part of a + completable entity before the cursor, or `explicit` is true. + */ + explicit, + /** + The editor view. May be undefined if the context was created + in a situation where there is no such view available, such as + in synchronous updates via + [`CompletionResult.update`](https://codemirror.net/6/docs/ref/#autocomplete.CompletionResult.update) + or when called by test code. + */ + view) { + this.state = state; + this.pos = pos; + this.explicit = explicit; + this.view = view; + /** + @internal + */ + this.abortListeners = []; + /** + @internal + */ + this.abortOnDocChange = false; + } + /** + Get the extent, content, and (if there is a token) type of the + token before `this.pos`. + */ + tokenBefore(types) { + let token = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.syntaxTree)(this.state).resolveInner(this.pos, -1); + while (token && types.indexOf(token.name) < 0) + token = token.parent; + return token ? { from: token.from, to: this.pos, + text: this.state.sliceDoc(token.from, this.pos), + type: token.type } : null; + } + /** + Get the match of the given expression directly before the + cursor. + */ + matchBefore(expr) { + let line = this.state.doc.lineAt(this.pos); + let start = Math.max(line.from, this.pos - 250); + let str = line.text.slice(start - line.from, this.pos - line.from); + let found = str.search(ensureAnchor(expr, false)); + return found < 0 ? null : { from: start + found, to: this.pos, text: str.slice(found) }; + } + /** + Yields true when the query has been aborted. Can be useful in + asynchronous queries to avoid doing work that will be ignored. + */ + get aborted() { return this.abortListeners == null; } + /** + Allows you to register abort handlers, which will be called when + the query is + [aborted](https://codemirror.net/6/docs/ref/#autocomplete.CompletionContext.aborted). + + By default, running queries will not be aborted for regular + typing or backspacing, on the assumption that they are likely to + return a result with a + [`validFor`](https://codemirror.net/6/docs/ref/#autocomplete.CompletionResult.validFor) field that + allows the result to be used after all. Passing `onDocChange: + true` will cause this query to be aborted for any document + change. + */ + addEventListener(type, listener, options) { + if (type == "abort" && this.abortListeners) { + this.abortListeners.push(listener); + if (options && options.onDocChange) + this.abortOnDocChange = true; + } + } +} +function toSet(chars) { + let flat = Object.keys(chars).join(""); + let words = /\w/.test(flat); + if (words) + flat = flat.replace(/\w/g, ""); + return `[${words ? "\\w" : ""}${flat.replace(/[^\w\s]/g, "\\$&")}]`; +} +function prefixMatch(options) { + let first = Object.create(null), rest = Object.create(null); + for (let { label } of options) { + first[label[0]] = true; + for (let i = 1; i < label.length; i++) + rest[label[i]] = true; + } + let source = toSet(first) + toSet(rest) + "*$"; + return [new RegExp("^" + source), new RegExp(source)]; +} +/** +Given a a fixed array of options, return an autocompleter that +completes them. +*/ +function completeFromList(list) { + let options = list.map(o => typeof o == "string" ? { label: o } : o); + let [validFor, match] = options.every(o => /^\w+$/.test(o.label)) ? [/\w*$/, /\w+$/] : prefixMatch(options); + return (context) => { + let token = context.matchBefore(match); + return token || context.explicit ? { from: token ? token.from : context.pos, options, validFor } : null; + }; +} +/** +Wrap the given completion source so that it will only fire when the +cursor is in a syntax node with one of the given names. +*/ +function ifIn(nodes, source) { + return (context) => { + for (let pos = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.syntaxTree)(context.state).resolveInner(context.pos, -1); pos; pos = pos.parent) { + if (nodes.indexOf(pos.name) > -1) + return source(context); + if (pos.type.isTop) + break; + } + return null; + }; +} +/** +Wrap the given completion source so that it will not fire when the +cursor is in a syntax node with one of the given names. +*/ +function ifNotIn(nodes, source) { + return (context) => { + for (let pos = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.syntaxTree)(context.state).resolveInner(context.pos, -1); pos; pos = pos.parent) { + if (nodes.indexOf(pos.name) > -1) + return null; + if (pos.type.isTop) + break; + } + return source(context); + }; +} +class Option { + constructor(completion, source, match, score) { + this.completion = completion; + this.source = source; + this.match = match; + this.score = score; + } +} +function cur(state) { return state.selection.main.from; } +// Make sure the given regexp has a $ at its end and, if `start` is +// true, a ^ at its start. +function ensureAnchor(expr, start) { + var _a; + let { source } = expr; + let addStart = start && source[0] != "^", addEnd = source[source.length - 1] != "$"; + if (!addStart && !addEnd) + return expr; + return new RegExp(`${addStart ? "^" : ""}(?:${source})${addEnd ? "$" : ""}`, (_a = expr.flags) !== null && _a !== void 0 ? _a : (expr.ignoreCase ? "i" : "")); +} +/** +This annotation is added to transactions that are produced by +picking a completion. +*/ +const pickedCompletion = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Annotation.define(); +/** +Helper function that returns a transaction spec which inserts a +completion's text in the main selection range, and any other +selection range that has the same text in front of it. +*/ +function insertCompletionText(state, text, from, to) { + let { main } = state.selection, fromOff = from - main.from, toOff = to - main.from; + return Object.assign(Object.assign({}, state.changeByRange(range => { + if (range != main && from != to && + state.sliceDoc(range.from + fromOff, range.from + toOff) != state.sliceDoc(from, to)) + return { range }; + let lines = state.toText(text); + return { + changes: { from: range.from + fromOff, to: to == main.from ? range.to : range.from + toOff, insert: lines }, + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.from + fromOff + lines.length) + }; + })), { scrollIntoView: true, userEvent: "input.complete" }); +} +const SourceCache = /*@__PURE__*/new WeakMap(); +function asSource(source) { + if (!Array.isArray(source)) + return source; + let known = SourceCache.get(source); + if (!known) + SourceCache.set(source, known = completeFromList(source)); + return known; +} +const startCompletionEffect = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define(); +const closeCompletionEffect = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define(); + +// A pattern matcher for fuzzy completion matching. Create an instance +// once for a pattern, and then use that to match any number of +// completions. +class FuzzyMatcher { + constructor(pattern) { + this.pattern = pattern; + this.chars = []; + this.folded = []; + // Buffers reused by calls to `match` to track matched character + // positions. + this.any = []; + this.precise = []; + this.byWord = []; + this.score = 0; + this.matched = []; + for (let p = 0; p < pattern.length;) { + let char = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(pattern, p), size = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)(char); + this.chars.push(char); + let part = pattern.slice(p, p + size), upper = part.toUpperCase(); + this.folded.push((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(upper == part ? part.toLowerCase() : upper, 0)); + p += size; + } + this.astral = pattern.length != this.chars.length; + } + ret(score, matched) { + this.score = score; + this.matched = matched; + return this; + } + // Matches a given word (completion) against the pattern (input). + // Will return a boolean indicating whether there was a match and, + // on success, set `this.score` to the score, `this.matched` to an + // array of `from, to` pairs indicating the matched parts of `word`. + // + // The score is a number that is more negative the worse the match + // is. See `Penalty` above. + match(word) { + if (this.pattern.length == 0) + return this.ret(-100 /* Penalty.NotFull */, []); + if (word.length < this.pattern.length) + return null; + let { chars, folded, any, precise, byWord } = this; + // For single-character queries, only match when they occur right + // at the start + if (chars.length == 1) { + let first = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(word, 0), firstSize = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)(first); + let score = firstSize == word.length ? 0 : -100 /* Penalty.NotFull */; + if (first == chars[0]) ; + else if (first == folded[0]) + score += -200 /* Penalty.CaseFold */; + else + return null; + return this.ret(score, [0, firstSize]); + } + let direct = word.indexOf(this.pattern); + if (direct == 0) + return this.ret(word.length == this.pattern.length ? 0 : -100 /* Penalty.NotFull */, [0, this.pattern.length]); + let len = chars.length, anyTo = 0; + if (direct < 0) { + for (let i = 0, e = Math.min(word.length, 200); i < e && anyTo < len;) { + let next = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(word, i); + if (next == chars[anyTo] || next == folded[anyTo]) + any[anyTo++] = i; + i += (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)(next); + } + // No match, exit immediately + if (anyTo < len) + return null; + } + // This tracks the extent of the precise (non-folded, not + // necessarily adjacent) match + let preciseTo = 0; + // Tracks whether there is a match that hits only characters that + // appear to be starting words. `byWordFolded` is set to true when + // a case folded character is encountered in such a match + let byWordTo = 0, byWordFolded = false; + // If we've found a partial adjacent match, these track its state + let adjacentTo = 0, adjacentStart = -1, adjacentEnd = -1; + let hasLower = /[a-z]/.test(word), wordAdjacent = true; + // Go over the option's text, scanning for the various kinds of matches + for (let i = 0, e = Math.min(word.length, 200), prevType = 0 /* Tp.NonWord */; i < e && byWordTo < len;) { + let next = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(word, i); + if (direct < 0) { + if (preciseTo < len && next == chars[preciseTo]) + precise[preciseTo++] = i; + if (adjacentTo < len) { + if (next == chars[adjacentTo] || next == folded[adjacentTo]) { + if (adjacentTo == 0) + adjacentStart = i; + adjacentEnd = i + 1; + adjacentTo++; + } + else { + adjacentTo = 0; + } + } + } + let ch, type = next < 0xff + ? (next >= 48 && next <= 57 || next >= 97 && next <= 122 ? 2 /* Tp.Lower */ : next >= 65 && next <= 90 ? 1 /* Tp.Upper */ : 0 /* Tp.NonWord */) + : ((ch = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.fromCodePoint)(next)) != ch.toLowerCase() ? 1 /* Tp.Upper */ : ch != ch.toUpperCase() ? 2 /* Tp.Lower */ : 0 /* Tp.NonWord */); + if (!i || type == 1 /* Tp.Upper */ && hasLower || prevType == 0 /* Tp.NonWord */ && type != 0 /* Tp.NonWord */) { + if (chars[byWordTo] == next || (folded[byWordTo] == next && (byWordFolded = true))) + byWord[byWordTo++] = i; + else if (byWord.length) + wordAdjacent = false; + } + prevType = type; + i += (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)(next); + } + if (byWordTo == len && byWord[0] == 0 && wordAdjacent) + return this.result(-100 /* Penalty.ByWord */ + (byWordFolded ? -200 /* Penalty.CaseFold */ : 0), byWord, word); + if (adjacentTo == len && adjacentStart == 0) + return this.ret(-200 /* Penalty.CaseFold */ - word.length + (adjacentEnd == word.length ? 0 : -100 /* Penalty.NotFull */), [0, adjacentEnd]); + if (direct > -1) + return this.ret(-700 /* Penalty.NotStart */ - word.length, [direct, direct + this.pattern.length]); + if (adjacentTo == len) + return this.ret(-200 /* Penalty.CaseFold */ + -700 /* Penalty.NotStart */ - word.length, [adjacentStart, adjacentEnd]); + if (byWordTo == len) + return this.result(-100 /* Penalty.ByWord */ + (byWordFolded ? -200 /* Penalty.CaseFold */ : 0) + -700 /* Penalty.NotStart */ + + (wordAdjacent ? 0 : -1100 /* Penalty.Gap */), byWord, word); + return chars.length == 2 ? null + : this.result((any[0] ? -700 /* Penalty.NotStart */ : 0) + -200 /* Penalty.CaseFold */ + -1100 /* Penalty.Gap */, any, word); + } + result(score, positions, word) { + let result = [], i = 0; + for (let pos of positions) { + let to = pos + (this.astral ? (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(word, pos)) : 1); + if (i && result[i - 1] == pos) + result[i - 1] = to; + else { + result[i++] = pos; + result[i++] = to; + } + } + return this.ret(score - word.length, result); + } +} +class StrictMatcher { + constructor(pattern) { + this.pattern = pattern; + this.matched = []; + this.score = 0; + this.folded = pattern.toLowerCase(); + } + match(word) { + if (word.length < this.pattern.length) + return null; + let start = word.slice(0, this.pattern.length); + let match = start == this.pattern ? 0 : start.toLowerCase() == this.folded ? -200 /* Penalty.CaseFold */ : null; + if (match == null) + return null; + this.matched = [0, start.length]; + this.score = match + (word.length == this.pattern.length ? 0 : -100 /* Penalty.NotFull */); + return this; + } +} + +const completionConfig = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Facet.define({ + combine(configs) { + return (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.combineConfig)(configs, { + activateOnTyping: true, + activateOnCompletion: () => false, + activateOnTypingDelay: 100, + selectOnOpen: true, + override: null, + closeOnBlur: true, + maxRenderedOptions: 100, + defaultKeymap: true, + tooltipClass: () => "", + optionClass: () => "", + aboveCursor: false, + icons: true, + addToOptions: [], + positionInfo: defaultPositionInfo, + filterStrict: false, + compareCompletions: (a, b) => a.label.localeCompare(b.label), + interactionDelay: 75, + updateSyncTime: 100 + }, { + defaultKeymap: (a, b) => a && b, + closeOnBlur: (a, b) => a && b, + icons: (a, b) => a && b, + tooltipClass: (a, b) => c => joinClass(a(c), b(c)), + optionClass: (a, b) => c => joinClass(a(c), b(c)), + addToOptions: (a, b) => a.concat(b), + filterStrict: (a, b) => a || b, + }); + } +}); +function joinClass(a, b) { + return a ? b ? a + " " + b : a : b; +} +function defaultPositionInfo(view, list, option, info, space, tooltip) { + let rtl = view.textDirection == _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Direction.RTL, left = rtl, narrow = false; + let side = "top", offset, maxWidth; + let spaceLeft = list.left - space.left, spaceRight = space.right - list.right; + let infoWidth = info.right - info.left, infoHeight = info.bottom - info.top; + if (left && spaceLeft < Math.min(infoWidth, spaceRight)) + left = false; + else if (!left && spaceRight < Math.min(infoWidth, spaceLeft)) + left = true; + if (infoWidth <= (left ? spaceLeft : spaceRight)) { + offset = Math.max(space.top, Math.min(option.top, space.bottom - infoHeight)) - list.top; + maxWidth = Math.min(400 /* Info.Width */, left ? spaceLeft : spaceRight); + } + else { + narrow = true; + maxWidth = Math.min(400 /* Info.Width */, (rtl ? list.right : space.right - list.left) - 30 /* Info.Margin */); + let spaceBelow = space.bottom - list.bottom; + if (spaceBelow >= infoHeight || spaceBelow > list.top) { // Below the completion + offset = option.bottom - list.top; + } + else { // Above it + side = "bottom"; + offset = list.bottom - option.top; + } + } + let scaleY = (list.bottom - list.top) / tooltip.offsetHeight; + let scaleX = (list.right - list.left) / tooltip.offsetWidth; + return { + style: `${side}: ${offset / scaleY}px; max-width: ${maxWidth / scaleX}px`, + class: "cm-completionInfo-" + (narrow ? (rtl ? "left-narrow" : "right-narrow") : left ? "left" : "right") + }; +} + +function optionContent(config) { + let content = config.addToOptions.slice(); + if (config.icons) + content.push({ + render(completion) { + let icon = document.createElement("div"); + icon.classList.add("cm-completionIcon"); + if (completion.type) + icon.classList.add(...completion.type.split(/\s+/g).map(cls => "cm-completionIcon-" + cls)); + icon.setAttribute("aria-hidden", "true"); + return icon; + }, + position: 20 + }); + content.push({ + render(completion, _s, _v, match) { + let labelElt = document.createElement("span"); + labelElt.className = "cm-completionLabel"; + let label = completion.displayLabel || completion.label, off = 0; + for (let j = 0; j < match.length;) { + let from = match[j++], to = match[j++]; + if (from > off) + labelElt.appendChild(document.createTextNode(label.slice(off, from))); + let span = labelElt.appendChild(document.createElement("span")); + span.appendChild(document.createTextNode(label.slice(from, to))); + span.className = "cm-completionMatchedText"; + off = to; + } + if (off < label.length) + labelElt.appendChild(document.createTextNode(label.slice(off))); + return labelElt; + }, + position: 50 + }, { + render(completion) { + if (!completion.detail) + return null; + let detailElt = document.createElement("span"); + detailElt.className = "cm-completionDetail"; + detailElt.textContent = completion.detail; + return detailElt; + }, + position: 80 + }); + return content.sort((a, b) => a.position - b.position).map(a => a.render); +} +function rangeAroundSelected(total, selected, max) { + if (total <= max) + return { from: 0, to: total }; + if (selected < 0) + selected = 0; + if (selected <= (total >> 1)) { + let off = Math.floor(selected / max); + return { from: off * max, to: (off + 1) * max }; + } + let off = Math.floor((total - selected) / max); + return { from: total - (off + 1) * max, to: total - off * max }; +} +class CompletionTooltip { + constructor(view, stateField, applyCompletion) { + this.view = view; + this.stateField = stateField; + this.applyCompletion = applyCompletion; + this.info = null; + this.infoDestroy = null; + this.placeInfoReq = { + read: () => this.measureInfo(), + write: (pos) => this.placeInfo(pos), + key: this + }; + this.space = null; + this.currentClass = ""; + let cState = view.state.field(stateField); + let { options, selected } = cState.open; + let config = view.state.facet(completionConfig); + this.optionContent = optionContent(config); + this.optionClass = config.optionClass; + this.tooltipClass = config.tooltipClass; + this.range = rangeAroundSelected(options.length, selected, config.maxRenderedOptions); + this.dom = document.createElement("div"); + this.dom.className = "cm-tooltip-autocomplete"; + this.updateTooltipClass(view.state); + this.dom.addEventListener("mousedown", (e) => { + let { options } = view.state.field(stateField).open; + for (let dom = e.target, match; dom && dom != this.dom; dom = dom.parentNode) { + if (dom.nodeName == "LI" && (match = /-(\d+)$/.exec(dom.id)) && +match[1] < options.length) { + this.applyCompletion(view, options[+match[1]]); + e.preventDefault(); + return; + } + } + }); + this.dom.addEventListener("focusout", (e) => { + let state = view.state.field(this.stateField, false); + if (state && state.tooltip && view.state.facet(completionConfig).closeOnBlur && + e.relatedTarget != view.contentDOM) + view.dispatch({ effects: closeCompletionEffect.of(null) }); + }); + this.showOptions(options, cState.id); + } + mount() { this.updateSel(); } + showOptions(options, id) { + if (this.list) + this.list.remove(); + this.list = this.dom.appendChild(this.createListBox(options, id, this.range)); + this.list.addEventListener("scroll", () => { + if (this.info) + this.view.requestMeasure(this.placeInfoReq); + }); + } + update(update) { + var _a; + let cState = update.state.field(this.stateField); + let prevState = update.startState.field(this.stateField); + this.updateTooltipClass(update.state); + if (cState != prevState) { + let { options, selected, disabled } = cState.open; + if (!prevState.open || prevState.open.options != options) { + this.range = rangeAroundSelected(options.length, selected, update.state.facet(completionConfig).maxRenderedOptions); + this.showOptions(options, cState.id); + } + this.updateSel(); + if (disabled != ((_a = prevState.open) === null || _a === void 0 ? void 0 : _a.disabled)) + this.dom.classList.toggle("cm-tooltip-autocomplete-disabled", !!disabled); + } + } + updateTooltipClass(state) { + let cls = this.tooltipClass(state); + if (cls != this.currentClass) { + for (let c of this.currentClass.split(" ")) + if (c) + this.dom.classList.remove(c); + for (let c of cls.split(" ")) + if (c) + this.dom.classList.add(c); + this.currentClass = cls; + } + } + positioned(space) { + this.space = space; + if (this.info) + this.view.requestMeasure(this.placeInfoReq); + } + updateSel() { + let cState = this.view.state.field(this.stateField), open = cState.open; + if (open.selected > -1 && open.selected < this.range.from || open.selected >= this.range.to) { + this.range = rangeAroundSelected(open.options.length, open.selected, this.view.state.facet(completionConfig).maxRenderedOptions); + this.showOptions(open.options, cState.id); + } + if (this.updateSelectedOption(open.selected)) { + this.destroyInfo(); + let { completion } = open.options[open.selected]; + let { info } = completion; + if (!info) + return; + let infoResult = typeof info === "string" ? document.createTextNode(info) : info(completion); + if (!infoResult) + return; + if ("then" in infoResult) { + infoResult.then(obj => { + if (obj && this.view.state.field(this.stateField, false) == cState) + this.addInfoPane(obj, completion); + }).catch(e => (0,_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.logException)(this.view.state, e, "completion info")); + } + else { + this.addInfoPane(infoResult, completion); + } + } + } + addInfoPane(content, completion) { + this.destroyInfo(); + let wrap = this.info = document.createElement("div"); + wrap.className = "cm-tooltip cm-completionInfo"; + if (content.nodeType != null) { + wrap.appendChild(content); + this.infoDestroy = null; + } + else { + let { dom, destroy } = content; + wrap.appendChild(dom); + this.infoDestroy = destroy || null; + } + this.dom.appendChild(wrap); + this.view.requestMeasure(this.placeInfoReq); + } + updateSelectedOption(selected) { + let set = null; + for (let opt = this.list.firstChild, i = this.range.from; opt; opt = opt.nextSibling, i++) { + if (opt.nodeName != "LI" || !opt.id) { + i--; // A section header + } + else if (i == selected) { + if (!opt.hasAttribute("aria-selected")) { + opt.setAttribute("aria-selected", "true"); + set = opt; + } + } + else { + if (opt.hasAttribute("aria-selected")) + opt.removeAttribute("aria-selected"); + } + } + if (set) + scrollIntoView(this.list, set); + return set; + } + measureInfo() { + let sel = this.dom.querySelector("[aria-selected]"); + if (!sel || !this.info) + return null; + let listRect = this.dom.getBoundingClientRect(); + let infoRect = this.info.getBoundingClientRect(); + let selRect = sel.getBoundingClientRect(); + let space = this.space; + if (!space) { + let docElt = this.dom.ownerDocument.documentElement; + space = { left: 0, top: 0, right: docElt.clientWidth, bottom: docElt.clientHeight }; + } + if (selRect.top > Math.min(space.bottom, listRect.bottom) - 10 || + selRect.bottom < Math.max(space.top, listRect.top) + 10) + return null; + return this.view.state.facet(completionConfig).positionInfo(this.view, listRect, selRect, infoRect, space, this.dom); + } + placeInfo(pos) { + if (this.info) { + if (pos) { + if (pos.style) + this.info.style.cssText = pos.style; + this.info.className = "cm-tooltip cm-completionInfo " + (pos.class || ""); + } + else { + this.info.style.cssText = "top: -1e6px"; + } + } + } + createListBox(options, id, range) { + const ul = document.createElement("ul"); + ul.id = id; + ul.setAttribute("role", "listbox"); + ul.setAttribute("aria-expanded", "true"); + ul.setAttribute("aria-label", this.view.state.phrase("Completions")); + ul.addEventListener("mousedown", e => { + // Prevent focus change when clicking the scrollbar + if (e.target == ul) + e.preventDefault(); + }); + let curSection = null; + for (let i = range.from; i < range.to; i++) { + let { completion, match } = options[i], { section } = completion; + if (section) { + let name = typeof section == "string" ? section : section.name; + if (name != curSection && (i > range.from || range.from == 0)) { + curSection = name; + if (typeof section != "string" && section.header) { + ul.appendChild(section.header(section)); + } + else { + let header = ul.appendChild(document.createElement("completion-section")); + header.textContent = name; + } + } + } + const li = ul.appendChild(document.createElement("li")); + li.id = id + "-" + i; + li.setAttribute("role", "option"); + let cls = this.optionClass(completion); + if (cls) + li.className = cls; + for (let source of this.optionContent) { + let node = source(completion, this.view.state, this.view, match); + if (node) + li.appendChild(node); + } + } + if (range.from) + ul.classList.add("cm-completionListIncompleteTop"); + if (range.to < options.length) + ul.classList.add("cm-completionListIncompleteBottom"); + return ul; + } + destroyInfo() { + if (this.info) { + if (this.infoDestroy) + this.infoDestroy(); + this.info.remove(); + this.info = null; + } + } + destroy() { + this.destroyInfo(); + } +} +function completionTooltip(stateField, applyCompletion) { + return (view) => new CompletionTooltip(view, stateField, applyCompletion); +} +function scrollIntoView(container, element) { + let parent = container.getBoundingClientRect(); + let self = element.getBoundingClientRect(); + let scaleY = parent.height / container.offsetHeight; + if (self.top < parent.top) + container.scrollTop -= (parent.top - self.top) / scaleY; + else if (self.bottom > parent.bottom) + container.scrollTop += (self.bottom - parent.bottom) / scaleY; +} + +// Used to pick a preferred option when two options with the same +// label occur in the result. +function score(option) { + return (option.boost || 0) * 100 + (option.apply ? 10 : 0) + (option.info ? 5 : 0) + + (option.type ? 1 : 0); +} +function sortOptions(active, state) { + let options = []; + let sections = null; + let addOption = (option) => { + options.push(option); + let { section } = option.completion; + if (section) { + if (!sections) + sections = []; + let name = typeof section == "string" ? section : section.name; + if (!sections.some(s => s.name == name)) + sections.push(typeof section == "string" ? { name } : section); + } + }; + let conf = state.facet(completionConfig); + for (let a of active) + if (a.hasResult()) { + let getMatch = a.result.getMatch; + if (a.result.filter === false) { + for (let option of a.result.options) { + addOption(new Option(option, a.source, getMatch ? getMatch(option) : [], 1e9 - options.length)); + } + } + else { + let pattern = state.sliceDoc(a.from, a.to), match; + let matcher = conf.filterStrict ? new StrictMatcher(pattern) : new FuzzyMatcher(pattern); + for (let option of a.result.options) + if (match = matcher.match(option.label)) { + let matched = !option.displayLabel ? match.matched : getMatch ? getMatch(option, match.matched) : []; + addOption(new Option(option, a.source, matched, match.score + (option.boost || 0))); + } + } + } + if (sections) { + let sectionOrder = Object.create(null), pos = 0; + let cmp = (a, b) => { var _a, _b; return ((_a = a.rank) !== null && _a !== void 0 ? _a : 1e9) - ((_b = b.rank) !== null && _b !== void 0 ? _b : 1e9) || (a.name < b.name ? -1 : 1); }; + for (let s of sections.sort(cmp)) { + pos -= 1e5; + sectionOrder[s.name] = pos; + } + for (let option of options) { + let { section } = option.completion; + if (section) + option.score += sectionOrder[typeof section == "string" ? section : section.name]; + } + } + let result = [], prev = null; + let compare = conf.compareCompletions; + for (let opt of options.sort((a, b) => (b.score - a.score) || compare(a.completion, b.completion))) { + let cur = opt.completion; + if (!prev || prev.label != cur.label || prev.detail != cur.detail || + (prev.type != null && cur.type != null && prev.type != cur.type) || + prev.apply != cur.apply || prev.boost != cur.boost) + result.push(opt); + else if (score(opt.completion) > score(prev)) + result[result.length - 1] = opt; + prev = opt.completion; + } + return result; +} +class CompletionDialog { + constructor(options, attrs, tooltip, timestamp, selected, disabled) { + this.options = options; + this.attrs = attrs; + this.tooltip = tooltip; + this.timestamp = timestamp; + this.selected = selected; + this.disabled = disabled; + } + setSelected(selected, id) { + return selected == this.selected || selected >= this.options.length ? this + : new CompletionDialog(this.options, makeAttrs(id, selected), this.tooltip, this.timestamp, selected, this.disabled); + } + static build(active, state, id, prev, conf, didSetActive) { + if (prev && !didSetActive && active.some(s => s.isPending)) + return prev.setDisabled(); + let options = sortOptions(active, state); + if (!options.length) + return prev && active.some(a => a.isPending) ? prev.setDisabled() : null; + let selected = state.facet(completionConfig).selectOnOpen ? 0 : -1; + if (prev && prev.selected != selected && prev.selected != -1) { + let selectedValue = prev.options[prev.selected].completion; + for (let i = 0; i < options.length; i++) + if (options[i].completion == selectedValue) { + selected = i; + break; + } + } + return new CompletionDialog(options, makeAttrs(id, selected), { + pos: active.reduce((a, b) => b.hasResult() ? Math.min(a, b.from) : a, 1e8), + create: createTooltip, + above: conf.aboveCursor, + }, prev ? prev.timestamp : Date.now(), selected, false); + } + map(changes) { + return new CompletionDialog(this.options, this.attrs, Object.assign(Object.assign({}, this.tooltip), { pos: changes.mapPos(this.tooltip.pos) }), this.timestamp, this.selected, this.disabled); + } + setDisabled() { + return new CompletionDialog(this.options, this.attrs, this.tooltip, this.timestamp, this.selected, true); + } +} +class CompletionState { + constructor(active, id, open) { + this.active = active; + this.id = id; + this.open = open; + } + static start() { + return new CompletionState(none, "cm-ac-" + Math.floor(Math.random() * 2e6).toString(36), null); + } + update(tr) { + let { state } = tr, conf = state.facet(completionConfig); + let sources = conf.override || + state.languageDataAt("autocomplete", cur(state)).map(asSource); + let active = sources.map(source => { + let value = this.active.find(s => s.source == source) || + new ActiveSource(source, this.active.some(a => a.state != 0 /* State.Inactive */) ? 1 /* State.Pending */ : 0 /* State.Inactive */); + return value.update(tr, conf); + }); + if (active.length == this.active.length && active.every((a, i) => a == this.active[i])) + active = this.active; + let open = this.open, didSet = tr.effects.some(e => e.is(setActiveEffect)); + if (open && tr.docChanged) + open = open.map(tr.changes); + if (tr.selection || active.some(a => a.hasResult() && tr.changes.touchesRange(a.from, a.to)) || + !sameResults(active, this.active) || didSet) + open = CompletionDialog.build(active, state, this.id, open, conf, didSet); + else if (open && open.disabled && !active.some(a => a.isPending)) + open = null; + if (!open && active.every(a => !a.isPending) && active.some(a => a.hasResult())) + active = active.map(a => a.hasResult() ? new ActiveSource(a.source, 0 /* State.Inactive */) : a); + for (let effect of tr.effects) + if (effect.is(setSelectedEffect)) + open = open && open.setSelected(effect.value, this.id); + return active == this.active && open == this.open ? this : new CompletionState(active, this.id, open); + } + get tooltip() { return this.open ? this.open.tooltip : null; } + get attrs() { return this.open ? this.open.attrs : this.active.length ? baseAttrs : noAttrs; } +} +function sameResults(a, b) { + if (a == b) + return true; + for (let iA = 0, iB = 0;;) { + while (iA < a.length && !a[iA].hasResult()) + iA++; + while (iB < b.length && !b[iB].hasResult()) + iB++; + let endA = iA == a.length, endB = iB == b.length; + if (endA || endB) + return endA == endB; + if (a[iA++].result != b[iB++].result) + return false; + } +} +const baseAttrs = { + "aria-autocomplete": "list" +}; +const noAttrs = {}; +function makeAttrs(id, selected) { + let result = { + "aria-autocomplete": "list", + "aria-haspopup": "listbox", + "aria-controls": id + }; + if (selected > -1) + result["aria-activedescendant"] = id + "-" + selected; + return result; +} +const none = []; +function getUpdateType(tr, conf) { + if (tr.isUserEvent("input.complete")) { + let completion = tr.annotation(pickedCompletion); + if (completion && conf.activateOnCompletion(completion)) + return 4 /* UpdateType.Activate */ | 8 /* UpdateType.Reset */; + } + let typing = tr.isUserEvent("input.type"); + return typing && conf.activateOnTyping ? 4 /* UpdateType.Activate */ | 1 /* UpdateType.Typing */ + : typing ? 1 /* UpdateType.Typing */ + : tr.isUserEvent("delete.backward") ? 2 /* UpdateType.Backspacing */ + : tr.selection ? 8 /* UpdateType.Reset */ + : tr.docChanged ? 16 /* UpdateType.ResetIfTouching */ : 0 /* UpdateType.None */; +} +class ActiveSource { + constructor(source, state, explicit = false) { + this.source = source; + this.state = state; + this.explicit = explicit; + } + hasResult() { return false; } + get isPending() { return this.state == 1 /* State.Pending */; } + update(tr, conf) { + let type = getUpdateType(tr, conf), value = this; + if ((type & 8 /* UpdateType.Reset */) || (type & 16 /* UpdateType.ResetIfTouching */) && this.touches(tr)) + value = new ActiveSource(value.source, 0 /* State.Inactive */); + if ((type & 4 /* UpdateType.Activate */) && value.state == 0 /* State.Inactive */) + value = new ActiveSource(this.source, 1 /* State.Pending */); + value = value.updateFor(tr, type); + for (let effect of tr.effects) { + if (effect.is(startCompletionEffect)) + value = new ActiveSource(value.source, 1 /* State.Pending */, effect.value); + else if (effect.is(closeCompletionEffect)) + value = new ActiveSource(value.source, 0 /* State.Inactive */); + else if (effect.is(setActiveEffect)) + for (let active of effect.value) + if (active.source == value.source) + value = active; + } + return value; + } + updateFor(tr, type) { return this.map(tr.changes); } + map(changes) { return this; } + touches(tr) { + return tr.changes.touchesRange(cur(tr.state)); + } +} +class ActiveResult extends ActiveSource { + constructor(source, explicit, limit, result, from, to) { + super(source, 3 /* State.Result */, explicit); + this.limit = limit; + this.result = result; + this.from = from; + this.to = to; + } + hasResult() { return true; } + updateFor(tr, type) { + var _a; + if (!(type & 3 /* UpdateType.SimpleInteraction */)) + return this.map(tr.changes); + let result = this.result; + if (result.map && !tr.changes.empty) + result = result.map(result, tr.changes); + let from = tr.changes.mapPos(this.from), to = tr.changes.mapPos(this.to, 1); + let pos = cur(tr.state); + if (pos > to || !result || + (type & 2 /* UpdateType.Backspacing */) && (cur(tr.startState) == this.from || pos < this.limit)) + return new ActiveSource(this.source, type & 4 /* UpdateType.Activate */ ? 1 /* State.Pending */ : 0 /* State.Inactive */); + let limit = tr.changes.mapPos(this.limit); + if (checkValid(result.validFor, tr.state, from, to)) + return new ActiveResult(this.source, this.explicit, limit, result, from, to); + if (result.update && + (result = result.update(result, from, to, new CompletionContext(tr.state, pos, false)))) + return new ActiveResult(this.source, this.explicit, limit, result, result.from, (_a = result.to) !== null && _a !== void 0 ? _a : cur(tr.state)); + return new ActiveSource(this.source, 1 /* State.Pending */, this.explicit); + } + map(mapping) { + if (mapping.empty) + return this; + let result = this.result.map ? this.result.map(this.result, mapping) : this.result; + if (!result) + return new ActiveSource(this.source, 0 /* State.Inactive */); + return new ActiveResult(this.source, this.explicit, mapping.mapPos(this.limit), this.result, mapping.mapPos(this.from), mapping.mapPos(this.to, 1)); + } + touches(tr) { + return tr.changes.touchesRange(this.from, this.to); + } +} +function checkValid(validFor, state, from, to) { + if (!validFor) + return false; + let text = state.sliceDoc(from, to); + return typeof validFor == "function" ? validFor(text, from, to, state) : ensureAnchor(validFor, true).test(text); +} +const setActiveEffect = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define({ + map(sources, mapping) { return sources.map(s => s.map(mapping)); } +}); +const setSelectedEffect = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define(); +const completionState = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateField.define({ + create() { return CompletionState.start(); }, + update(value, tr) { return value.update(tr); }, + provide: f => [ + _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.showTooltip.from(f, val => val.tooltip), + _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.contentAttributes.from(f, state => state.attrs) + ] +}); +function applyCompletion(view, option) { + const apply = option.completion.apply || option.completion.label; + let result = view.state.field(completionState).active.find(a => a.source == option.source); + if (!(result instanceof ActiveResult)) + return false; + if (typeof apply == "string") + view.dispatch(Object.assign(Object.assign({}, insertCompletionText(view.state, apply, result.from, result.to)), { annotations: pickedCompletion.of(option.completion) })); + else + apply(view, option.completion, result.from, result.to); + return true; +} +const createTooltip = /*@__PURE__*/completionTooltip(completionState, applyCompletion); + +/** +Returns a command that moves the completion selection forward or +backward by the given amount. +*/ +function moveCompletionSelection(forward, by = "option") { + return (view) => { + let cState = view.state.field(completionState, false); + if (!cState || !cState.open || cState.open.disabled || + Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay) + return false; + let step = 1, tooltip; + if (by == "page" && (tooltip = (0,_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.getTooltip)(view, cState.open.tooltip))) + step = Math.max(2, Math.floor(tooltip.dom.offsetHeight / + tooltip.dom.querySelector("li").offsetHeight) - 1); + let { length } = cState.open.options; + let selected = cState.open.selected > -1 ? cState.open.selected + step * (forward ? 1 : -1) : forward ? 0 : length - 1; + if (selected < 0) + selected = by == "page" ? 0 : length - 1; + else if (selected >= length) + selected = by == "page" ? length - 1 : 0; + view.dispatch({ effects: setSelectedEffect.of(selected) }); + return true; + }; +} +/** +Accept the current completion. +*/ +const acceptCompletion = (view) => { + let cState = view.state.field(completionState, false); + if (view.state.readOnly || !cState || !cState.open || cState.open.selected < 0 || cState.open.disabled || + Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay) + return false; + return applyCompletion(view, cState.open.options[cState.open.selected]); +}; +/** +Explicitly start autocompletion. +*/ +const startCompletion = (view) => { + let cState = view.state.field(completionState, false); + if (!cState) + return false; + view.dispatch({ effects: startCompletionEffect.of(true) }); + return true; +}; +/** +Close the currently active completion. +*/ +const closeCompletion = (view) => { + let cState = view.state.field(completionState, false); + if (!cState || !cState.active.some(a => a.state != 0 /* State.Inactive */)) + return false; + view.dispatch({ effects: closeCompletionEffect.of(null) }); + return true; +}; +class RunningQuery { + constructor(active, context) { + this.active = active; + this.context = context; + this.time = Date.now(); + this.updates = []; + // Note that 'undefined' means 'not done yet', whereas 'null' means + // 'query returned null'. + this.done = undefined; + } +} +const MaxUpdateCount = 50, MinAbortTime = 1000; +const completionPlugin = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.ViewPlugin.fromClass(class { + constructor(view) { + this.view = view; + this.debounceUpdate = -1; + this.running = []; + this.debounceAccept = -1; + this.pendingStart = false; + this.composing = 0 /* CompositionState.None */; + for (let active of view.state.field(completionState).active) + if (active.isPending) + this.startQuery(active); + } + update(update) { + let cState = update.state.field(completionState); + let conf = update.state.facet(completionConfig); + if (!update.selectionSet && !update.docChanged && update.startState.field(completionState) == cState) + return; + let doesReset = update.transactions.some(tr => { + let type = getUpdateType(tr, conf); + return (type & 8 /* UpdateType.Reset */) || (tr.selection || tr.docChanged) && !(type & 3 /* UpdateType.SimpleInteraction */); + }); + for (let i = 0; i < this.running.length; i++) { + let query = this.running[i]; + if (doesReset || + query.context.abortOnDocChange && update.docChanged || + query.updates.length + update.transactions.length > MaxUpdateCount && Date.now() - query.time > MinAbortTime) { + for (let handler of query.context.abortListeners) { + try { + handler(); + } + catch (e) { + (0,_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.logException)(this.view.state, e); + } + } + query.context.abortListeners = null; + this.running.splice(i--, 1); + } + else { + query.updates.push(...update.transactions); + } + } + if (this.debounceUpdate > -1) + clearTimeout(this.debounceUpdate); + if (update.transactions.some(tr => tr.effects.some(e => e.is(startCompletionEffect)))) + this.pendingStart = true; + let delay = this.pendingStart ? 50 : conf.activateOnTypingDelay; + this.debounceUpdate = cState.active.some(a => a.isPending && !this.running.some(q => q.active.source == a.source)) + ? setTimeout(() => this.startUpdate(), delay) : -1; + if (this.composing != 0 /* CompositionState.None */) + for (let tr of update.transactions) { + if (tr.isUserEvent("input.type")) + this.composing = 2 /* CompositionState.Changed */; + else if (this.composing == 2 /* CompositionState.Changed */ && tr.selection) + this.composing = 3 /* CompositionState.ChangedAndMoved */; + } + } + startUpdate() { + this.debounceUpdate = -1; + this.pendingStart = false; + let { state } = this.view, cState = state.field(completionState); + for (let active of cState.active) { + if (active.isPending && !this.running.some(r => r.active.source == active.source)) + this.startQuery(active); + } + if (this.running.length && cState.open && cState.open.disabled) + this.debounceAccept = setTimeout(() => this.accept(), this.view.state.facet(completionConfig).updateSyncTime); + } + startQuery(active) { + let { state } = this.view, pos = cur(state); + let context = new CompletionContext(state, pos, active.explicit, this.view); + let pending = new RunningQuery(active, context); + this.running.push(pending); + Promise.resolve(active.source(context)).then(result => { + if (!pending.context.aborted) { + pending.done = result || null; + this.scheduleAccept(); + } + }, err => { + this.view.dispatch({ effects: closeCompletionEffect.of(null) }); + (0,_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.logException)(this.view.state, err); + }); + } + scheduleAccept() { + if (this.running.every(q => q.done !== undefined)) + this.accept(); + else if (this.debounceAccept < 0) + this.debounceAccept = setTimeout(() => this.accept(), this.view.state.facet(completionConfig).updateSyncTime); + } + // For each finished query in this.running, try to create a result + // or, if appropriate, restart the query. + accept() { + var _a; + if (this.debounceAccept > -1) + clearTimeout(this.debounceAccept); + this.debounceAccept = -1; + let updated = []; + let conf = this.view.state.facet(completionConfig), cState = this.view.state.field(completionState); + for (let i = 0; i < this.running.length; i++) { + let query = this.running[i]; + if (query.done === undefined) + continue; + this.running.splice(i--, 1); + if (query.done) { + let pos = cur(query.updates.length ? query.updates[0].startState : this.view.state); + let limit = Math.min(pos, query.done.from + (query.active.explicit ? 0 : 1)); + let active = new ActiveResult(query.active.source, query.active.explicit, limit, query.done, query.done.from, (_a = query.done.to) !== null && _a !== void 0 ? _a : pos); + // Replay the transactions that happened since the start of + // the request and see if that preserves the result + for (let tr of query.updates) + active = active.update(tr, conf); + if (active.hasResult()) { + updated.push(active); + continue; + } + } + let current = cState.active.find(a => a.source == query.active.source); + if (current && current.isPending) { + if (query.done == null) { + // Explicitly failed. Should clear the pending status if it + // hasn't been re-set in the meantime. + let active = new ActiveSource(query.active.source, 0 /* State.Inactive */); + for (let tr of query.updates) + active = active.update(tr, conf); + if (!active.isPending) + updated.push(active); + } + else { + // Cleared by subsequent transactions. Restart. + this.startQuery(current); + } + } + } + if (updated.length || cState.open && cState.open.disabled) + this.view.dispatch({ effects: setActiveEffect.of(updated) }); + } +}, { + eventHandlers: { + blur(event) { + let state = this.view.state.field(completionState, false); + if (state && state.tooltip && this.view.state.facet(completionConfig).closeOnBlur) { + let dialog = state.open && (0,_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.getTooltip)(this.view, state.open.tooltip); + if (!dialog || !dialog.dom.contains(event.relatedTarget)) + setTimeout(() => this.view.dispatch({ effects: closeCompletionEffect.of(null) }), 10); + } + }, + compositionstart() { + this.composing = 1 /* CompositionState.Started */; + }, + compositionend() { + if (this.composing == 3 /* CompositionState.ChangedAndMoved */) { + // Safari fires compositionend events synchronously, possibly + // from inside an update, so dispatch asynchronously to avoid reentrancy + setTimeout(() => this.view.dispatch({ effects: startCompletionEffect.of(false) }), 20); + } + this.composing = 0 /* CompositionState.None */; + } + } +}); +const windows = typeof navigator == "object" && /*@__PURE__*//Win/.test(navigator.platform); +const commitCharacters = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Prec.highest(/*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.domEventHandlers({ + keydown(event, view) { + let field = view.state.field(completionState, false); + if (!field || !field.open || field.open.disabled || field.open.selected < 0 || + event.key.length > 1 || event.ctrlKey && !(windows && event.altKey) || event.metaKey) + return false; + let option = field.open.options[field.open.selected]; + let result = field.active.find(a => a.source == option.source); + let commitChars = option.completion.commitCharacters || result.result.commitCharacters; + if (commitChars && commitChars.indexOf(event.key) > -1) + applyCompletion(view, option); + return false; + } +})); + +const baseTheme = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.baseTheme({ + ".cm-tooltip.cm-tooltip-autocomplete": { + "& > ul": { + fontFamily: "monospace", + whiteSpace: "nowrap", + overflow: "hidden auto", + maxWidth_fallback: "700px", + maxWidth: "min(700px, 95vw)", + minWidth: "250px", + maxHeight: "10em", + height: "100%", + listStyle: "none", + margin: 0, + padding: 0, + "& > li, & > completion-section": { + padding: "1px 3px", + lineHeight: 1.2 + }, + "& > li": { + overflowX: "hidden", + textOverflow: "ellipsis", + cursor: "pointer" + }, + "& > completion-section": { + display: "list-item", + borderBottom: "1px solid silver", + paddingLeft: "0.5em", + opacity: 0.7 + } + } + }, + "&light .cm-tooltip-autocomplete ul li[aria-selected]": { + background: "#17c", + color: "white", + }, + "&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]": { + background: "#777", + }, + "&dark .cm-tooltip-autocomplete ul li[aria-selected]": { + background: "#347", + color: "white", + }, + "&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]": { + background: "#444", + }, + ".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after": { + content: '"···"', + opacity: 0.5, + display: "block", + textAlign: "center" + }, + ".cm-tooltip.cm-completionInfo": { + position: "absolute", + padding: "3px 9px", + width: "max-content", + maxWidth: `${400 /* Info.Width */}px`, + boxSizing: "border-box", + whiteSpace: "pre-line" + }, + ".cm-completionInfo.cm-completionInfo-left": { right: "100%" }, + ".cm-completionInfo.cm-completionInfo-right": { left: "100%" }, + ".cm-completionInfo.cm-completionInfo-left-narrow": { right: `${30 /* Info.Margin */}px` }, + ".cm-completionInfo.cm-completionInfo-right-narrow": { left: `${30 /* Info.Margin */}px` }, + "&light .cm-snippetField": { backgroundColor: "#00000022" }, + "&dark .cm-snippetField": { backgroundColor: "#ffffff22" }, + ".cm-snippetFieldPosition": { + verticalAlign: "text-top", + width: 0, + height: "1.15em", + display: "inline-block", + margin: "0 -0.7px -.7em", + borderLeft: "1.4px dotted #888" + }, + ".cm-completionMatchedText": { + textDecoration: "underline" + }, + ".cm-completionDetail": { + marginLeft: "0.5em", + fontStyle: "italic" + }, + ".cm-completionIcon": { + fontSize: "90%", + width: ".8em", + display: "inline-block", + textAlign: "center", + paddingRight: ".6em", + opacity: "0.6", + boxSizing: "content-box" + }, + ".cm-completionIcon-function, .cm-completionIcon-method": { + "&:after": { content: "'ƒ'" } + }, + ".cm-completionIcon-class": { + "&:after": { content: "'○'" } + }, + ".cm-completionIcon-interface": { + "&:after": { content: "'◌'" } + }, + ".cm-completionIcon-variable": { + "&:after": { content: "'𝑥'" } + }, + ".cm-completionIcon-constant": { + "&:after": { content: "'𝐶'" } + }, + ".cm-completionIcon-type": { + "&:after": { content: "'𝑡'" } + }, + ".cm-completionIcon-enum": { + "&:after": { content: "'∪'" } + }, + ".cm-completionIcon-property": { + "&:after": { content: "'□'" } + }, + ".cm-completionIcon-keyword": { + "&:after": { content: "'🔑\uFE0E'" } // Disable emoji rendering + }, + ".cm-completionIcon-namespace": { + "&:after": { content: "'▢'" } + }, + ".cm-completionIcon-text": { + "&:after": { content: "'abc'", fontSize: "50%", verticalAlign: "middle" } + } +}); + +class FieldPos { + constructor(field, line, from, to) { + this.field = field; + this.line = line; + this.from = from; + this.to = to; + } +} +class FieldRange { + constructor(field, from, to) { + this.field = field; + this.from = from; + this.to = to; + } + map(changes) { + let from = changes.mapPos(this.from, -1, _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.MapMode.TrackDel); + let to = changes.mapPos(this.to, 1, _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.MapMode.TrackDel); + return from == null || to == null ? null : new FieldRange(this.field, from, to); + } +} +class Snippet { + constructor(lines, fieldPositions) { + this.lines = lines; + this.fieldPositions = fieldPositions; + } + instantiate(state, pos) { + let text = [], lineStart = [pos]; + let lineObj = state.doc.lineAt(pos), baseIndent = /^\s*/.exec(lineObj.text)[0]; + for (let line of this.lines) { + if (text.length) { + let indent = baseIndent, tabs = /^\t*/.exec(line)[0].length; + for (let i = 0; i < tabs; i++) + indent += state.facet(_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.indentUnit); + lineStart.push(pos + indent.length - tabs); + line = indent + line.slice(tabs); + } + text.push(line); + pos += line.length + 1; + } + let ranges = this.fieldPositions.map(pos => new FieldRange(pos.field, lineStart[pos.line] + pos.from, lineStart[pos.line] + pos.to)); + return { text, ranges }; + } + static parse(template) { + let fields = []; + let lines = [], positions = [], m; + for (let line of template.split(/\r\n?|\n/)) { + while (m = /[#$]\{(?:(\d+)(?::([^}]*))?|((?:\\[{}]|[^}])*))\}/.exec(line)) { + let seq = m[1] ? +m[1] : null, rawName = m[2] || m[3] || "", found = -1; + let name = rawName.replace(/\\[{}]/g, m => m[1]); + for (let i = 0; i < fields.length; i++) { + if (seq != null ? fields[i].seq == seq : name ? fields[i].name == name : false) + found = i; + } + if (found < 0) { + let i = 0; + while (i < fields.length && (seq == null || (fields[i].seq != null && fields[i].seq < seq))) + i++; + fields.splice(i, 0, { seq, name }); + found = i; + for (let pos of positions) + if (pos.field >= found) + pos.field++; + } + positions.push(new FieldPos(found, lines.length, m.index, m.index + name.length)); + line = line.slice(0, m.index) + rawName + line.slice(m.index + m[0].length); + } + line = line.replace(/\\([{}])/g, (_, brace, index) => { + for (let pos of positions) + if (pos.line == lines.length && pos.from > index) { + pos.from--; + pos.to--; + } + return brace; + }); + lines.push(line); + } + return new Snippet(lines, positions); + } +} +let fieldMarker = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Decoration.widget({ widget: /*@__PURE__*/new class extends _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.WidgetType { + toDOM() { + let span = document.createElement("span"); + span.className = "cm-snippetFieldPosition"; + return span; + } + ignoreEvent() { return false; } + } }); +let fieldRange = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Decoration.mark({ class: "cm-snippetField" }); +class ActiveSnippet { + constructor(ranges, active) { + this.ranges = ranges; + this.active = active; + this.deco = _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Decoration.set(ranges.map(r => (r.from == r.to ? fieldMarker : fieldRange).range(r.from, r.to))); + } + map(changes) { + let ranges = []; + for (let r of this.ranges) { + let mapped = r.map(changes); + if (!mapped) + return null; + ranges.push(mapped); + } + return new ActiveSnippet(ranges, this.active); + } + selectionInsideField(sel) { + return sel.ranges.every(range => this.ranges.some(r => r.field == this.active && r.from <= range.from && r.to >= range.to)); + } +} +const setActive = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define({ + map(value, changes) { return value && value.map(changes); } +}); +const moveToField = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define(); +const snippetState = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateField.define({ + create() { return null; }, + update(value, tr) { + for (let effect of tr.effects) { + if (effect.is(setActive)) + return effect.value; + if (effect.is(moveToField) && value) + return new ActiveSnippet(value.ranges, effect.value); + } + if (value && tr.docChanged) + value = value.map(tr.changes); + if (value && tr.selection && !value.selectionInsideField(tr.selection)) + value = null; + return value; + }, + provide: f => _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.decorations.from(f, val => val ? val.deco : _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Decoration.none) +}); +function fieldSelection(ranges, field) { + return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create(ranges.filter(r => r.field == field).map(r => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(r.from, r.to))); +} +/** +Convert a snippet template to a function that can +[apply](https://codemirror.net/6/docs/ref/#autocomplete.Completion.apply) it. Snippets are written +using syntax like this: + + "for (let ${index} = 0; ${index} < ${end}; ${index}++) {\n\t${}\n}" + +Each `${}` placeholder (you may also use `#{}`) indicates a field +that the user can fill in. Its name, if any, will be the default +content for the field. + +When the snippet is activated by calling the returned function, +the code is inserted at the given position. Newlines in the +template are indented by the indentation of the start line, plus +one [indent unit](https://codemirror.net/6/docs/ref/#language.indentUnit) per tab character after +the newline. + +On activation, (all instances of) the first field are selected. +The user can move between fields with Tab and Shift-Tab as long as +the fields are active. Moving to the last field or moving the +cursor out of the current field deactivates the fields. + +The order of fields defaults to textual order, but you can add +numbers to placeholders (`${1}` or `${1:defaultText}`) to provide +a custom order. + +To include a literal `{` or `}` in your template, put a backslash +in front of it. This will be removed and the brace will not be +interpreted as indicating a placeholder. +*/ +function snippet(template) { + let snippet = Snippet.parse(template); + return (editor, completion, from, to) => { + let { text, ranges } = snippet.instantiate(editor.state, from); + let { main } = editor.state.selection; + let spec = { + changes: { from, to: to == main.from ? main.to : to, insert: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Text.of(text) }, + scrollIntoView: true, + annotations: completion ? [pickedCompletion.of(completion), _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Transaction.userEvent.of("input.complete")] : undefined + }; + if (ranges.length) + spec.selection = fieldSelection(ranges, 0); + if (ranges.some(r => r.field > 0)) { + let active = new ActiveSnippet(ranges, 0); + let effects = spec.effects = [setActive.of(active)]; + if (editor.state.field(snippetState, false) === undefined) + effects.push(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.appendConfig.of([snippetState, addSnippetKeymap, snippetPointerHandler, baseTheme])); + } + editor.dispatch(editor.state.update(spec)); + }; +} +function moveField(dir) { + return ({ state, dispatch }) => { + let active = state.field(snippetState, false); + if (!active || dir < 0 && active.active == 0) + return false; + let next = active.active + dir, last = dir > 0 && !active.ranges.some(r => r.field == next + dir); + dispatch(state.update({ + selection: fieldSelection(active.ranges, next), + effects: setActive.of(last ? null : new ActiveSnippet(active.ranges, next)), + scrollIntoView: true + })); + return true; + }; +} +/** +A command that clears the active snippet, if any. +*/ +const clearSnippet = ({ state, dispatch }) => { + let active = state.field(snippetState, false); + if (!active) + return false; + dispatch(state.update({ effects: setActive.of(null) })); + return true; +}; +/** +Move to the next snippet field, if available. +*/ +const nextSnippetField = /*@__PURE__*/moveField(1); +/** +Move to the previous snippet field, if available. +*/ +const prevSnippetField = /*@__PURE__*/moveField(-1); +/** +Check if there is an active snippet with a next field for +`nextSnippetField` to move to. +*/ +function hasNextSnippetField(state) { + let active = state.field(snippetState, false); + return !!(active && active.ranges.some(r => r.field == active.active + 1)); +} +/** +Returns true if there is an active snippet and a previous field +for `prevSnippetField` to move to. +*/ +function hasPrevSnippetField(state) { + let active = state.field(snippetState, false); + return !!(active && active.active > 0); +} +const defaultSnippetKeymap = [ + { key: "Tab", run: nextSnippetField, shift: prevSnippetField }, + { key: "Escape", run: clearSnippet } +]; +/** +A facet that can be used to configure the key bindings used by +snippets. The default binds Tab to +[`nextSnippetField`](https://codemirror.net/6/docs/ref/#autocomplete.nextSnippetField), Shift-Tab to +[`prevSnippetField`](https://codemirror.net/6/docs/ref/#autocomplete.prevSnippetField), and Escape +to [`clearSnippet`](https://codemirror.net/6/docs/ref/#autocomplete.clearSnippet). +*/ +const snippetKeymap = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Facet.define({ + combine(maps) { return maps.length ? maps[0] : defaultSnippetKeymap; } +}); +const addSnippetKeymap = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Prec.highest(/*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.keymap.compute([snippetKeymap], state => state.facet(snippetKeymap))); +/** +Create a completion from a snippet. Returns an object with the +properties from `completion`, plus an `apply` function that +applies the snippet. +*/ +function snippetCompletion(template, completion) { + return Object.assign(Object.assign({}, completion), { apply: snippet(template) }); +} +const snippetPointerHandler = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.domEventHandlers({ + mousedown(event, view) { + let active = view.state.field(snippetState, false), pos; + if (!active || (pos = view.posAtCoords({ x: event.clientX, y: event.clientY })) == null) + return false; + let match = active.ranges.find(r => r.from <= pos && r.to >= pos); + if (!match || match.field == active.active) + return false; + view.dispatch({ + selection: fieldSelection(active.ranges, match.field), + effects: setActive.of(active.ranges.some(r => r.field > match.field) + ? new ActiveSnippet(active.ranges, match.field) : null), + scrollIntoView: true + }); + return true; + } +}); + +function wordRE(wordChars) { + let escaped = wordChars.replace(/[\]\-\\]/g, "\\$&"); + try { + return new RegExp(`[\\p{Alphabetic}\\p{Number}_${escaped}]+`, "ug"); + } + catch (_a) { + return new RegExp(`[\w${escaped}]`, "g"); + } +} +function mapRE(re, f) { + return new RegExp(f(re.source), re.unicode ? "u" : ""); +} +const wordCaches = /*@__PURE__*/Object.create(null); +function wordCache(wordChars) { + return wordCaches[wordChars] || (wordCaches[wordChars] = new WeakMap); +} +function storeWords(doc, wordRE, result, seen, ignoreAt) { + for (let lines = doc.iterLines(), pos = 0; !lines.next().done;) { + let { value } = lines, m; + wordRE.lastIndex = 0; + while (m = wordRE.exec(value)) { + if (!seen[m[0]] && pos + m.index != ignoreAt) { + result.push({ type: "text", label: m[0] }); + seen[m[0]] = true; + if (result.length >= 2000 /* C.MaxList */) + return; + } + } + pos += value.length + 1; + } +} +function collectWords(doc, cache, wordRE, to, ignoreAt) { + let big = doc.length >= 1000 /* C.MinCacheLen */; + let cached = big && cache.get(doc); + if (cached) + return cached; + let result = [], seen = Object.create(null); + if (doc.children) { + let pos = 0; + for (let ch of doc.children) { + if (ch.length >= 1000 /* C.MinCacheLen */) { + for (let c of collectWords(ch, cache, wordRE, to - pos, ignoreAt - pos)) { + if (!seen[c.label]) { + seen[c.label] = true; + result.push(c); + } + } + } + else { + storeWords(ch, wordRE, result, seen, ignoreAt - pos); + } + pos += ch.length + 1; + } + } + else { + storeWords(doc, wordRE, result, seen, ignoreAt); + } + if (big && result.length < 2000 /* C.MaxList */) + cache.set(doc, result); + return result; +} +/** +A completion source that will scan the document for words (using a +[character categorizer](https://codemirror.net/6/docs/ref/#state.EditorState.charCategorizer)), and +return those as completions. +*/ +const completeAnyWord = context => { + let wordChars = context.state.languageDataAt("wordChars", context.pos).join(""); + let re = wordRE(wordChars); + let token = context.matchBefore(mapRE(re, s => s + "$")); + if (!token && !context.explicit) + return null; + let from = token ? token.from : context.pos; + let options = collectWords(context.state.doc, wordCache(wordChars), re, 50000 /* C.Range */, from); + return { from, options, validFor: mapRE(re, s => "^" + s) }; +}; + +const defaults = { + brackets: ["(", "[", "{", "'", '"'], + before: ")]}:;>", + stringPrefixes: [] +}; +const closeBracketEffect = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define({ + map(value, mapping) { + let mapped = mapping.mapPos(value, -1, _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.MapMode.TrackAfter); + return mapped == null ? undefined : mapped; + } +}); +const closedBracket = /*@__PURE__*/new class extends _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.RangeValue { +}; +closedBracket.startSide = 1; +closedBracket.endSide = -1; +const bracketState = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateField.define({ + create() { return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.RangeSet.empty; }, + update(value, tr) { + value = value.map(tr.changes); + if (tr.selection) { + let line = tr.state.doc.lineAt(tr.selection.main.head); + value = value.update({ filter: from => from >= line.from && from <= line.to }); + } + for (let effect of tr.effects) + if (effect.is(closeBracketEffect)) + value = value.update({ add: [closedBracket.range(effect.value, effect.value + 1)] }); + return value; + } +}); +/** +Extension to enable bracket-closing behavior. When a closeable +bracket is typed, its closing bracket is immediately inserted +after the cursor. When closing a bracket directly in front of a +closing bracket inserted by the extension, the cursor moves over +that bracket. +*/ +function closeBrackets() { + return [inputHandler, bracketState]; +} +const definedClosing = "()[]{}<>«»»«[]{}"; +function closing(ch) { + for (let i = 0; i < definedClosing.length; i += 2) + if (definedClosing.charCodeAt(i) == ch) + return definedClosing.charAt(i + 1); + return (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.fromCodePoint)(ch < 128 ? ch : ch + 1); +} +function config(state, pos) { + return state.languageDataAt("closeBrackets", pos)[0] || defaults; +} +const android = typeof navigator == "object" && /*@__PURE__*//Android\b/.test(navigator.userAgent); +const inputHandler = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.inputHandler.of((view, from, to, insert) => { + if ((android ? view.composing : view.compositionStarted) || view.state.readOnly) + return false; + let sel = view.state.selection.main; + if (insert.length > 2 || insert.length == 2 && (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(insert, 0)) == 1 || + from != sel.from || to != sel.to) + return false; + let tr = insertBracket(view.state, insert); + if (!tr) + return false; + view.dispatch(tr); + return true; +}); +/** +Command that implements deleting a pair of matching brackets when +the cursor is between them. +*/ +const deleteBracketPair = ({ state, dispatch }) => { + if (state.readOnly) + return false; + let conf = config(state, state.selection.main.head); + let tokens = conf.brackets || defaults.brackets; + let dont = null, changes = state.changeByRange(range => { + if (range.empty) { + let before = prevChar(state.doc, range.head); + for (let token of tokens) { + if (token == before && nextChar(state.doc, range.head) == closing((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(token, 0))) + return { changes: { from: range.head - token.length, to: range.head + token.length }, + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.head - token.length) }; + } + } + return { range: dont = range }; + }); + if (!dont) + dispatch(state.update(changes, { scrollIntoView: true, userEvent: "delete.backward" })); + return !dont; +}; +/** +Close-brackets related key bindings. Binds Backspace to +[`deleteBracketPair`](https://codemirror.net/6/docs/ref/#autocomplete.deleteBracketPair). +*/ +const closeBracketsKeymap = [ + { key: "Backspace", run: deleteBracketPair } +]; +/** +Implements the extension's behavior on text insertion. If the +given string counts as a bracket in the language around the +selection, and replacing the selection with it requires custom +behavior (inserting a closing version or skipping past a +previously-closed bracket), this function returns a transaction +representing that custom behavior. (You only need this if you want +to programmatically insert brackets—the +[`closeBrackets`](https://codemirror.net/6/docs/ref/#autocomplete.closeBrackets) extension will +take care of running this for user input.) +*/ +function insertBracket(state, bracket) { + let conf = config(state, state.selection.main.head); + let tokens = conf.brackets || defaults.brackets; + for (let tok of tokens) { + let closed = closing((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(tok, 0)); + if (bracket == tok) + return closed == tok ? handleSame(state, tok, tokens.indexOf(tok + tok + tok) > -1, conf) + : handleOpen(state, tok, closed, conf.before || defaults.before); + if (bracket == closed && closedBracketAt(state, state.selection.main.from)) + return handleClose(state, tok, closed); + } + return null; +} +function closedBracketAt(state, pos) { + let found = false; + state.field(bracketState).between(0, state.doc.length, from => { + if (from == pos) + found = true; + }); + return found; +} +function nextChar(doc, pos) { + let next = doc.sliceString(pos, pos + 2); + return next.slice(0, (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(next, 0))); +} +function prevChar(doc, pos) { + let prev = doc.sliceString(pos - 2, pos); + return (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(prev, 0)) == prev.length ? prev : prev.slice(1); +} +function handleOpen(state, open, close, closeBefore) { + let dont = null, changes = state.changeByRange(range => { + if (!range.empty) + return { changes: [{ insert: open, from: range.from }, { insert: close, from: range.to }], + effects: closeBracketEffect.of(range.to + open.length), + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(range.anchor + open.length, range.head + open.length) }; + let next = nextChar(state.doc, range.head); + if (!next || /\s/.test(next) || closeBefore.indexOf(next) > -1) + return { changes: { insert: open + close, from: range.head }, + effects: closeBracketEffect.of(range.head + open.length), + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.head + open.length) }; + return { range: dont = range }; + }); + return dont ? null : state.update(changes, { + scrollIntoView: true, + userEvent: "input.type" + }); +} +function handleClose(state, _open, close) { + let dont = null, changes = state.changeByRange(range => { + if (range.empty && nextChar(state.doc, range.head) == close) + return { changes: { from: range.head, to: range.head + close.length, insert: close }, + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.head + close.length) }; + return dont = { range }; + }); + return dont ? null : state.update(changes, { + scrollIntoView: true, + userEvent: "input.type" + }); +} +// Handles cases where the open and close token are the same, and +// possibly triple quotes (as in `"""abc"""`-style quoting). +function handleSame(state, token, allowTriple, config) { + let stringPrefixes = config.stringPrefixes || defaults.stringPrefixes; + let dont = null, changes = state.changeByRange(range => { + if (!range.empty) + return { changes: [{ insert: token, from: range.from }, { insert: token, from: range.to }], + effects: closeBracketEffect.of(range.to + token.length), + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(range.anchor + token.length, range.head + token.length) }; + let pos = range.head, next = nextChar(state.doc, pos), start; + if (next == token) { + if (nodeStart(state, pos)) { + return { changes: { insert: token + token, from: pos }, + effects: closeBracketEffect.of(pos + token.length), + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(pos + token.length) }; + } + else if (closedBracketAt(state, pos)) { + let isTriple = allowTriple && state.sliceDoc(pos, pos + token.length * 3) == token + token + token; + let content = isTriple ? token + token + token : token; + return { changes: { from: pos, to: pos + content.length, insert: content }, + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(pos + content.length) }; + } + } + else if (allowTriple && state.sliceDoc(pos - 2 * token.length, pos) == token + token && + (start = canStartStringAt(state, pos - 2 * token.length, stringPrefixes)) > -1 && + nodeStart(state, start)) { + return { changes: { insert: token + token + token + token, from: pos }, + effects: closeBracketEffect.of(pos + token.length), + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(pos + token.length) }; + } + else if (state.charCategorizer(pos)(next) != _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word) { + if (canStartStringAt(state, pos, stringPrefixes) > -1 && !probablyInString(state, pos, token, stringPrefixes)) + return { changes: { insert: token + token, from: pos }, + effects: closeBracketEffect.of(pos + token.length), + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(pos + token.length) }; + } + return { range: dont = range }; + }); + return dont ? null : state.update(changes, { + scrollIntoView: true, + userEvent: "input.type" + }); +} +function nodeStart(state, pos) { + let tree = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.syntaxTree)(state).resolveInner(pos + 1); + return tree.parent && tree.from == pos; +} +function probablyInString(state, pos, quoteToken, prefixes) { + let node = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.syntaxTree)(state).resolveInner(pos, -1); + let maxPrefix = prefixes.reduce((m, p) => Math.max(m, p.length), 0); + for (let i = 0; i < 5; i++) { + let start = state.sliceDoc(node.from, Math.min(node.to, node.from + quoteToken.length + maxPrefix)); + let quotePos = start.indexOf(quoteToken); + if (!quotePos || quotePos > -1 && prefixes.indexOf(start.slice(0, quotePos)) > -1) { + let first = node.firstChild; + while (first && first.from == node.from && first.to - first.from > quoteToken.length + quotePos) { + if (state.sliceDoc(first.to - quoteToken.length, first.to) == quoteToken) + return false; + first = first.firstChild; + } + return true; + } + let parent = node.to == pos && node.parent; + if (!parent) + break; + node = parent; + } + return false; +} +function canStartStringAt(state, pos, prefixes) { + let charCat = state.charCategorizer(pos); + if (charCat(state.sliceDoc(pos - 1, pos)) != _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word) + return pos; + for (let prefix of prefixes) { + let start = pos - prefix.length; + if (state.sliceDoc(start, pos) == prefix && charCat(state.sliceDoc(start - 1, start)) != _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word) + return start; + } + return -1; +} + +/** +Returns an extension that enables autocompletion. +*/ +function autocompletion(config = {}) { + return [ + commitCharacters, + completionState, + completionConfig.of(config), + completionPlugin, + completionKeymapExt, + baseTheme + ]; +} +/** +Basic keybindings for autocompletion. + + - Ctrl-Space (and Alt-\` on macOS): [`startCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.startCompletion) + - Escape: [`closeCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.closeCompletion) + - ArrowDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true)` + - ArrowUp: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(false)` + - PageDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true, "page")` + - PageDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true, "page")` + - Enter: [`acceptCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.acceptCompletion) +*/ +const completionKeymap = [ + { key: "Ctrl-Space", run: startCompletion }, + { mac: "Alt-`", run: startCompletion }, + { key: "Escape", run: closeCompletion }, + { key: "ArrowDown", run: /*@__PURE__*/moveCompletionSelection(true) }, + { key: "ArrowUp", run: /*@__PURE__*/moveCompletionSelection(false) }, + { key: "PageDown", run: /*@__PURE__*/moveCompletionSelection(true, "page") }, + { key: "PageUp", run: /*@__PURE__*/moveCompletionSelection(false, "page") }, + { key: "Enter", run: acceptCompletion } +]; +const completionKeymapExt = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Prec.highest(/*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.keymap.computeN([completionConfig], state => state.facet(completionConfig).defaultKeymap ? [completionKeymap] : [])); +/** +Get the current completion status. When completions are available, +this will return `"active"`. When completions are pending (in the +process of being queried), this returns `"pending"`. Otherwise, it +returns `null`. +*/ +function completionStatus(state) { + let cState = state.field(completionState, false); + return cState && cState.active.some(a => a.isPending) ? "pending" + : cState && cState.active.some(a => a.state != 0 /* State.Inactive */) ? "active" : null; +} +const completionArrayCache = /*@__PURE__*/new WeakMap; +/** +Returns the available completions as an array. +*/ +function currentCompletions(state) { + var _a; + let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open; + if (!open || open.disabled) + return []; + let completions = completionArrayCache.get(open.options); + if (!completions) + completionArrayCache.set(open.options, completions = open.options.map(o => o.completion)); + return completions; +} +/** +Return the currently selected completion, if any. +*/ +function selectedCompletion(state) { + var _a; + let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open; + return open && !open.disabled && open.selected >= 0 ? open.options[open.selected].completion : null; +} +/** +Returns the currently selected position in the active completion +list, or null if no completions are active. +*/ +function selectedCompletionIndex(state) { + var _a; + let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open; + return open && !open.disabled && open.selected >= 0 ? open.selected : null; +} +/** +Create an effect that can be attached to a transaction to change +the currently selected completion. +*/ +function setSelectedCompletion(index) { + return setSelectedEffect.of(index); +} + + + + +/***/ }), + +/***/ "./node_modules/@codemirror/commands/dist/index.js": +/*!*********************************************************!*\ + !*** ./node_modules/@codemirror/commands/dist/index.js ***! + \*********************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ blockComment: () => (/* binding */ blockComment), +/* harmony export */ blockUncomment: () => (/* binding */ blockUncomment), +/* harmony export */ copyLineDown: () => (/* binding */ copyLineDown), +/* harmony export */ copyLineUp: () => (/* binding */ copyLineUp), +/* harmony export */ cursorCharBackward: () => (/* binding */ cursorCharBackward), +/* harmony export */ cursorCharBackwardLogical: () => (/* binding */ cursorCharBackwardLogical), +/* harmony export */ cursorCharForward: () => (/* binding */ cursorCharForward), +/* harmony export */ cursorCharForwardLogical: () => (/* binding */ cursorCharForwardLogical), +/* harmony export */ cursorCharLeft: () => (/* binding */ cursorCharLeft), +/* harmony export */ cursorCharRight: () => (/* binding */ cursorCharRight), +/* harmony export */ cursorDocEnd: () => (/* binding */ cursorDocEnd), +/* harmony export */ cursorDocStart: () => (/* binding */ cursorDocStart), +/* harmony export */ cursorGroupBackward: () => (/* binding */ cursorGroupBackward), +/* harmony export */ cursorGroupForward: () => (/* binding */ cursorGroupForward), +/* harmony export */ cursorGroupForwardWin: () => (/* binding */ cursorGroupForwardWin), +/* harmony export */ cursorGroupLeft: () => (/* binding */ cursorGroupLeft), +/* harmony export */ cursorGroupRight: () => (/* binding */ cursorGroupRight), +/* harmony export */ cursorLineBoundaryBackward: () => (/* binding */ cursorLineBoundaryBackward), +/* harmony export */ cursorLineBoundaryForward: () => (/* binding */ cursorLineBoundaryForward), +/* harmony export */ cursorLineBoundaryLeft: () => (/* binding */ cursorLineBoundaryLeft), +/* harmony export */ cursorLineBoundaryRight: () => (/* binding */ cursorLineBoundaryRight), +/* harmony export */ cursorLineDown: () => (/* binding */ cursorLineDown), +/* harmony export */ cursorLineEnd: () => (/* binding */ cursorLineEnd), +/* harmony export */ cursorLineStart: () => (/* binding */ cursorLineStart), +/* harmony export */ cursorLineUp: () => (/* binding */ cursorLineUp), +/* harmony export */ cursorMatchingBracket: () => (/* binding */ cursorMatchingBracket), +/* harmony export */ cursorPageDown: () => (/* binding */ cursorPageDown), +/* harmony export */ cursorPageUp: () => (/* binding */ cursorPageUp), +/* harmony export */ cursorSubwordBackward: () => (/* binding */ cursorSubwordBackward), +/* harmony export */ cursorSubwordForward: () => (/* binding */ cursorSubwordForward), +/* harmony export */ cursorSyntaxLeft: () => (/* binding */ cursorSyntaxLeft), +/* harmony export */ cursorSyntaxRight: () => (/* binding */ cursorSyntaxRight), +/* harmony export */ defaultKeymap: () => (/* binding */ defaultKeymap), +/* harmony export */ deleteCharBackward: () => (/* binding */ deleteCharBackward), +/* harmony export */ deleteCharBackwardStrict: () => (/* binding */ deleteCharBackwardStrict), +/* harmony export */ deleteCharForward: () => (/* binding */ deleteCharForward), +/* harmony export */ deleteGroupBackward: () => (/* binding */ deleteGroupBackward), +/* harmony export */ deleteGroupForward: () => (/* binding */ deleteGroupForward), +/* harmony export */ deleteLine: () => (/* binding */ deleteLine), +/* harmony export */ deleteLineBoundaryBackward: () => (/* binding */ deleteLineBoundaryBackward), +/* harmony export */ deleteLineBoundaryForward: () => (/* binding */ deleteLineBoundaryForward), +/* harmony export */ deleteToLineEnd: () => (/* binding */ deleteToLineEnd), +/* harmony export */ deleteToLineStart: () => (/* binding */ deleteToLineStart), +/* harmony export */ deleteTrailingWhitespace: () => (/* binding */ deleteTrailingWhitespace), +/* harmony export */ emacsStyleKeymap: () => (/* binding */ emacsStyleKeymap), +/* harmony export */ history: () => (/* binding */ history), +/* harmony export */ historyField: () => (/* binding */ historyField), +/* harmony export */ historyKeymap: () => (/* binding */ historyKeymap), +/* harmony export */ indentLess: () => (/* binding */ indentLess), +/* harmony export */ indentMore: () => (/* binding */ indentMore), +/* harmony export */ indentSelection: () => (/* binding */ indentSelection), +/* harmony export */ indentWithTab: () => (/* binding */ indentWithTab), +/* harmony export */ insertBlankLine: () => (/* binding */ insertBlankLine), +/* harmony export */ insertNewline: () => (/* binding */ insertNewline), +/* harmony export */ insertNewlineAndIndent: () => (/* binding */ insertNewlineAndIndent), +/* harmony export */ insertNewlineKeepIndent: () => (/* binding */ insertNewlineKeepIndent), +/* harmony export */ insertTab: () => (/* binding */ insertTab), +/* harmony export */ invertedEffects: () => (/* binding */ invertedEffects), +/* harmony export */ isolateHistory: () => (/* binding */ isolateHistory), +/* harmony export */ lineComment: () => (/* binding */ lineComment), +/* harmony export */ lineUncomment: () => (/* binding */ lineUncomment), +/* harmony export */ moveLineDown: () => (/* binding */ moveLineDown), +/* harmony export */ moveLineUp: () => (/* binding */ moveLineUp), +/* harmony export */ redo: () => (/* binding */ redo), +/* harmony export */ redoDepth: () => (/* binding */ redoDepth), +/* harmony export */ redoSelection: () => (/* binding */ redoSelection), +/* harmony export */ selectAll: () => (/* binding */ selectAll), +/* harmony export */ selectCharBackward: () => (/* binding */ selectCharBackward), +/* harmony export */ selectCharBackwardLogical: () => (/* binding */ selectCharBackwardLogical), +/* harmony export */ selectCharForward: () => (/* binding */ selectCharForward), +/* harmony export */ selectCharForwardLogical: () => (/* binding */ selectCharForwardLogical), +/* harmony export */ selectCharLeft: () => (/* binding */ selectCharLeft), +/* harmony export */ selectCharRight: () => (/* binding */ selectCharRight), +/* harmony export */ selectDocEnd: () => (/* binding */ selectDocEnd), +/* harmony export */ selectDocStart: () => (/* binding */ selectDocStart), +/* harmony export */ selectGroupBackward: () => (/* binding */ selectGroupBackward), +/* harmony export */ selectGroupForward: () => (/* binding */ selectGroupForward), +/* harmony export */ selectGroupForwardWin: () => (/* binding */ selectGroupForwardWin), +/* harmony export */ selectGroupLeft: () => (/* binding */ selectGroupLeft), +/* harmony export */ selectGroupRight: () => (/* binding */ selectGroupRight), +/* harmony export */ selectLine: () => (/* binding */ selectLine), +/* harmony export */ selectLineBoundaryBackward: () => (/* binding */ selectLineBoundaryBackward), +/* harmony export */ selectLineBoundaryForward: () => (/* binding */ selectLineBoundaryForward), +/* harmony export */ selectLineBoundaryLeft: () => (/* binding */ selectLineBoundaryLeft), +/* harmony export */ selectLineBoundaryRight: () => (/* binding */ selectLineBoundaryRight), +/* harmony export */ selectLineDown: () => (/* binding */ selectLineDown), +/* harmony export */ selectLineEnd: () => (/* binding */ selectLineEnd), +/* harmony export */ selectLineStart: () => (/* binding */ selectLineStart), +/* harmony export */ selectLineUp: () => (/* binding */ selectLineUp), +/* harmony export */ selectMatchingBracket: () => (/* binding */ selectMatchingBracket), +/* harmony export */ selectPageDown: () => (/* binding */ selectPageDown), +/* harmony export */ selectPageUp: () => (/* binding */ selectPageUp), +/* harmony export */ selectParentSyntax: () => (/* binding */ selectParentSyntax), +/* harmony export */ selectSubwordBackward: () => (/* binding */ selectSubwordBackward), +/* harmony export */ selectSubwordForward: () => (/* binding */ selectSubwordForward), +/* harmony export */ selectSyntaxLeft: () => (/* binding */ selectSyntaxLeft), +/* harmony export */ selectSyntaxRight: () => (/* binding */ selectSyntaxRight), +/* harmony export */ simplifySelection: () => (/* binding */ simplifySelection), +/* harmony export */ splitLine: () => (/* binding */ splitLine), +/* harmony export */ standardKeymap: () => (/* binding */ standardKeymap), +/* harmony export */ temporarilySetTabFocusMode: () => (/* binding */ temporarilySetTabFocusMode), +/* harmony export */ toggleBlockComment: () => (/* binding */ toggleBlockComment), +/* harmony export */ toggleBlockCommentByLine: () => (/* binding */ toggleBlockCommentByLine), +/* harmony export */ toggleComment: () => (/* binding */ toggleComment), +/* harmony export */ toggleLineComment: () => (/* binding */ toggleLineComment), +/* harmony export */ toggleTabFocusMode: () => (/* binding */ toggleTabFocusMode), +/* harmony export */ transposeChars: () => (/* binding */ transposeChars), +/* harmony export */ undo: () => (/* binding */ undo), +/* harmony export */ undoDepth: () => (/* binding */ undoDepth), +/* harmony export */ undoSelection: () => (/* binding */ undoSelection) +/* harmony export */ }); +/* harmony import */ var _codemirror_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @codemirror/state */ "./node_modules/@codemirror/state/dist/index.js"); +/* harmony import */ var _codemirror_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @codemirror/view */ "./node_modules/@codemirror/view/dist/index.js"); +/* harmony import */ var _codemirror_language__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @codemirror/language */ "./node_modules/@codemirror/language/dist/index.js"); +/* harmony import */ var _lezer_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lezer/common */ "./node_modules/@lezer/common/dist/index.js"); + + + + + +/** +Comment or uncomment the current selection. Will use line comments +if available, otherwise falling back to block comments. +*/ +const toggleComment = target => { + let { state } = target, line = state.doc.lineAt(state.selection.main.from), config = getConfig(target.state, line.from); + return config.line ? toggleLineComment(target) : config.block ? toggleBlockCommentByLine(target) : false; +}; +function command(f, option) { + return ({ state, dispatch }) => { + if (state.readOnly) + return false; + let tr = f(option, state); + if (!tr) + return false; + dispatch(state.update(tr)); + return true; + }; +} +/** +Comment or uncomment the current selection using line comments. +The line comment syntax is taken from the +[`commentTokens`](https://codemirror.net/6/docs/ref/#commands.CommentTokens) [language +data](https://codemirror.net/6/docs/ref/#state.EditorState.languageDataAt). +*/ +const toggleLineComment = /*@__PURE__*/command(changeLineComment, 0 /* CommentOption.Toggle */); +/** +Comment the current selection using line comments. +*/ +const lineComment = /*@__PURE__*/command(changeLineComment, 1 /* CommentOption.Comment */); +/** +Uncomment the current selection using line comments. +*/ +const lineUncomment = /*@__PURE__*/command(changeLineComment, 2 /* CommentOption.Uncomment */); +/** +Comment or uncomment the current selection using block comments. +The block comment syntax is taken from the +[`commentTokens`](https://codemirror.net/6/docs/ref/#commands.CommentTokens) [language +data](https://codemirror.net/6/docs/ref/#state.EditorState.languageDataAt). +*/ +const toggleBlockComment = /*@__PURE__*/command(changeBlockComment, 0 /* CommentOption.Toggle */); +/** +Comment the current selection using block comments. +*/ +const blockComment = /*@__PURE__*/command(changeBlockComment, 1 /* CommentOption.Comment */); +/** +Uncomment the current selection using block comments. +*/ +const blockUncomment = /*@__PURE__*/command(changeBlockComment, 2 /* CommentOption.Uncomment */); +/** +Comment or uncomment the lines around the current selection using +block comments. +*/ +const toggleBlockCommentByLine = /*@__PURE__*/command((o, s) => changeBlockComment(o, s, selectedLineRanges(s)), 0 /* CommentOption.Toggle */); +function getConfig(state, pos) { + let data = state.languageDataAt("commentTokens", pos, 1); + return data.length ? data[0] : {}; +} +const SearchMargin = 50; +/** +Determines if the given range is block-commented in the given +state. +*/ +function findBlockComment(state, { open, close }, from, to) { + let textBefore = state.sliceDoc(from - SearchMargin, from); + let textAfter = state.sliceDoc(to, to + SearchMargin); + let spaceBefore = /\s*$/.exec(textBefore)[0].length, spaceAfter = /^\s*/.exec(textAfter)[0].length; + let beforeOff = textBefore.length - spaceBefore; + if (textBefore.slice(beforeOff - open.length, beforeOff) == open && + textAfter.slice(spaceAfter, spaceAfter + close.length) == close) { + return { open: { pos: from - spaceBefore, margin: spaceBefore && 1 }, + close: { pos: to + spaceAfter, margin: spaceAfter && 1 } }; + } + let startText, endText; + if (to - from <= 2 * SearchMargin) { + startText = endText = state.sliceDoc(from, to); + } + else { + startText = state.sliceDoc(from, from + SearchMargin); + endText = state.sliceDoc(to - SearchMargin, to); + } + let startSpace = /^\s*/.exec(startText)[0].length, endSpace = /\s*$/.exec(endText)[0].length; + let endOff = endText.length - endSpace - close.length; + if (startText.slice(startSpace, startSpace + open.length) == open && + endText.slice(endOff, endOff + close.length) == close) { + return { open: { pos: from + startSpace + open.length, + margin: /\s/.test(startText.charAt(startSpace + open.length)) ? 1 : 0 }, + close: { pos: to - endSpace - close.length, + margin: /\s/.test(endText.charAt(endOff - 1)) ? 1 : 0 } }; + } + return null; +} +function selectedLineRanges(state) { + let ranges = []; + for (let r of state.selection.ranges) { + let fromLine = state.doc.lineAt(r.from); + let toLine = r.to <= fromLine.to ? fromLine : state.doc.lineAt(r.to); + if (toLine.from > fromLine.from && toLine.from == r.to) + toLine = r.to == fromLine.to + 1 ? fromLine : state.doc.lineAt(r.to - 1); + let last = ranges.length - 1; + if (last >= 0 && ranges[last].to > fromLine.from) + ranges[last].to = toLine.to; + else + ranges.push({ from: fromLine.from + /^\s*/.exec(fromLine.text)[0].length, to: toLine.to }); + } + return ranges; +} +// Performs toggle, comment and uncomment of block comments in +// languages that support them. +function changeBlockComment(option, state, ranges = state.selection.ranges) { + let tokens = ranges.map(r => getConfig(state, r.from).block); + if (!tokens.every(c => c)) + return null; + let comments = ranges.map((r, i) => findBlockComment(state, tokens[i], r.from, r.to)); + if (option != 2 /* CommentOption.Uncomment */ && !comments.every(c => c)) { + return { changes: state.changes(ranges.map((range, i) => { + if (comments[i]) + return []; + return [{ from: range.from, insert: tokens[i].open + " " }, { from: range.to, insert: " " + tokens[i].close }]; + })) }; + } + else if (option != 1 /* CommentOption.Comment */ && comments.some(c => c)) { + let changes = []; + for (let i = 0, comment; i < comments.length; i++) + if (comment = comments[i]) { + let token = tokens[i], { open, close } = comment; + changes.push({ from: open.pos - token.open.length, to: open.pos + open.margin }, { from: close.pos - close.margin, to: close.pos + token.close.length }); + } + return { changes }; + } + return null; +} +// Performs toggle, comment and uncomment of line comments. +function changeLineComment(option, state, ranges = state.selection.ranges) { + let lines = []; + let prevLine = -1; + for (let { from, to } of ranges) { + let startI = lines.length, minIndent = 1e9; + let token = getConfig(state, from).line; + if (!token) + continue; + for (let pos = from; pos <= to;) { + let line = state.doc.lineAt(pos); + if (line.from > prevLine && (from == to || to > line.from)) { + prevLine = line.from; + let indent = /^\s*/.exec(line.text)[0].length; + let empty = indent == line.length; + let comment = line.text.slice(indent, indent + token.length) == token ? indent : -1; + if (indent < line.text.length && indent < minIndent) + minIndent = indent; + lines.push({ line, comment, token, indent, empty, single: false }); + } + pos = line.to + 1; + } + if (minIndent < 1e9) + for (let i = startI; i < lines.length; i++) + if (lines[i].indent < lines[i].line.text.length) + lines[i].indent = minIndent; + if (lines.length == startI + 1) + lines[startI].single = true; + } + if (option != 2 /* CommentOption.Uncomment */ && lines.some(l => l.comment < 0 && (!l.empty || l.single))) { + let changes = []; + for (let { line, token, indent, empty, single } of lines) + if (single || !empty) + changes.push({ from: line.from + indent, insert: token + " " }); + let changeSet = state.changes(changes); + return { changes: changeSet, selection: state.selection.map(changeSet, 1) }; + } + else if (option != 1 /* CommentOption.Comment */ && lines.some(l => l.comment >= 0)) { + let changes = []; + for (let { line, comment, token } of lines) + if (comment >= 0) { + let from = line.from + comment, to = from + token.length; + if (line.text[to - line.from] == " ") + to++; + changes.push({ from, to }); + } + return { changes }; + } + return null; +} + +const fromHistory = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Annotation.define(); +/** +Transaction annotation that will prevent that transaction from +being combined with other transactions in the undo history. Given +`"before"`, it'll prevent merging with previous transactions. With +`"after"`, subsequent transactions won't be combined with this +one. With `"full"`, the transaction is isolated on both sides. +*/ +const isolateHistory = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Annotation.define(); +/** +This facet provides a way to register functions that, given a +transaction, provide a set of effects that the history should +store when inverting the transaction. This can be used to +integrate some kinds of effects in the history, so that they can +be undone (and redone again). +*/ +const invertedEffects = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Facet.define(); +const historyConfig = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Facet.define({ + combine(configs) { + return (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.combineConfig)(configs, { + minDepth: 100, + newGroupDelay: 500, + joinToEvent: (_t, isAdjacent) => isAdjacent, + }, { + minDepth: Math.max, + newGroupDelay: Math.min, + joinToEvent: (a, b) => (tr, adj) => a(tr, adj) || b(tr, adj) + }); + } +}); +const historyField_ = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateField.define({ + create() { + return HistoryState.empty; + }, + update(state, tr) { + let config = tr.state.facet(historyConfig); + let fromHist = tr.annotation(fromHistory); + if (fromHist) { + let item = HistEvent.fromTransaction(tr, fromHist.selection), from = fromHist.side; + let other = from == 0 /* BranchName.Done */ ? state.undone : state.done; + if (item) + other = updateBranch(other, other.length, config.minDepth, item); + else + other = addSelection(other, tr.startState.selection); + return new HistoryState(from == 0 /* BranchName.Done */ ? fromHist.rest : other, from == 0 /* BranchName.Done */ ? other : fromHist.rest); + } + let isolate = tr.annotation(isolateHistory); + if (isolate == "full" || isolate == "before") + state = state.isolate(); + if (tr.annotation(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Transaction.addToHistory) === false) + return !tr.changes.empty ? state.addMapping(tr.changes.desc) : state; + let event = HistEvent.fromTransaction(tr); + let time = tr.annotation(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Transaction.time), userEvent = tr.annotation(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Transaction.userEvent); + if (event) + state = state.addChanges(event, time, userEvent, config, tr); + else if (tr.selection) + state = state.addSelection(tr.startState.selection, time, userEvent, config.newGroupDelay); + if (isolate == "full" || isolate == "after") + state = state.isolate(); + return state; + }, + toJSON(value) { + return { done: value.done.map(e => e.toJSON()), undone: value.undone.map(e => e.toJSON()) }; + }, + fromJSON(json) { + return new HistoryState(json.done.map(HistEvent.fromJSON), json.undone.map(HistEvent.fromJSON)); + } +}); +/** +Create a history extension with the given configuration. +*/ +function history(config = {}) { + return [ + historyField_, + historyConfig.of(config), + _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.domEventHandlers({ + beforeinput(e, view) { + let command = e.inputType == "historyUndo" ? undo : e.inputType == "historyRedo" ? redo : null; + if (!command) + return false; + e.preventDefault(); + return command(view); + } + }) + ]; +} +/** +The state field used to store the history data. Should probably +only be used when you want to +[serialize](https://codemirror.net/6/docs/ref/#state.EditorState.toJSON) or +[deserialize](https://codemirror.net/6/docs/ref/#state.EditorState^fromJSON) state objects in a way +that preserves history. +*/ +const historyField = historyField_; +function cmd(side, selection) { + return function ({ state, dispatch }) { + if (!selection && state.readOnly) + return false; + let historyState = state.field(historyField_, false); + if (!historyState) + return false; + let tr = historyState.pop(side, state, selection); + if (!tr) + return false; + dispatch(tr); + return true; + }; +} +/** +Undo a single group of history events. Returns false if no group +was available. +*/ +const undo = /*@__PURE__*/cmd(0 /* BranchName.Done */, false); +/** +Redo a group of history events. Returns false if no group was +available. +*/ +const redo = /*@__PURE__*/cmd(1 /* BranchName.Undone */, false); +/** +Undo a change or selection change. +*/ +const undoSelection = /*@__PURE__*/cmd(0 /* BranchName.Done */, true); +/** +Redo a change or selection change. +*/ +const redoSelection = /*@__PURE__*/cmd(1 /* BranchName.Undone */, true); +function depth(side) { + return function (state) { + let histState = state.field(historyField_, false); + if (!histState) + return 0; + let branch = side == 0 /* BranchName.Done */ ? histState.done : histState.undone; + return branch.length - (branch.length && !branch[0].changes ? 1 : 0); + }; +} +/** +The amount of undoable change events available in a given state. +*/ +const undoDepth = /*@__PURE__*/depth(0 /* BranchName.Done */); +/** +The amount of redoable change events available in a given state. +*/ +const redoDepth = /*@__PURE__*/depth(1 /* BranchName.Undone */); +// History events store groups of changes or effects that need to be +// undone/redone together. +class HistEvent { + constructor( + // The changes in this event. Normal events hold at least one + // change or effect. But it may be necessary to store selection + // events before the first change, in which case a special type of + // instance is created which doesn't hold any changes, with + // changes == startSelection == undefined + changes, + // The effects associated with this event + effects, + // Accumulated mapping (from addToHistory==false) that should be + // applied to events below this one. + mapped, + // The selection before this event + startSelection, + // Stores selection changes after this event, to be used for + // selection undo/redo. + selectionsAfter) { + this.changes = changes; + this.effects = effects; + this.mapped = mapped; + this.startSelection = startSelection; + this.selectionsAfter = selectionsAfter; + } + setSelAfter(after) { + return new HistEvent(this.changes, this.effects, this.mapped, this.startSelection, after); + } + toJSON() { + var _a, _b, _c; + return { + changes: (_a = this.changes) === null || _a === void 0 ? void 0 : _a.toJSON(), + mapped: (_b = this.mapped) === null || _b === void 0 ? void 0 : _b.toJSON(), + startSelection: (_c = this.startSelection) === null || _c === void 0 ? void 0 : _c.toJSON(), + selectionsAfter: this.selectionsAfter.map(s => s.toJSON()) + }; + } + static fromJSON(json) { + return new HistEvent(json.changes && _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.ChangeSet.fromJSON(json.changes), [], json.mapped && _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.ChangeDesc.fromJSON(json.mapped), json.startSelection && _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.fromJSON(json.startSelection), json.selectionsAfter.map(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.fromJSON)); + } + // This does not check `addToHistory` and such, it assumes the + // transaction needs to be converted to an item. Returns null when + // there are no changes or effects in the transaction. + static fromTransaction(tr, selection) { + let effects = none; + for (let invert of tr.startState.facet(invertedEffects)) { + let result = invert(tr); + if (result.length) + effects = effects.concat(result); + } + if (!effects.length && tr.changes.empty) + return null; + return new HistEvent(tr.changes.invert(tr.startState.doc), effects, undefined, selection || tr.startState.selection, none); + } + static selection(selections) { + return new HistEvent(undefined, none, undefined, undefined, selections); + } +} +function updateBranch(branch, to, maxLen, newEvent) { + let start = to + 1 > maxLen + 20 ? to - maxLen - 1 : 0; + let newBranch = branch.slice(start, to); + newBranch.push(newEvent); + return newBranch; +} +function isAdjacent(a, b) { + let ranges = [], isAdjacent = false; + a.iterChangedRanges((f, t) => ranges.push(f, t)); + b.iterChangedRanges((_f, _t, f, t) => { + for (let i = 0; i < ranges.length;) { + let from = ranges[i++], to = ranges[i++]; + if (t >= from && f <= to) + isAdjacent = true; + } + }); + return isAdjacent; +} +function eqSelectionShape(a, b) { + return a.ranges.length == b.ranges.length && + a.ranges.filter((r, i) => r.empty != b.ranges[i].empty).length === 0; +} +function conc(a, b) { + return !a.length ? b : !b.length ? a : a.concat(b); +} +const none = []; +const MaxSelectionsPerEvent = 200; +function addSelection(branch, selection) { + if (!branch.length) { + return [HistEvent.selection([selection])]; + } + else { + let lastEvent = branch[branch.length - 1]; + let sels = lastEvent.selectionsAfter.slice(Math.max(0, lastEvent.selectionsAfter.length - MaxSelectionsPerEvent)); + if (sels.length && sels[sels.length - 1].eq(selection)) + return branch; + sels.push(selection); + return updateBranch(branch, branch.length - 1, 1e9, lastEvent.setSelAfter(sels)); + } +} +// Assumes the top item has one or more selectionAfter values +function popSelection(branch) { + let last = branch[branch.length - 1]; + let newBranch = branch.slice(); + newBranch[branch.length - 1] = last.setSelAfter(last.selectionsAfter.slice(0, last.selectionsAfter.length - 1)); + return newBranch; +} +// Add a mapping to the top event in the given branch. If this maps +// away all the changes and effects in that item, drop it and +// propagate the mapping to the next item. +function addMappingToBranch(branch, mapping) { + if (!branch.length) + return branch; + let length = branch.length, selections = none; + while (length) { + let event = mapEvent(branch[length - 1], mapping, selections); + if (event.changes && !event.changes.empty || event.effects.length) { // Event survived mapping + let result = branch.slice(0, length); + result[length - 1] = event; + return result; + } + else { // Drop this event, since there's no changes or effects left + mapping = event.mapped; + length--; + selections = event.selectionsAfter; + } + } + return selections.length ? [HistEvent.selection(selections)] : none; +} +function mapEvent(event, mapping, extraSelections) { + let selections = conc(event.selectionsAfter.length ? event.selectionsAfter.map(s => s.map(mapping)) : none, extraSelections); + // Change-less events don't store mappings (they are always the last event in a branch) + if (!event.changes) + return HistEvent.selection(selections); + let mappedChanges = event.changes.map(mapping), before = mapping.mapDesc(event.changes, true); + let fullMapping = event.mapped ? event.mapped.composeDesc(before) : before; + return new HistEvent(mappedChanges, _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.mapEffects(event.effects, mapping), fullMapping, event.startSelection.map(before), selections); +} +const joinableUserEvent = /^(input\.type|delete)($|\.)/; +class HistoryState { + constructor(done, undone, prevTime = 0, prevUserEvent = undefined) { + this.done = done; + this.undone = undone; + this.prevTime = prevTime; + this.prevUserEvent = prevUserEvent; + } + isolate() { + return this.prevTime ? new HistoryState(this.done, this.undone) : this; + } + addChanges(event, time, userEvent, config, tr) { + let done = this.done, lastEvent = done[done.length - 1]; + if (lastEvent && lastEvent.changes && !lastEvent.changes.empty && event.changes && + (!userEvent || joinableUserEvent.test(userEvent)) && + ((!lastEvent.selectionsAfter.length && + time - this.prevTime < config.newGroupDelay && + config.joinToEvent(tr, isAdjacent(lastEvent.changes, event.changes))) || + // For compose (but not compose.start) events, always join with previous event + userEvent == "input.type.compose")) { + done = updateBranch(done, done.length - 1, config.minDepth, new HistEvent(event.changes.compose(lastEvent.changes), conc(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.mapEffects(event.effects, lastEvent.changes), lastEvent.effects), lastEvent.mapped, lastEvent.startSelection, none)); + } + else { + done = updateBranch(done, done.length, config.minDepth, event); + } + return new HistoryState(done, none, time, userEvent); + } + addSelection(selection, time, userEvent, newGroupDelay) { + let last = this.done.length ? this.done[this.done.length - 1].selectionsAfter : none; + if (last.length > 0 && + time - this.prevTime < newGroupDelay && + userEvent == this.prevUserEvent && userEvent && /^select($|\.)/.test(userEvent) && + eqSelectionShape(last[last.length - 1], selection)) + return this; + return new HistoryState(addSelection(this.done, selection), this.undone, time, userEvent); + } + addMapping(mapping) { + return new HistoryState(addMappingToBranch(this.done, mapping), addMappingToBranch(this.undone, mapping), this.prevTime, this.prevUserEvent); + } + pop(side, state, onlySelection) { + let branch = side == 0 /* BranchName.Done */ ? this.done : this.undone; + if (branch.length == 0) + return null; + let event = branch[branch.length - 1], selection = event.selectionsAfter[0] || state.selection; + if (onlySelection && event.selectionsAfter.length) { + return state.update({ + selection: event.selectionsAfter[event.selectionsAfter.length - 1], + annotations: fromHistory.of({ side, rest: popSelection(branch), selection }), + userEvent: side == 0 /* BranchName.Done */ ? "select.undo" : "select.redo", + scrollIntoView: true + }); + } + else if (!event.changes) { + return null; + } + else { + let rest = branch.length == 1 ? none : branch.slice(0, branch.length - 1); + if (event.mapped) + rest = addMappingToBranch(rest, event.mapped); + return state.update({ + changes: event.changes, + selection: event.startSelection, + effects: event.effects, + annotations: fromHistory.of({ side, rest, selection }), + filter: false, + userEvent: side == 0 /* BranchName.Done */ ? "undo" : "redo", + scrollIntoView: true + }); + } + } +} +HistoryState.empty = /*@__PURE__*/new HistoryState(none, none); +/** +Default key bindings for the undo history. + +- Mod-z: [`undo`](https://codemirror.net/6/docs/ref/#commands.undo). +- Mod-y (Mod-Shift-z on macOS) + Ctrl-Shift-z on Linux: [`redo`](https://codemirror.net/6/docs/ref/#commands.redo). +- Mod-u: [`undoSelection`](https://codemirror.net/6/docs/ref/#commands.undoSelection). +- Alt-u (Mod-Shift-u on macOS): [`redoSelection`](https://codemirror.net/6/docs/ref/#commands.redoSelection). +*/ +const historyKeymap = [ + { key: "Mod-z", run: undo, preventDefault: true }, + { key: "Mod-y", mac: "Mod-Shift-z", run: redo, preventDefault: true }, + { linux: "Ctrl-Shift-z", run: redo, preventDefault: true }, + { key: "Mod-u", run: undoSelection, preventDefault: true }, + { key: "Alt-u", mac: "Mod-Shift-u", run: redoSelection, preventDefault: true } +]; + +function updateSel(sel, by) { + return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create(sel.ranges.map(by), sel.mainIndex); +} +function setSel(state, selection) { + return state.update({ selection, scrollIntoView: true, userEvent: "select" }); +} +function moveSel({ state, dispatch }, how) { + let selection = updateSel(state.selection, how); + if (selection.eq(state.selection, true)) + return false; + dispatch(setSel(state, selection)); + return true; +} +function rangeEnd(range, forward) { + return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(forward ? range.to : range.from); +} +function cursorByChar(view, forward) { + return moveSel(view, range => range.empty ? view.moveByChar(range, forward) : rangeEnd(range, forward)); +} +function ltrAtCursor(view) { + return view.textDirectionAt(view.state.selection.main.head) == _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Direction.LTR; +} +/** +Move the selection one character to the left (which is backward in +left-to-right text, forward in right-to-left text). +*/ +const cursorCharLeft = view => cursorByChar(view, !ltrAtCursor(view)); +/** +Move the selection one character to the right. +*/ +const cursorCharRight = view => cursorByChar(view, ltrAtCursor(view)); +/** +Move the selection one character forward. +*/ +const cursorCharForward = view => cursorByChar(view, true); +/** +Move the selection one character backward. +*/ +const cursorCharBackward = view => cursorByChar(view, false); +function byCharLogical(state, range, forward) { + let pos = range.head, line = state.doc.lineAt(pos); + if (pos == (forward ? line.to : line.from)) + pos = forward ? Math.min(state.doc.length, line.to + 1) : Math.max(0, line.from - 1); + else + pos = line.from + (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, pos - line.from, forward); + return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(pos, forward ? -1 : 1); +} +function moveByCharLogical(target, forward) { + return moveSel(target, range => range.empty ? byCharLogical(target.state, range, forward) : rangeEnd(range, forward)); +} +/** +Move the selection one character forward, in logical +(non-text-direction-aware) string index order. +*/ +const cursorCharForwardLogical = target => moveByCharLogical(target, true); +/** +Move the selection one character backward, in logical string index +order. +*/ +const cursorCharBackwardLogical = target => moveByCharLogical(target, false); +function cursorByGroup(view, forward) { + return moveSel(view, range => range.empty ? view.moveByGroup(range, forward) : rangeEnd(range, forward)); +} +/** +Move the selection to the left across one group of word or +non-word (but also non-space) characters. +*/ +const cursorGroupLeft = view => cursorByGroup(view, !ltrAtCursor(view)); +/** +Move the selection one group to the right. +*/ +const cursorGroupRight = view => cursorByGroup(view, ltrAtCursor(view)); +/** +Move the selection one group forward. +*/ +const cursorGroupForward = view => cursorByGroup(view, true); +/** +Move the selection one group backward. +*/ +const cursorGroupBackward = view => cursorByGroup(view, false); +function toGroupStart(view, pos, start) { + let categorize = view.state.charCategorizer(pos); + let cat = categorize(start), initial = cat != _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Space; + return (next) => { + let nextCat = categorize(next); + if (nextCat != _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Space) + return initial && nextCat == cat; + initial = false; + return true; + }; +} +/** +Move the cursor one group forward in the default Windows style, +where it moves to the start of the next group. +*/ +const cursorGroupForwardWin = view => { + return moveSel(view, range => range.empty + ? view.moveByChar(range, true, start => toGroupStart(view, range.head, start)) + : rangeEnd(range, true)); +}; +const segmenter = typeof Intl != "undefined" && Intl.Segmenter ? + /*@__PURE__*/new (Intl.Segmenter)(undefined, { granularity: "word" }) : null; +function moveBySubword(view, range, forward) { + let categorize = view.state.charCategorizer(range.from); + let cat = _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Space, pos = range.from, steps = 0; + let done = false, sawUpper = false, sawLower = false; + let step = (next) => { + if (done) + return false; + pos += forward ? next.length : -next.length; + let nextCat = categorize(next), ahead; + if (nextCat == _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word && next.charCodeAt(0) < 128 && /[\W_]/.test(next)) + nextCat = -1; // Treat word punctuation specially + if (cat == _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Space) + cat = nextCat; + if (cat != nextCat) + return false; + if (cat == _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word) { + if (next.toLowerCase() == next) { + if (!forward && sawUpper) + return false; + sawLower = true; + } + else if (sawLower) { + if (forward) + return false; + done = true; + } + else { + if (sawUpper && forward && categorize(ahead = view.state.sliceDoc(pos, pos + 1)) == _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word && + ahead.toLowerCase() == ahead) + return false; + sawUpper = true; + } + } + steps++; + return true; + }; + let end = view.moveByChar(range, forward, start => { + step(start); + return step; + }); + if (segmenter && cat == _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word && end.from == range.from + steps * (forward ? 1 : -1)) { + let from = Math.min(range.head, end.head), to = Math.max(range.head, end.head); + let skipped = view.state.sliceDoc(from, to); + if (skipped.length > 1 && /[\u4E00-\uffff]/.test(skipped)) { + let segments = Array.from(segmenter.segment(skipped)); + if (segments.length > 1) { + if (forward) + return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.head + segments[1].index, -1); + return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(end.head + segments[segments.length - 1].index, 1); + } + } + } + return end; +} +function cursorBySubword(view, forward) { + return moveSel(view, range => range.empty ? moveBySubword(view, range, forward) : rangeEnd(range, forward)); +} +/** +Move the selection one group or camel-case subword forward. +*/ +const cursorSubwordForward = view => cursorBySubword(view, true); +/** +Move the selection one group or camel-case subword backward. +*/ +const cursorSubwordBackward = view => cursorBySubword(view, false); +function interestingNode(state, node, bracketProp) { + if (node.type.prop(bracketProp)) + return true; + let len = node.to - node.from; + return len && (len > 2 || /[^\s,.;:]/.test(state.sliceDoc(node.from, node.to))) || node.firstChild; +} +function moveBySyntax(state, start, forward) { + let pos = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.syntaxTree)(state).resolveInner(start.head); + let bracketProp = forward ? _lezer_common__WEBPACK_IMPORTED_MODULE_0__.NodeProp.closedBy : _lezer_common__WEBPACK_IMPORTED_MODULE_0__.NodeProp.openedBy; + // Scan forward through child nodes to see if there's an interesting + // node ahead. + for (let at = start.head;;) { + let next = forward ? pos.childAfter(at) : pos.childBefore(at); + if (!next) + break; + if (interestingNode(state, next, bracketProp)) + pos = next; + else + at = forward ? next.to : next.from; + } + let bracket = pos.type.prop(bracketProp), match, newPos; + if (bracket && (match = forward ? (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, pos.from, 1) : (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, pos.to, -1)) && match.matched) + newPos = forward ? match.end.to : match.end.from; + else + newPos = forward ? pos.to : pos.from; + return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(newPos, forward ? -1 : 1); +} +/** +Move the cursor over the next syntactic element to the left. +*/ +const cursorSyntaxLeft = view => moveSel(view, range => moveBySyntax(view.state, range, !ltrAtCursor(view))); +/** +Move the cursor over the next syntactic element to the right. +*/ +const cursorSyntaxRight = view => moveSel(view, range => moveBySyntax(view.state, range, ltrAtCursor(view))); +function cursorByLine(view, forward) { + return moveSel(view, range => { + if (!range.empty) + return rangeEnd(range, forward); + let moved = view.moveVertically(range, forward); + return moved.head != range.head ? moved : view.moveToLineBoundary(range, forward); + }); +} +/** +Move the selection one line up. +*/ +const cursorLineUp = view => cursorByLine(view, false); +/** +Move the selection one line down. +*/ +const cursorLineDown = view => cursorByLine(view, true); +function pageInfo(view) { + let selfScroll = view.scrollDOM.clientHeight < view.scrollDOM.scrollHeight - 2; + let marginTop = 0, marginBottom = 0, height; + if (selfScroll) { + for (let source of view.state.facet(_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.scrollMargins)) { + let margins = source(view); + if (margins === null || margins === void 0 ? void 0 : margins.top) + marginTop = Math.max(margins === null || margins === void 0 ? void 0 : margins.top, marginTop); + if (margins === null || margins === void 0 ? void 0 : margins.bottom) + marginBottom = Math.max(margins === null || margins === void 0 ? void 0 : margins.bottom, marginBottom); + } + height = view.scrollDOM.clientHeight - marginTop - marginBottom; + } + else { + height = (view.dom.ownerDocument.defaultView || window).innerHeight; + } + return { marginTop, marginBottom, selfScroll, + height: Math.max(view.defaultLineHeight, height - 5) }; +} +function cursorByPage(view, forward) { + let page = pageInfo(view); + let { state } = view, selection = updateSel(state.selection, range => { + return range.empty ? view.moveVertically(range, forward, page.height) + : rangeEnd(range, forward); + }); + if (selection.eq(state.selection)) + return false; + let effect; + if (page.selfScroll) { + let startPos = view.coordsAtPos(state.selection.main.head); + let scrollRect = view.scrollDOM.getBoundingClientRect(); + let scrollTop = scrollRect.top + page.marginTop, scrollBottom = scrollRect.bottom - page.marginBottom; + if (startPos && startPos.top > scrollTop && startPos.bottom < scrollBottom) + effect = _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.scrollIntoView(selection.main.head, { y: "start", yMargin: startPos.top - scrollTop }); + } + view.dispatch(setSel(state, selection), { effects: effect }); + return true; +} +/** +Move the selection one page up. +*/ +const cursorPageUp = view => cursorByPage(view, false); +/** +Move the selection one page down. +*/ +const cursorPageDown = view => cursorByPage(view, true); +function moveByLineBoundary(view, start, forward) { + let line = view.lineBlockAt(start.head), moved = view.moveToLineBoundary(start, forward); + if (moved.head == start.head && moved.head != (forward ? line.to : line.from)) + moved = view.moveToLineBoundary(start, forward, false); + if (!forward && moved.head == line.from && line.length) { + let space = /^\s*/.exec(view.state.sliceDoc(line.from, Math.min(line.from + 100, line.to)))[0].length; + if (space && start.head != line.from + space) + moved = _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(line.from + space); + } + return moved; +} +/** +Move the selection to the next line wrap point, or to the end of +the line if there isn't one left on this line. +*/ +const cursorLineBoundaryForward = view => moveSel(view, range => moveByLineBoundary(view, range, true)); +/** +Move the selection to previous line wrap point, or failing that to +the start of the line. If the line is indented, and the cursor +isn't already at the end of the indentation, this will move to the +end of the indentation instead of the start of the line. +*/ +const cursorLineBoundaryBackward = view => moveSel(view, range => moveByLineBoundary(view, range, false)); +/** +Move the selection one line wrap point to the left. +*/ +const cursorLineBoundaryLeft = view => moveSel(view, range => moveByLineBoundary(view, range, !ltrAtCursor(view))); +/** +Move the selection one line wrap point to the right. +*/ +const cursorLineBoundaryRight = view => moveSel(view, range => moveByLineBoundary(view, range, ltrAtCursor(view))); +/** +Move the selection to the start of the line. +*/ +const cursorLineStart = view => moveSel(view, range => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(view.lineBlockAt(range.head).from, 1)); +/** +Move the selection to the end of the line. +*/ +const cursorLineEnd = view => moveSel(view, range => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(view.lineBlockAt(range.head).to, -1)); +function toMatchingBracket(state, dispatch, extend) { + let found = false, selection = updateSel(state.selection, range => { + let matching = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, range.head, -1) + || (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, range.head, 1) + || (range.head > 0 && (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, range.head - 1, 1)) + || (range.head < state.doc.length && (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, range.head + 1, -1)); + if (!matching || !matching.end) + return range; + found = true; + let head = matching.start.from == range.head ? matching.end.to : matching.end.from; + return extend ? _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(range.anchor, head) : _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(head); + }); + if (!found) + return false; + dispatch(setSel(state, selection)); + return true; +} +/** +Move the selection to the bracket matching the one it is currently +on, if any. +*/ +const cursorMatchingBracket = ({ state, dispatch }) => toMatchingBracket(state, dispatch, false); +/** +Extend the selection to the bracket matching the one the selection +head is currently on, if any. +*/ +const selectMatchingBracket = ({ state, dispatch }) => toMatchingBracket(state, dispatch, true); +function extendSel(target, how) { + let selection = updateSel(target.state.selection, range => { + let head = how(range); + return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(range.anchor, head.head, head.goalColumn, head.bidiLevel || undefined); + }); + if (selection.eq(target.state.selection)) + return false; + target.dispatch(setSel(target.state, selection)); + return true; +} +function selectByChar(view, forward) { + return extendSel(view, range => view.moveByChar(range, forward)); +} +/** +Move the selection head one character to the left, while leaving +the anchor in place. +*/ +const selectCharLeft = view => selectByChar(view, !ltrAtCursor(view)); +/** +Move the selection head one character to the right. +*/ +const selectCharRight = view => selectByChar(view, ltrAtCursor(view)); +/** +Move the selection head one character forward. +*/ +const selectCharForward = view => selectByChar(view, true); +/** +Move the selection head one character backward. +*/ +const selectCharBackward = view => selectByChar(view, false); +/** +Move the selection head one character forward by logical +(non-direction aware) string index order. +*/ +const selectCharForwardLogical = target => extendSel(target, range => byCharLogical(target.state, range, true)); +/** +Move the selection head one character backward by logical string +index order. +*/ +const selectCharBackwardLogical = target => extendSel(target, range => byCharLogical(target.state, range, false)); +function selectByGroup(view, forward) { + return extendSel(view, range => view.moveByGroup(range, forward)); +} +/** +Move the selection head one [group](https://codemirror.net/6/docs/ref/#commands.cursorGroupLeft) to +the left. +*/ +const selectGroupLeft = view => selectByGroup(view, !ltrAtCursor(view)); +/** +Move the selection head one group to the right. +*/ +const selectGroupRight = view => selectByGroup(view, ltrAtCursor(view)); +/** +Move the selection head one group forward. +*/ +const selectGroupForward = view => selectByGroup(view, true); +/** +Move the selection head one group backward. +*/ +const selectGroupBackward = view => selectByGroup(view, false); +/** +Move the selection head one group forward in the default Windows +style, skipping to the start of the next group. +*/ +const selectGroupForwardWin = view => { + return extendSel(view, range => view.moveByChar(range, true, start => toGroupStart(view, range.head, start))); +}; +function selectBySubword(view, forward) { + return extendSel(view, range => moveBySubword(view, range, forward)); +} +/** +Move the selection head one group or camel-case subword forward. +*/ +const selectSubwordForward = view => selectBySubword(view, true); +/** +Move the selection head one group or subword backward. +*/ +const selectSubwordBackward = view => selectBySubword(view, false); +/** +Move the selection head over the next syntactic element to the left. +*/ +const selectSyntaxLeft = view => extendSel(view, range => moveBySyntax(view.state, range, !ltrAtCursor(view))); +/** +Move the selection head over the next syntactic element to the right. +*/ +const selectSyntaxRight = view => extendSel(view, range => moveBySyntax(view.state, range, ltrAtCursor(view))); +function selectByLine(view, forward) { + return extendSel(view, range => view.moveVertically(range, forward)); +} +/** +Move the selection head one line up. +*/ +const selectLineUp = view => selectByLine(view, false); +/** +Move the selection head one line down. +*/ +const selectLineDown = view => selectByLine(view, true); +function selectByPage(view, forward) { + return extendSel(view, range => view.moveVertically(range, forward, pageInfo(view).height)); +} +/** +Move the selection head one page up. +*/ +const selectPageUp = view => selectByPage(view, false); +/** +Move the selection head one page down. +*/ +const selectPageDown = view => selectByPage(view, true); +/** +Move the selection head to the next line boundary. +*/ +const selectLineBoundaryForward = view => extendSel(view, range => moveByLineBoundary(view, range, true)); +/** +Move the selection head to the previous line boundary. +*/ +const selectLineBoundaryBackward = view => extendSel(view, range => moveByLineBoundary(view, range, false)); +/** +Move the selection head one line boundary to the left. +*/ +const selectLineBoundaryLeft = view => extendSel(view, range => moveByLineBoundary(view, range, !ltrAtCursor(view))); +/** +Move the selection head one line boundary to the right. +*/ +const selectLineBoundaryRight = view => extendSel(view, range => moveByLineBoundary(view, range, ltrAtCursor(view))); +/** +Move the selection head to the start of the line. +*/ +const selectLineStart = view => extendSel(view, range => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(view.lineBlockAt(range.head).from)); +/** +Move the selection head to the end of the line. +*/ +const selectLineEnd = view => extendSel(view, range => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(view.lineBlockAt(range.head).to)); +/** +Move the selection to the start of the document. +*/ +const cursorDocStart = ({ state, dispatch }) => { + dispatch(setSel(state, { anchor: 0 })); + return true; +}; +/** +Move the selection to the end of the document. +*/ +const cursorDocEnd = ({ state, dispatch }) => { + dispatch(setSel(state, { anchor: state.doc.length })); + return true; +}; +/** +Move the selection head to the start of the document. +*/ +const selectDocStart = ({ state, dispatch }) => { + dispatch(setSel(state, { anchor: state.selection.main.anchor, head: 0 })); + return true; +}; +/** +Move the selection head to the end of the document. +*/ +const selectDocEnd = ({ state, dispatch }) => { + dispatch(setSel(state, { anchor: state.selection.main.anchor, head: state.doc.length })); + return true; +}; +/** +Select the entire document. +*/ +const selectAll = ({ state, dispatch }) => { + dispatch(state.update({ selection: { anchor: 0, head: state.doc.length }, userEvent: "select" })); + return true; +}; +/** +Expand the selection to cover entire lines. +*/ +const selectLine = ({ state, dispatch }) => { + let ranges = selectedLineBlocks(state).map(({ from, to }) => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(from, Math.min(to + 1, state.doc.length))); + dispatch(state.update({ selection: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create(ranges), userEvent: "select" })); + return true; +}; +/** +Select the next syntactic construct that is larger than the +selection. Note that this will only work insofar as the language +[provider](https://codemirror.net/6/docs/ref/#language.language) you use builds up a full +syntax tree. +*/ +const selectParentSyntax = ({ state, dispatch }) => { + let selection = updateSel(state.selection, range => { + let tree = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.syntaxTree)(state), stack = tree.resolveStack(range.from, 1); + if (range.empty) { + let stackBefore = tree.resolveStack(range.from, -1); + if (stackBefore.node.from >= stack.node.from && stackBefore.node.to <= stack.node.to) + stack = stackBefore; + } + for (let cur = stack; cur; cur = cur.next) { + let { node } = cur; + if (((node.from < range.from && node.to >= range.to) || + (node.to > range.to && node.from <= range.from)) && + cur.next) + return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(node.to, node.from); + } + return range; + }); + if (selection.eq(state.selection)) + return false; + dispatch(setSel(state, selection)); + return true; +}; +/** +Simplify the current selection. When multiple ranges are selected, +reduce it to its main range. Otherwise, if the selection is +non-empty, convert it to a cursor selection. +*/ +const simplifySelection = ({ state, dispatch }) => { + let cur = state.selection, selection = null; + if (cur.ranges.length > 1) + selection = _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create([cur.main]); + else if (!cur.main.empty) + selection = _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create([_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(cur.main.head)]); + if (!selection) + return false; + dispatch(setSel(state, selection)); + return true; +}; +function deleteBy(target, by) { + if (target.state.readOnly) + return false; + let event = "delete.selection", { state } = target; + let changes = state.changeByRange(range => { + let { from, to } = range; + if (from == to) { + let towards = by(range); + if (towards < from) { + event = "delete.backward"; + towards = skipAtomic(target, towards, false); + } + else if (towards > from) { + event = "delete.forward"; + towards = skipAtomic(target, towards, true); + } + from = Math.min(from, towards); + to = Math.max(to, towards); + } + else { + from = skipAtomic(target, from, false); + to = skipAtomic(target, to, true); + } + return from == to ? { range } : { changes: { from, to }, range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(from, from < range.head ? -1 : 1) }; + }); + if (changes.changes.empty) + return false; + target.dispatch(state.update(changes, { + scrollIntoView: true, + userEvent: event, + effects: event == "delete.selection" ? _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.announce.of(state.phrase("Selection deleted")) : undefined + })); + return true; +} +function skipAtomic(target, pos, forward) { + if (target instanceof _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView) + for (let ranges of target.state.facet(_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.atomicRanges).map(f => f(target))) + ranges.between(pos, pos, (from, to) => { + if (from < pos && to > pos) + pos = forward ? to : from; + }); + return pos; +} +const deleteByChar = (target, forward, byIndentUnit) => deleteBy(target, range => { + let pos = range.from, { state } = target, line = state.doc.lineAt(pos), before, targetPos; + if (byIndentUnit && !forward && pos > line.from && pos < line.from + 200 && + !/[^ \t]/.test(before = line.text.slice(0, pos - line.from))) { + if (before[before.length - 1] == "\t") + return pos - 1; + let col = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.countColumn)(before, state.tabSize), drop = col % (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.getIndentUnit)(state) || (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.getIndentUnit)(state); + for (let i = 0; i < drop && before[before.length - 1 - i] == " "; i++) + pos--; + targetPos = pos; + } + else { + targetPos = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, pos - line.from, forward, forward) + line.from; + if (targetPos == pos && line.number != (forward ? state.doc.lines : 1)) + targetPos += forward ? 1 : -1; + else if (!forward && /[\ufe00-\ufe0f]/.test(line.text.slice(targetPos - line.from, pos - line.from))) + targetPos = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, targetPos - line.from, false, false) + line.from; + } + return targetPos; +}); +/** +Delete the selection, or, for cursor selections, the character or +indentation unit before the cursor. +*/ +const deleteCharBackward = view => deleteByChar(view, false, true); +/** +Delete the selection or the character before the cursor. Does not +implement any extended behavior like deleting whole indentation +units in one go. +*/ +const deleteCharBackwardStrict = view => deleteByChar(view, false, false); +/** +Delete the selection or the character after the cursor. +*/ +const deleteCharForward = view => deleteByChar(view, true, false); +const deleteByGroup = (target, forward) => deleteBy(target, range => { + let pos = range.head, { state } = target, line = state.doc.lineAt(pos); + let categorize = state.charCategorizer(pos); + for (let cat = null;;) { + if (pos == (forward ? line.to : line.from)) { + if (pos == range.head && line.number != (forward ? state.doc.lines : 1)) + pos += forward ? 1 : -1; + break; + } + let next = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, pos - line.from, forward) + line.from; + let nextChar = line.text.slice(Math.min(pos, next) - line.from, Math.max(pos, next) - line.from); + let nextCat = categorize(nextChar); + if (cat != null && nextCat != cat) + break; + if (nextChar != " " || pos != range.head) + cat = nextCat; + pos = next; + } + return pos; +}); +/** +Delete the selection or backward until the end of the next +[group](https://codemirror.net/6/docs/ref/#view.EditorView.moveByGroup), only skipping groups of +whitespace when they consist of a single space. +*/ +const deleteGroupBackward = target => deleteByGroup(target, false); +/** +Delete the selection or forward until the end of the next group. +*/ +const deleteGroupForward = target => deleteByGroup(target, true); +/** +Delete the selection, or, if it is a cursor selection, delete to +the end of the line. If the cursor is directly at the end of the +line, delete the line break after it. +*/ +const deleteToLineEnd = view => deleteBy(view, range => { + let lineEnd = view.lineBlockAt(range.head).to; + return range.head < lineEnd ? lineEnd : Math.min(view.state.doc.length, range.head + 1); +}); +/** +Delete the selection, or, if it is a cursor selection, delete to +the start of the line. If the cursor is directly at the start of the +line, delete the line break before it. +*/ +const deleteToLineStart = view => deleteBy(view, range => { + let lineStart = view.lineBlockAt(range.head).from; + return range.head > lineStart ? lineStart : Math.max(0, range.head - 1); +}); +/** +Delete the selection, or, if it is a cursor selection, delete to +the start of the line or the next line wrap before the cursor. +*/ +const deleteLineBoundaryBackward = view => deleteBy(view, range => { + let lineStart = view.moveToLineBoundary(range, false).head; + return range.head > lineStart ? lineStart : Math.max(0, range.head - 1); +}); +/** +Delete the selection, or, if it is a cursor selection, delete to +the end of the line or the next line wrap after the cursor. +*/ +const deleteLineBoundaryForward = view => deleteBy(view, range => { + let lineStart = view.moveToLineBoundary(range, true).head; + return range.head < lineStart ? lineStart : Math.min(view.state.doc.length, range.head + 1); +}); +/** +Delete all whitespace directly before a line end from the +document. +*/ +const deleteTrailingWhitespace = ({ state, dispatch }) => { + if (state.readOnly) + return false; + let changes = []; + for (let pos = 0, prev = "", iter = state.doc.iter();;) { + iter.next(); + if (iter.lineBreak || iter.done) { + let trailing = prev.search(/\s+$/); + if (trailing > -1) + changes.push({ from: pos - (prev.length - trailing), to: pos }); + if (iter.done) + break; + prev = ""; + } + else { + prev = iter.value; + } + pos += iter.value.length; + } + if (!changes.length) + return false; + dispatch(state.update({ changes, userEvent: "delete" })); + return true; +}; +/** +Replace each selection range with a line break, leaving the cursor +on the line before the break. +*/ +const splitLine = ({ state, dispatch }) => { + if (state.readOnly) + return false; + let changes = state.changeByRange(range => { + return { changes: { from: range.from, to: range.to, insert: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Text.of(["", ""]) }, + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.from) }; + }); + dispatch(state.update(changes, { scrollIntoView: true, userEvent: "input" })); + return true; +}; +/** +Flip the characters before and after the cursor(s). +*/ +const transposeChars = ({ state, dispatch }) => { + if (state.readOnly) + return false; + let changes = state.changeByRange(range => { + if (!range.empty || range.from == 0 || range.from == state.doc.length) + return { range }; + let pos = range.from, line = state.doc.lineAt(pos); + let from = pos == line.from ? pos - 1 : (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, pos - line.from, false) + line.from; + let to = pos == line.to ? pos + 1 : (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, pos - line.from, true) + line.from; + return { changes: { from, to, insert: state.doc.slice(pos, to).append(state.doc.slice(from, pos)) }, + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(to) }; + }); + if (changes.changes.empty) + return false; + dispatch(state.update(changes, { scrollIntoView: true, userEvent: "move.character" })); + return true; +}; +function selectedLineBlocks(state) { + let blocks = [], upto = -1; + for (let range of state.selection.ranges) { + let startLine = state.doc.lineAt(range.from), endLine = state.doc.lineAt(range.to); + if (!range.empty && range.to == endLine.from) + endLine = state.doc.lineAt(range.to - 1); + if (upto >= startLine.number) { + let prev = blocks[blocks.length - 1]; + prev.to = endLine.to; + prev.ranges.push(range); + } + else { + blocks.push({ from: startLine.from, to: endLine.to, ranges: [range] }); + } + upto = endLine.number + 1; + } + return blocks; +} +function moveLine(state, dispatch, forward) { + if (state.readOnly) + return false; + let changes = [], ranges = []; + for (let block of selectedLineBlocks(state)) { + if (forward ? block.to == state.doc.length : block.from == 0) + continue; + let nextLine = state.doc.lineAt(forward ? block.to + 1 : block.from - 1); + let size = nextLine.length + 1; + if (forward) { + changes.push({ from: block.to, to: nextLine.to }, { from: block.from, insert: nextLine.text + state.lineBreak }); + for (let r of block.ranges) + ranges.push(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(Math.min(state.doc.length, r.anchor + size), Math.min(state.doc.length, r.head + size))); + } + else { + changes.push({ from: nextLine.from, to: block.from }, { from: block.to, insert: state.lineBreak + nextLine.text }); + for (let r of block.ranges) + ranges.push(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(r.anchor - size, r.head - size)); + } + } + if (!changes.length) + return false; + dispatch(state.update({ + changes, + scrollIntoView: true, + selection: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create(ranges, state.selection.mainIndex), + userEvent: "move.line" + })); + return true; +} +/** +Move the selected lines up one line. +*/ +const moveLineUp = ({ state, dispatch }) => moveLine(state, dispatch, false); +/** +Move the selected lines down one line. +*/ +const moveLineDown = ({ state, dispatch }) => moveLine(state, dispatch, true); +function copyLine(state, dispatch, forward) { + if (state.readOnly) + return false; + let changes = []; + for (let block of selectedLineBlocks(state)) { + if (forward) + changes.push({ from: block.from, insert: state.doc.slice(block.from, block.to) + state.lineBreak }); + else + changes.push({ from: block.to, insert: state.lineBreak + state.doc.slice(block.from, block.to) }); + } + dispatch(state.update({ changes, scrollIntoView: true, userEvent: "input.copyline" })); + return true; +} +/** +Create a copy of the selected lines. Keep the selection in the top copy. +*/ +const copyLineUp = ({ state, dispatch }) => copyLine(state, dispatch, false); +/** +Create a copy of the selected lines. Keep the selection in the bottom copy. +*/ +const copyLineDown = ({ state, dispatch }) => copyLine(state, dispatch, true); +/** +Delete selected lines. +*/ +const deleteLine = view => { + if (view.state.readOnly) + return false; + let { state } = view, changes = state.changes(selectedLineBlocks(state).map(({ from, to }) => { + if (from > 0) + from--; + else if (to < state.doc.length) + to++; + return { from, to }; + })); + let selection = updateSel(state.selection, range => { + let dist = undefined; + if (view.lineWrapping) { + let block = view.lineBlockAt(range.head), pos = view.coordsAtPos(range.head, range.assoc || 1); + if (pos) + dist = (block.bottom + view.documentTop) - pos.bottom + view.defaultLineHeight / 2; + } + return view.moveVertically(range, true, dist); + }).map(changes); + view.dispatch({ changes, selection, scrollIntoView: true, userEvent: "delete.line" }); + return true; +}; +/** +Replace the selection with a newline. +*/ +const insertNewline = ({ state, dispatch }) => { + dispatch(state.update(state.replaceSelection(state.lineBreak), { scrollIntoView: true, userEvent: "input" })); + return true; +}; +/** +Replace the selection with a newline and the same amount of +indentation as the line above. +*/ +const insertNewlineKeepIndent = ({ state, dispatch }) => { + dispatch(state.update(state.changeByRange(range => { + let indent = /^\s*/.exec(state.doc.lineAt(range.from).text)[0]; + return { + changes: { from: range.from, to: range.to, insert: state.lineBreak + indent }, + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.from + indent.length + 1) + }; + }), { scrollIntoView: true, userEvent: "input" })); + return true; +}; +function isBetweenBrackets(state, pos) { + if (/\(\)|\[\]|\{\}/.test(state.sliceDoc(pos - 1, pos + 1))) + return { from: pos, to: pos }; + let context = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.syntaxTree)(state).resolveInner(pos); + let before = context.childBefore(pos), after = context.childAfter(pos), closedBy; + if (before && after && before.to <= pos && after.from >= pos && + (closedBy = before.type.prop(_lezer_common__WEBPACK_IMPORTED_MODULE_0__.NodeProp.closedBy)) && closedBy.indexOf(after.name) > -1 && + state.doc.lineAt(before.to).from == state.doc.lineAt(after.from).from && + !/\S/.test(state.sliceDoc(before.to, after.from))) + return { from: before.to, to: after.from }; + return null; +} +/** +Replace the selection with a newline and indent the newly created +line(s). If the current line consists only of whitespace, this +will also delete that whitespace. When the cursor is between +matching brackets, an additional newline will be inserted after +the cursor. +*/ +const insertNewlineAndIndent = /*@__PURE__*/newlineAndIndent(false); +/** +Create a blank, indented line below the current line. +*/ +const insertBlankLine = /*@__PURE__*/newlineAndIndent(true); +function newlineAndIndent(atEof) { + return ({ state, dispatch }) => { + if (state.readOnly) + return false; + let changes = state.changeByRange(range => { + let { from, to } = range, line = state.doc.lineAt(from); + let explode = !atEof && from == to && isBetweenBrackets(state, from); + if (atEof) + from = to = (to <= line.to ? line : state.doc.lineAt(to)).to; + let cx = new _codemirror_language__WEBPACK_IMPORTED_MODULE_3__.IndentContext(state, { simulateBreak: from, simulateDoubleBreak: !!explode }); + let indent = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.getIndentation)(cx, from); + if (indent == null) + indent = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.countColumn)(/^\s*/.exec(state.doc.lineAt(from).text)[0], state.tabSize); + while (to < line.to && /\s/.test(line.text[to - line.from])) + to++; + if (explode) + ({ from, to } = explode); + else if (from > line.from && from < line.from + 100 && !/\S/.test(line.text.slice(0, from))) + from = line.from; + let insert = ["", (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.indentString)(state, indent)]; + if (explode) + insert.push((0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.indentString)(state, cx.lineIndent(line.from, -1))); + return { changes: { from, to, insert: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Text.of(insert) }, + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(from + 1 + insert[1].length) }; + }); + dispatch(state.update(changes, { scrollIntoView: true, userEvent: "input" })); + return true; + }; +} +function changeBySelectedLine(state, f) { + let atLine = -1; + return state.changeByRange(range => { + let changes = []; + for (let pos = range.from; pos <= range.to;) { + let line = state.doc.lineAt(pos); + if (line.number > atLine && (range.empty || range.to > line.from)) { + f(line, changes, range); + atLine = line.number; + } + pos = line.to + 1; + } + let changeSet = state.changes(changes); + return { changes, + range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(changeSet.mapPos(range.anchor, 1), changeSet.mapPos(range.head, 1)) }; + }); +} +/** +Auto-indent the selected lines. This uses the [indentation service +facet](https://codemirror.net/6/docs/ref/#language.indentService) as source for auto-indent +information. +*/ +const indentSelection = ({ state, dispatch }) => { + if (state.readOnly) + return false; + let updated = Object.create(null); + let context = new _codemirror_language__WEBPACK_IMPORTED_MODULE_3__.IndentContext(state, { overrideIndentation: start => { + let found = updated[start]; + return found == null ? -1 : found; + } }); + let changes = changeBySelectedLine(state, (line, changes, range) => { + let indent = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.getIndentation)(context, line.from); + if (indent == null) + return; + if (!/\S/.test(line.text)) + indent = 0; + let cur = /^\s*/.exec(line.text)[0]; + let norm = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.indentString)(state, indent); + if (cur != norm || range.from < line.from + cur.length) { + updated[line.from] = indent; + changes.push({ from: line.from, to: line.from + cur.length, insert: norm }); + } + }); + if (!changes.changes.empty) + dispatch(state.update(changes, { userEvent: "indent" })); + return true; +}; +/** +Add a [unit](https://codemirror.net/6/docs/ref/#language.indentUnit) of indentation to all selected +lines. +*/ +const indentMore = ({ state, dispatch }) => { + if (state.readOnly) + return false; + dispatch(state.update(changeBySelectedLine(state, (line, changes) => { + changes.push({ from: line.from, insert: state.facet(_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.indentUnit) }); + }), { userEvent: "input.indent" })); + return true; +}; +/** +Remove a [unit](https://codemirror.net/6/docs/ref/#language.indentUnit) of indentation from all +selected lines. +*/ +const indentLess = ({ state, dispatch }) => { + if (state.readOnly) + return false; + dispatch(state.update(changeBySelectedLine(state, (line, changes) => { + let space = /^\s*/.exec(line.text)[0]; + if (!space) + return; + let col = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.countColumn)(space, state.tabSize), keep = 0; + let insert = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.indentString)(state, Math.max(0, col - (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.getIndentUnit)(state))); + while (keep < space.length && keep < insert.length && space.charCodeAt(keep) == insert.charCodeAt(keep)) + keep++; + changes.push({ from: line.from + keep, to: line.from + space.length, insert: insert.slice(keep) }); + }), { userEvent: "delete.dedent" })); + return true; +}; +/** +Enables or disables +[tab-focus mode](https://codemirror.net/6/docs/ref/#view.EditorView.setTabFocusMode). While on, this +prevents the editor's key bindings from capturing Tab or +Shift-Tab, making it possible for the user to move focus out of +the editor with the keyboard. +*/ +const toggleTabFocusMode = view => { + view.setTabFocusMode(); + return true; +}; +/** +Temporarily enables [tab-focus +mode](https://codemirror.net/6/docs/ref/#view.EditorView.setTabFocusMode) for two seconds or until +another key is pressed. +*/ +const temporarilySetTabFocusMode = view => { + view.setTabFocusMode(2000); + return true; +}; +/** +Insert a tab character at the cursor or, if something is selected, +use [`indentMore`](https://codemirror.net/6/docs/ref/#commands.indentMore) to indent the entire +selection. +*/ +const insertTab = ({ state, dispatch }) => { + if (state.selection.ranges.some(r => !r.empty)) + return indentMore({ state, dispatch }); + dispatch(state.update(state.replaceSelection("\t"), { scrollIntoView: true, userEvent: "input" })); + return true; +}; +/** +Array of key bindings containing the Emacs-style bindings that are +available on macOS by default. + + - Ctrl-b: [`cursorCharLeft`](https://codemirror.net/6/docs/ref/#commands.cursorCharLeft) ([`selectCharLeft`](https://codemirror.net/6/docs/ref/#commands.selectCharLeft) with Shift) + - Ctrl-f: [`cursorCharRight`](https://codemirror.net/6/docs/ref/#commands.cursorCharRight) ([`selectCharRight`](https://codemirror.net/6/docs/ref/#commands.selectCharRight) with Shift) + - Ctrl-p: [`cursorLineUp`](https://codemirror.net/6/docs/ref/#commands.cursorLineUp) ([`selectLineUp`](https://codemirror.net/6/docs/ref/#commands.selectLineUp) with Shift) + - Ctrl-n: [`cursorLineDown`](https://codemirror.net/6/docs/ref/#commands.cursorLineDown) ([`selectLineDown`](https://codemirror.net/6/docs/ref/#commands.selectLineDown) with Shift) + - Ctrl-a: [`cursorLineStart`](https://codemirror.net/6/docs/ref/#commands.cursorLineStart) ([`selectLineStart`](https://codemirror.net/6/docs/ref/#commands.selectLineStart) with Shift) + - Ctrl-e: [`cursorLineEnd`](https://codemirror.net/6/docs/ref/#commands.cursorLineEnd) ([`selectLineEnd`](https://codemirror.net/6/docs/ref/#commands.selectLineEnd) with Shift) + - Ctrl-d: [`deleteCharForward`](https://codemirror.net/6/docs/ref/#commands.deleteCharForward) + - Ctrl-h: [`deleteCharBackward`](https://codemirror.net/6/docs/ref/#commands.deleteCharBackward) + - Ctrl-k: [`deleteToLineEnd`](https://codemirror.net/6/docs/ref/#commands.deleteToLineEnd) + - Ctrl-Alt-h: [`deleteGroupBackward`](https://codemirror.net/6/docs/ref/#commands.deleteGroupBackward) + - Ctrl-o: [`splitLine`](https://codemirror.net/6/docs/ref/#commands.splitLine) + - Ctrl-t: [`transposeChars`](https://codemirror.net/6/docs/ref/#commands.transposeChars) + - Ctrl-v: [`cursorPageDown`](https://codemirror.net/6/docs/ref/#commands.cursorPageDown) + - Alt-v: [`cursorPageUp`](https://codemirror.net/6/docs/ref/#commands.cursorPageUp) +*/ +const emacsStyleKeymap = [ + { key: "Ctrl-b", run: cursorCharLeft, shift: selectCharLeft, preventDefault: true }, + { key: "Ctrl-f", run: cursorCharRight, shift: selectCharRight }, + { key: "Ctrl-p", run: cursorLineUp, shift: selectLineUp }, + { key: "Ctrl-n", run: cursorLineDown, shift: selectLineDown }, + { key: "Ctrl-a", run: cursorLineStart, shift: selectLineStart }, + { key: "Ctrl-e", run: cursorLineEnd, shift: selectLineEnd }, + { key: "Ctrl-d", run: deleteCharForward }, + { key: "Ctrl-h", run: deleteCharBackward }, + { key: "Ctrl-k", run: deleteToLineEnd }, + { key: "Ctrl-Alt-h", run: deleteGroupBackward }, + { key: "Ctrl-o", run: splitLine }, + { key: "Ctrl-t", run: transposeChars }, + { key: "Ctrl-v", run: cursorPageDown }, +]; +/** +An array of key bindings closely sticking to platform-standard or +widely used bindings. (This includes the bindings from +[`emacsStyleKeymap`](https://codemirror.net/6/docs/ref/#commands.emacsStyleKeymap), with their `key` +property changed to `mac`.) + + - ArrowLeft: [`cursorCharLeft`](https://codemirror.net/6/docs/ref/#commands.cursorCharLeft) ([`selectCharLeft`](https://codemirror.net/6/docs/ref/#commands.selectCharLeft) with Shift) + - ArrowRight: [`cursorCharRight`](https://codemirror.net/6/docs/ref/#commands.cursorCharRight) ([`selectCharRight`](https://codemirror.net/6/docs/ref/#commands.selectCharRight) with Shift) + - Ctrl-ArrowLeft (Alt-ArrowLeft on macOS): [`cursorGroupLeft`](https://codemirror.net/6/docs/ref/#commands.cursorGroupLeft) ([`selectGroupLeft`](https://codemirror.net/6/docs/ref/#commands.selectGroupLeft) with Shift) + - Ctrl-ArrowRight (Alt-ArrowRight on macOS): [`cursorGroupRight`](https://codemirror.net/6/docs/ref/#commands.cursorGroupRight) ([`selectGroupRight`](https://codemirror.net/6/docs/ref/#commands.selectGroupRight) with Shift) + - Cmd-ArrowLeft (on macOS): [`cursorLineStart`](https://codemirror.net/6/docs/ref/#commands.cursorLineStart) ([`selectLineStart`](https://codemirror.net/6/docs/ref/#commands.selectLineStart) with Shift) + - Cmd-ArrowRight (on macOS): [`cursorLineEnd`](https://codemirror.net/6/docs/ref/#commands.cursorLineEnd) ([`selectLineEnd`](https://codemirror.net/6/docs/ref/#commands.selectLineEnd) with Shift) + - ArrowUp: [`cursorLineUp`](https://codemirror.net/6/docs/ref/#commands.cursorLineUp) ([`selectLineUp`](https://codemirror.net/6/docs/ref/#commands.selectLineUp) with Shift) + - ArrowDown: [`cursorLineDown`](https://codemirror.net/6/docs/ref/#commands.cursorLineDown) ([`selectLineDown`](https://codemirror.net/6/docs/ref/#commands.selectLineDown) with Shift) + - Cmd-ArrowUp (on macOS): [`cursorDocStart`](https://codemirror.net/6/docs/ref/#commands.cursorDocStart) ([`selectDocStart`](https://codemirror.net/6/docs/ref/#commands.selectDocStart) with Shift) + - Cmd-ArrowDown (on macOS): [`cursorDocEnd`](https://codemirror.net/6/docs/ref/#commands.cursorDocEnd) ([`selectDocEnd`](https://codemirror.net/6/docs/ref/#commands.selectDocEnd) with Shift) + - Ctrl-ArrowUp (on macOS): [`cursorPageUp`](https://codemirror.net/6/docs/ref/#commands.cursorPageUp) ([`selectPageUp`](https://codemirror.net/6/docs/ref/#commands.selectPageUp) with Shift) + - Ctrl-ArrowDown (on macOS): [`cursorPageDown`](https://codemirror.net/6/docs/ref/#commands.cursorPageDown) ([`selectPageDown`](https://codemirror.net/6/docs/ref/#commands.selectPageDown) with Shift) + - PageUp: [`cursorPageUp`](https://codemirror.net/6/docs/ref/#commands.cursorPageUp) ([`selectPageUp`](https://codemirror.net/6/docs/ref/#commands.selectPageUp) with Shift) + - PageDown: [`cursorPageDown`](https://codemirror.net/6/docs/ref/#commands.cursorPageDown) ([`selectPageDown`](https://codemirror.net/6/docs/ref/#commands.selectPageDown) with Shift) + - Home: [`cursorLineBoundaryBackward`](https://codemirror.net/6/docs/ref/#commands.cursorLineBoundaryBackward) ([`selectLineBoundaryBackward`](https://codemirror.net/6/docs/ref/#commands.selectLineBoundaryBackward) with Shift) + - End: [`cursorLineBoundaryForward`](https://codemirror.net/6/docs/ref/#commands.cursorLineBoundaryForward) ([`selectLineBoundaryForward`](https://codemirror.net/6/docs/ref/#commands.selectLineBoundaryForward) with Shift) + - Ctrl-Home (Cmd-Home on macOS): [`cursorDocStart`](https://codemirror.net/6/docs/ref/#commands.cursorDocStart) ([`selectDocStart`](https://codemirror.net/6/docs/ref/#commands.selectDocStart) with Shift) + - Ctrl-End (Cmd-Home on macOS): [`cursorDocEnd`](https://codemirror.net/6/docs/ref/#commands.cursorDocEnd) ([`selectDocEnd`](https://codemirror.net/6/docs/ref/#commands.selectDocEnd) with Shift) + - Enter and Shift-Enter: [`insertNewlineAndIndent`](https://codemirror.net/6/docs/ref/#commands.insertNewlineAndIndent) + - Ctrl-a (Cmd-a on macOS): [`selectAll`](https://codemirror.net/6/docs/ref/#commands.selectAll) + - Backspace: [`deleteCharBackward`](https://codemirror.net/6/docs/ref/#commands.deleteCharBackward) + - Delete: [`deleteCharForward`](https://codemirror.net/6/docs/ref/#commands.deleteCharForward) + - Ctrl-Backspace (Alt-Backspace on macOS): [`deleteGroupBackward`](https://codemirror.net/6/docs/ref/#commands.deleteGroupBackward) + - Ctrl-Delete (Alt-Delete on macOS): [`deleteGroupForward`](https://codemirror.net/6/docs/ref/#commands.deleteGroupForward) + - Cmd-Backspace (macOS): [`deleteLineBoundaryBackward`](https://codemirror.net/6/docs/ref/#commands.deleteLineBoundaryBackward). + - Cmd-Delete (macOS): [`deleteLineBoundaryForward`](https://codemirror.net/6/docs/ref/#commands.deleteLineBoundaryForward). +*/ +const standardKeymap = /*@__PURE__*/[ + { key: "ArrowLeft", run: cursorCharLeft, shift: selectCharLeft, preventDefault: true }, + { key: "Mod-ArrowLeft", mac: "Alt-ArrowLeft", run: cursorGroupLeft, shift: selectGroupLeft, preventDefault: true }, + { mac: "Cmd-ArrowLeft", run: cursorLineBoundaryLeft, shift: selectLineBoundaryLeft, preventDefault: true }, + { key: "ArrowRight", run: cursorCharRight, shift: selectCharRight, preventDefault: true }, + { key: "Mod-ArrowRight", mac: "Alt-ArrowRight", run: cursorGroupRight, shift: selectGroupRight, preventDefault: true }, + { mac: "Cmd-ArrowRight", run: cursorLineBoundaryRight, shift: selectLineBoundaryRight, preventDefault: true }, + { key: "ArrowUp", run: cursorLineUp, shift: selectLineUp, preventDefault: true }, + { mac: "Cmd-ArrowUp", run: cursorDocStart, shift: selectDocStart }, + { mac: "Ctrl-ArrowUp", run: cursorPageUp, shift: selectPageUp }, + { key: "ArrowDown", run: cursorLineDown, shift: selectLineDown, preventDefault: true }, + { mac: "Cmd-ArrowDown", run: cursorDocEnd, shift: selectDocEnd }, + { mac: "Ctrl-ArrowDown", run: cursorPageDown, shift: selectPageDown }, + { key: "PageUp", run: cursorPageUp, shift: selectPageUp }, + { key: "PageDown", run: cursorPageDown, shift: selectPageDown }, + { key: "Home", run: cursorLineBoundaryBackward, shift: selectLineBoundaryBackward, preventDefault: true }, + { key: "Mod-Home", run: cursorDocStart, shift: selectDocStart }, + { key: "End", run: cursorLineBoundaryForward, shift: selectLineBoundaryForward, preventDefault: true }, + { key: "Mod-End", run: cursorDocEnd, shift: selectDocEnd }, + { key: "Enter", run: insertNewlineAndIndent, shift: insertNewlineAndIndent }, + { key: "Mod-a", run: selectAll }, + { key: "Backspace", run: deleteCharBackward, shift: deleteCharBackward }, + { key: "Delete", run: deleteCharForward }, + { key: "Mod-Backspace", mac: "Alt-Backspace", run: deleteGroupBackward }, + { key: "Mod-Delete", mac: "Alt-Delete", run: deleteGroupForward }, + { mac: "Mod-Backspace", run: deleteLineBoundaryBackward }, + { mac: "Mod-Delete", run: deleteLineBoundaryForward } +].concat(/*@__PURE__*/emacsStyleKeymap.map(b => ({ mac: b.key, run: b.run, shift: b.shift }))); +/** +The default keymap. Includes all bindings from +[`standardKeymap`](https://codemirror.net/6/docs/ref/#commands.standardKeymap) plus the following: + +- Alt-ArrowLeft (Ctrl-ArrowLeft on macOS): [`cursorSyntaxLeft`](https://codemirror.net/6/docs/ref/#commands.cursorSyntaxLeft) ([`selectSyntaxLeft`](https://codemirror.net/6/docs/ref/#commands.selectSyntaxLeft) with Shift) +- Alt-ArrowRight (Ctrl-ArrowRight on macOS): [`cursorSyntaxRight`](https://codemirror.net/6/docs/ref/#commands.cursorSyntaxRight) ([`selectSyntaxRight`](https://codemirror.net/6/docs/ref/#commands.selectSyntaxRight) with Shift) +- Alt-ArrowUp: [`moveLineUp`](https://codemirror.net/6/docs/ref/#commands.moveLineUp) +- Alt-ArrowDown: [`moveLineDown`](https://codemirror.net/6/docs/ref/#commands.moveLineDown) +- Shift-Alt-ArrowUp: [`copyLineUp`](https://codemirror.net/6/docs/ref/#commands.copyLineUp) +- Shift-Alt-ArrowDown: [`copyLineDown`](https://codemirror.net/6/docs/ref/#commands.copyLineDown) +- Escape: [`simplifySelection`](https://codemirror.net/6/docs/ref/#commands.simplifySelection) +- Ctrl-Enter (Cmd-Enter on macOS): [`insertBlankLine`](https://codemirror.net/6/docs/ref/#commands.insertBlankLine) +- Alt-l (Ctrl-l on macOS): [`selectLine`](https://codemirror.net/6/docs/ref/#commands.selectLine) +- Ctrl-i (Cmd-i on macOS): [`selectParentSyntax`](https://codemirror.net/6/docs/ref/#commands.selectParentSyntax) +- Ctrl-[ (Cmd-[ on macOS): [`indentLess`](https://codemirror.net/6/docs/ref/#commands.indentLess) +- Ctrl-] (Cmd-] on macOS): [`indentMore`](https://codemirror.net/6/docs/ref/#commands.indentMore) +- Ctrl-Alt-\\ (Cmd-Alt-\\ on macOS): [`indentSelection`](https://codemirror.net/6/docs/ref/#commands.indentSelection) +- Shift-Ctrl-k (Shift-Cmd-k on macOS): [`deleteLine`](https://codemirror.net/6/docs/ref/#commands.deleteLine) +- Shift-Ctrl-\\ (Shift-Cmd-\\ on macOS): [`cursorMatchingBracket`](https://codemirror.net/6/docs/ref/#commands.cursorMatchingBracket) +- Ctrl-/ (Cmd-/ on macOS): [`toggleComment`](https://codemirror.net/6/docs/ref/#commands.toggleComment). +- Shift-Alt-a: [`toggleBlockComment`](https://codemirror.net/6/docs/ref/#commands.toggleBlockComment). +- Ctrl-m (Alt-Shift-m on macOS): [`toggleTabFocusMode`](https://codemirror.net/6/docs/ref/#commands.toggleTabFocusMode). +*/ +const defaultKeymap = /*@__PURE__*/[ + { key: "Alt-ArrowLeft", mac: "Ctrl-ArrowLeft", run: cursorSyntaxLeft, shift: selectSyntaxLeft }, + { key: "Alt-ArrowRight", mac: "Ctrl-ArrowRight", run: cursorSyntaxRight, shift: selectSyntaxRight }, + { key: "Alt-ArrowUp", run: moveLineUp }, + { key: "Shift-Alt-ArrowUp", run: copyLineUp }, + { key: "Alt-ArrowDown", run: moveLineDown }, + { key: "Shift-Alt-ArrowDown", run: copyLineDown }, + { key: "Escape", run: simplifySelection }, + { key: "Mod-Enter", run: insertBlankLine }, + { key: "Alt-l", mac: "Ctrl-l", run: selectLine }, + { key: "Mod-i", run: selectParentSyntax, preventDefault: true }, + { key: "Mod-[", run: indentLess }, + { key: "Mod-]", run: indentMore }, + { key: "Mod-Alt-\\", run: indentSelection }, + { key: "Shift-Mod-k", run: deleteLine }, + { key: "Shift-Mod-\\", run: cursorMatchingBracket }, + { key: "Mod-/", run: toggleComment }, + { key: "Alt-A", run: toggleBlockComment }, + { key: "Ctrl-m", mac: "Shift-Alt-m", run: toggleTabFocusMode }, +].concat(standardKeymap); +/** +A binding that binds Tab to [`indentMore`](https://codemirror.net/6/docs/ref/#commands.indentMore) and +Shift-Tab to [`indentLess`](https://codemirror.net/6/docs/ref/#commands.indentLess). +Please see the [Tab example](../../examples/tab/) before using +this. +*/ +const indentWithTab = { key: "Tab", run: indentMore, shift: indentLess }; + + + + +/***/ }), + +/***/ "./node_modules/@codemirror/lang-css/dist/index.js": +/*!*********************************************************!*\ + !*** ./node_modules/@codemirror/lang-css/dist/index.js ***! + \*********************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ css: () => (/* binding */ css), +/* harmony export */ cssCompletionSource: () => (/* binding */ cssCompletionSource), +/* harmony export */ cssLanguage: () => (/* binding */ cssLanguage), +/* harmony export */ defineCSSCompletionSource: () => (/* binding */ defineCSSCompletionSource) +/* harmony export */ }); +/* harmony import */ var _lezer_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lezer/css */ "./node_modules/@lezer/css/dist/index.js"); +/* harmony import */ var _codemirror_language__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @codemirror/language */ "./node_modules/@codemirror/language/dist/index.js"); +/* harmony import */ var _lezer_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lezer/common */ "./node_modules/@lezer/common/dist/index.js"); + + + + +let _properties = null; +function properties() { + if (!_properties && typeof document == "object" && document.body) { + let { style } = document.body, names = [], seen = new Set; + for (let prop in style) + if (prop != "cssText" && prop != "cssFloat") { + if (typeof style[prop] == "string") { + if (/[A-Z]/.test(prop)) + prop = prop.replace(/[A-Z]/g, ch => "-" + ch.toLowerCase()); + if (!seen.has(prop)) { + names.push(prop); + seen.add(prop); + } + } + } + _properties = names.sort().map(name => ({ type: "property", label: name, apply: name + ": " })); + } + return _properties || []; +} +const pseudoClasses = /*@__PURE__*/[ + "active", "after", "any-link", "autofill", "backdrop", "before", + "checked", "cue", "default", "defined", "disabled", "empty", + "enabled", "file-selector-button", "first", "first-child", + "first-letter", "first-line", "first-of-type", "focus", + "focus-visible", "focus-within", "fullscreen", "has", "host", + "host-context", "hover", "in-range", "indeterminate", "invalid", + "is", "lang", "last-child", "last-of-type", "left", "link", "marker", + "modal", "not", "nth-child", "nth-last-child", "nth-last-of-type", + "nth-of-type", "only-child", "only-of-type", "optional", "out-of-range", + "part", "placeholder", "placeholder-shown", "read-only", "read-write", + "required", "right", "root", "scope", "selection", "slotted", "target", + "target-text", "valid", "visited", "where" +].map(name => ({ type: "class", label: name })); +const values = /*@__PURE__*/[ + "above", "absolute", "activeborder", "additive", "activecaption", "after-white-space", + "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", "always", + "antialiased", "appworkspace", "asterisks", "attr", "auto", "auto-flow", "avoid", "avoid-column", + "avoid-page", "avoid-region", "axis-pan", "background", "backwards", "baseline", "below", + "bidi-override", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", + "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", + "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "capitalize", + "caps-lock-indicator", "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", + "cjk-decimal", "clear", "clip", "close-quote", "col-resize", "collapse", "color", "color-burn", + "color-dodge", "column", "column-reverse", "compact", "condensed", "contain", "content", + "contents", "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", + "crop", "cross", "crosshair", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal", + "decimal-leading-zero", "default", "default-button", "dense", "destination-atop", "destination-in", + "destination-out", "destination-over", "difference", "disc", "discard", "disclosure-closed", + "disclosure-open", "document", "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", + "ease", "ease-in", "ease-in-out", "ease-out", "element", "ellipse", "ellipsis", "embed", "end", + "ethiopic-abegede-gez", "ethiopic-halehame-aa-er", "ethiopic-halehame-gez", "ew-resize", "exclusion", + "expanded", "extends", "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fill-box", + "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", "forwards", "from", + "geometricPrecision", "graytext", "grid", "groove", "hand", "hard-light", "help", "hidden", "hide", + "higher", "highlight", "highlighttext", "horizontal", "hsl", "hsla", "hue", "icon", "ignore", + "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", + "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-flex", "inline-grid", + "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "justify", "keep-all", + "landscape", "large", "larger", "left", "level", "lighter", "lighten", "line-through", "linear", + "linear-gradient", "lines", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", + "lower-hexadecimal", "lower-latin", "lower-norwegian", "lowercase", "ltr", "luminosity", "manipulation", + "match", "matrix", "matrix3d", "medium", "menu", "menutext", "message-box", "middle", "min-intrinsic", + "mix", "monospace", "move", "multiple", "multiple_mask_images", "multiply", "n-resize", "narrower", + "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none", + "normal", "not-allowed", "nowrap", "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", + "oblique", "opacity", "open-quote", "optimizeLegibility", "optimizeSpeed", "outset", "outside", + "outside-shape", "overlay", "overline", "padding", "padding-box", "painted", "page", "paused", + "perspective", "pinch-zoom", "plus-darker", "plus-lighter", "pointer", "polygon", "portrait", + "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", "radial-gradient", "radio", + "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region", "relative", "repeat", + "repeating-linear-gradient", "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", + "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", "rotateZ", "round", + "row", "row-resize", "row-reverse", "rtl", "run-in", "running", "s-resize", "sans-serif", "saturation", + "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen", "scroll", "scrollbar", "scroll-position", + "se-resize", "self-start", "self-end", "semi-condensed", "semi-expanded", "separate", "serif", "show", + "single", "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", + "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", "small", "small-caps", + "small-caption", "smaller", "soft-light", "solid", "source-atop", "source-in", "source-out", + "source-over", "space", "space-around", "space-between", "space-evenly", "spell-out", "square", "start", + "static", "status-bar", "stretch", "stroke", "stroke-box", "sub", "subpixel-antialiased", "svg_masks", + "super", "sw-resize", "symbolic", "symbols", "system-ui", "table", "table-caption", "table-cell", + "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", + "table-row-group", "text", "text-bottom", "text-top", "textarea", "textfield", "thick", "thin", + "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "to", "top", + "transform", "translate", "translate3d", "translateX", "translateY", "translateZ", "transparent", + "ultra-condensed", "ultra-expanded", "underline", "unidirectional-pan", "unset", "up", "upper-latin", + "uppercase", "url", "var", "vertical", "vertical-text", "view-box", "visible", "visibleFill", + "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", "window", "windowframe", + "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", "xx-large", "xx-small" +].map(name => ({ type: "keyword", label: name })).concat(/*@__PURE__*/[ + "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", + "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", + "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", + "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", + "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", + "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", + "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", + "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", + "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", + "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", + "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", + "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", + "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", + "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", + "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", + "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", + "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", + "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", + "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", + "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", + "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", + "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", + "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", + "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", + "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", + "whitesmoke", "yellow", "yellowgreen" +].map(name => ({ type: "constant", label: name }))); +const tags = /*@__PURE__*/[ + "a", "abbr", "address", "article", "aside", "b", "bdi", "bdo", "blockquote", "body", + "br", "button", "canvas", "caption", "cite", "code", "col", "colgroup", "dd", "del", + "details", "dfn", "dialog", "div", "dl", "dt", "em", "figcaption", "figure", "footer", + "form", "header", "hgroup", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "html", "i", "iframe", + "img", "input", "ins", "kbd", "label", "legend", "li", "main", "meter", "nav", "ol", "output", + "p", "pre", "ruby", "section", "select", "small", "source", "span", "strong", "sub", "summary", + "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "tr", "u", "ul" +].map(name => ({ type: "type", label: name })); +const atRules = /*@__PURE__*/[ + "@charset", "@color-profile", "@container", "@counter-style", "@font-face", "@font-feature-values", + "@font-palette-values", "@import", "@keyframes", "@layer", "@media", "@namespace", "@page", + "@position-try", "@property", "@scope", "@starting-style", "@supports", "@view-transition" +].map(label => ({ type: "keyword", label })); +const identifier = /^(\w[\w-]*|-\w[\w-]*|)$/, variable = /^-(-[\w-]*)?$/; +function isVarArg(node, doc) { + var _a; + if (node.name == "(" || node.type.isError) + node = node.parent || node; + if (node.name != "ArgList") + return false; + let callee = (_a = node.parent) === null || _a === void 0 ? void 0 : _a.firstChild; + if ((callee === null || callee === void 0 ? void 0 : callee.name) != "Callee") + return false; + return doc.sliceString(callee.from, callee.to) == "var"; +} +const VariablesByNode = /*@__PURE__*/new _lezer_common__WEBPACK_IMPORTED_MODULE_1__.NodeWeakMap(); +const declSelector = ["Declaration"]; +function astTop(node) { + for (let cur = node;;) { + if (cur.type.isTop) + return cur; + if (!(cur = cur.parent)) + return node; + } +} +function variableNames(doc, node, isVariable) { + if (node.to - node.from > 4096) { + let known = VariablesByNode.get(node); + if (known) + return known; + let result = [], seen = new Set, cursor = node.cursor(_lezer_common__WEBPACK_IMPORTED_MODULE_1__.IterMode.IncludeAnonymous); + if (cursor.firstChild()) + do { + for (let option of variableNames(doc, cursor.node, isVariable)) + if (!seen.has(option.label)) { + seen.add(option.label); + result.push(option); + } + } while (cursor.nextSibling()); + VariablesByNode.set(node, result); + return result; + } + else { + let result = [], seen = new Set; + node.cursor().iterate(node => { + var _a; + if (isVariable(node) && node.matchContext(declSelector) && ((_a = node.node.nextSibling) === null || _a === void 0 ? void 0 : _a.name) == ":") { + let name = doc.sliceString(node.from, node.to); + if (!seen.has(name)) { + seen.add(name); + result.push({ label: name, type: "variable" }); + } + } + }); + return result; + } +} +/** +Create a completion source for a CSS dialect, providing a +predicate for determining what kind of syntax node can act as a +completable variable. This is used by language modes like Sass and +Less to reuse this package's completion logic. +*/ +const defineCSSCompletionSource = (isVariable) => context => { + let { state, pos } = context, node = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_2__.syntaxTree)(state).resolveInner(pos, -1); + let isDash = node.type.isError && node.from == node.to - 1 && state.doc.sliceString(node.from, node.to) == "-"; + if (node.name == "PropertyName" || + (isDash || node.name == "TagName") && /^(Block|Styles)$/.test(node.resolve(node.to).name)) + return { from: node.from, options: properties(), validFor: identifier }; + if (node.name == "ValueName") + return { from: node.from, options: values, validFor: identifier }; + if (node.name == "PseudoClassName") + return { from: node.from, options: pseudoClasses, validFor: identifier }; + if (isVariable(node) || (context.explicit || isDash) && isVarArg(node, state.doc)) + return { from: isVariable(node) || isDash ? node.from : pos, + options: variableNames(state.doc, astTop(node), isVariable), + validFor: variable }; + if (node.name == "TagName") { + for (let { parent } = node; parent; parent = parent.parent) + if (parent.name == "Block") + return { from: node.from, options: properties(), validFor: identifier }; + return { from: node.from, options: tags, validFor: identifier }; + } + if (node.name == "AtKeyword") + return { from: node.from, options: atRules, validFor: identifier }; + if (!context.explicit) + return null; + let above = node.resolve(pos), before = above.childBefore(pos); + if (before && before.name == ":" && above.name == "PseudoClassSelector") + return { from: pos, options: pseudoClasses, validFor: identifier }; + if (before && before.name == ":" && above.name == "Declaration" || above.name == "ArgList") + return { from: pos, options: values, validFor: identifier }; + if (above.name == "Block" || above.name == "Styles") + return { from: pos, options: properties(), validFor: identifier }; + return null; +}; +/** +CSS property, variable, and value keyword completion source. +*/ +const cssCompletionSource = /*@__PURE__*/defineCSSCompletionSource(n => n.name == "VariableName"); + +/** +A language provider based on the [Lezer CSS +parser](https://github.com/lezer-parser/css), extended with +highlighting and indentation information. +*/ +const cssLanguage = /*@__PURE__*/_codemirror_language__WEBPACK_IMPORTED_MODULE_2__.LRLanguage.define({ + name: "css", + parser: /*@__PURE__*/_lezer_css__WEBPACK_IMPORTED_MODULE_0__.parser.configure({ + props: [ + /*@__PURE__*/_codemirror_language__WEBPACK_IMPORTED_MODULE_2__.indentNodeProp.add({ + Declaration: /*@__PURE__*/(0,_codemirror_language__WEBPACK_IMPORTED_MODULE_2__.continuedIndent)() + }), + /*@__PURE__*/_codemirror_language__WEBPACK_IMPORTED_MODULE_2__.foldNodeProp.add({ + "Block KeyframeList": _codemirror_language__WEBPACK_IMPORTED_MODULE_2__.foldInside + }) + ] + }), + languageData: { + commentTokens: { block: { open: "/*", close: "*/" } }, + indentOnInput: /^\s*\}$/, + wordChars: "-" + } +}); +/** +Language support for CSS. +*/ +function css() { + return new _codemirror_language__WEBPACK_IMPORTED_MODULE_2__.LanguageSupport(cssLanguage, cssLanguage.data.of({ autocomplete: cssCompletionSource })); +} + + + + +/***/ }), + +/***/ "./node_modules/@codemirror/lang-html/dist/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@codemirror/lang-html/dist/index.js ***! + \**********************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ autoCloseTags: () => (/* binding */ autoCloseTags), +/* harmony export */ html: () => (/* binding */ html), +/* harmony export */ htmlCompletionSource: () => (/* binding */ htmlCompletionSource), +/* harmony export */ htmlCompletionSourceWith: () => (/* binding */ htmlCompletionSourceWith), +/* harmony export */ htmlLanguage: () => (/* binding */ htmlLanguage), +/* harmony export */ htmlPlain: () => (/* binding */ htmlPlain) +/* harmony export */ }); +/* harmony import */ var _lezer_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lezer/html */ "./node_modules/@lezer/html/dist/index.js"); +/* harmony import */ var _codemirror_lang_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @codemirror/lang-css */ "./node_modules/@codemirror/lang-css/dist/index.js"); +/* harmony import */ var _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @codemirror/lang-javascript */ "./node_modules/@codemirror/lang-javascript/dist/index.js"); +/* harmony import */ var _codemirror_view__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @codemirror/view */ "./node_modules/@codemirror/view/dist/index.js"); +/* harmony import */ var _codemirror_state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @codemirror/state */ "./node_modules/@codemirror/state/dist/index.js"); +/* harmony import */ var _codemirror_language__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @codemirror/language */ "./node_modules/@codemirror/language/dist/index.js"); + + + + + + + +const Targets = ["_blank", "_self", "_top", "_parent"]; +const Charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"]; +const Methods = ["get", "post", "put", "delete"]; +const Encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"]; +const Bool = ["true", "false"]; +const S = {}; // Empty tag spec +const Tags = { + a: { + attrs: { + href: null, ping: null, type: null, + media: null, + target: Targets, + hreflang: null + } + }, + abbr: S, + address: S, + area: { + attrs: { + alt: null, coords: null, href: null, target: null, ping: null, + media: null, hreflang: null, type: null, + shape: ["default", "rect", "circle", "poly"] + } + }, + article: S, + aside: S, + audio: { + attrs: { + src: null, mediagroup: null, + crossorigin: ["anonymous", "use-credentials"], + preload: ["none", "metadata", "auto"], + autoplay: ["autoplay"], + loop: ["loop"], + controls: ["controls"] + } + }, + b: S, + base: { attrs: { href: null, target: Targets } }, + bdi: S, + bdo: S, + blockquote: { attrs: { cite: null } }, + body: S, + br: S, + button: { + attrs: { + form: null, formaction: null, name: null, value: null, + autofocus: ["autofocus"], + disabled: ["autofocus"], + formenctype: Encs, + formmethod: Methods, + formnovalidate: ["novalidate"], + formtarget: Targets, + type: ["submit", "reset", "button"] + } + }, + canvas: { attrs: { width: null, height: null } }, + caption: S, + center: S, + cite: S, + code: S, + col: { attrs: { span: null } }, + colgroup: { attrs: { span: null } }, + command: { + attrs: { + type: ["command", "checkbox", "radio"], + label: null, icon: null, radiogroup: null, command: null, title: null, + disabled: ["disabled"], + checked: ["checked"] + } + }, + data: { attrs: { value: null } }, + datagrid: { attrs: { disabled: ["disabled"], multiple: ["multiple"] } }, + datalist: { attrs: { data: null } }, + dd: S, + del: { attrs: { cite: null, datetime: null } }, + details: { attrs: { open: ["open"] } }, + dfn: S, + div: S, + dl: S, + dt: S, + em: S, + embed: { attrs: { src: null, type: null, width: null, height: null } }, + eventsource: { attrs: { src: null } }, + fieldset: { attrs: { disabled: ["disabled"], form: null, name: null } }, + figcaption: S, + figure: S, + footer: S, + form: { + attrs: { + action: null, name: null, + "accept-charset": Charsets, + autocomplete: ["on", "off"], + enctype: Encs, + method: Methods, + novalidate: ["novalidate"], + target: Targets + } + }, + h1: S, h2: S, h3: S, h4: S, h5: S, h6: S, + head: { + children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"] + }, + header: S, + hgroup: S, + hr: S, + html: { + attrs: { manifest: null } + }, + i: S, + iframe: { + attrs: { + src: null, srcdoc: null, name: null, width: null, height: null, + sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"], + seamless: ["seamless"] + } + }, + img: { + attrs: { + alt: null, src: null, ismap: null, usemap: null, width: null, height: null, + crossorigin: ["anonymous", "use-credentials"] + } + }, + input: { + attrs: { + alt: null, dirname: null, form: null, formaction: null, + height: null, list: null, max: null, maxlength: null, min: null, + name: null, pattern: null, placeholder: null, size: null, src: null, + step: null, value: null, width: null, + accept: ["audio/*", "video/*", "image/*"], + autocomplete: ["on", "off"], + autofocus: ["autofocus"], + checked: ["checked"], + disabled: ["disabled"], + formenctype: Encs, + formmethod: Methods, + formnovalidate: ["novalidate"], + formtarget: Targets, + multiple: ["multiple"], + readonly: ["readonly"], + required: ["required"], + type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month", + "week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio", + "file", "submit", "image", "reset", "button"] + } + }, + ins: { attrs: { cite: null, datetime: null } }, + kbd: S, + keygen: { + attrs: { + challenge: null, form: null, name: null, + autofocus: ["autofocus"], + disabled: ["disabled"], + keytype: ["RSA"] + } + }, + label: { attrs: { for: null, form: null } }, + legend: S, + li: { attrs: { value: null } }, + link: { + attrs: { + href: null, type: null, + hreflang: null, + media: null, + sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"] + } + }, + map: { attrs: { name: null } }, + mark: S, + menu: { attrs: { label: null, type: ["list", "context", "toolbar"] } }, + meta: { + attrs: { + content: null, + charset: Charsets, + name: ["viewport", "application-name", "author", "description", "generator", "keywords"], + "http-equiv": ["content-language", "content-type", "default-style", "refresh"] + } + }, + meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } }, + nav: S, + noscript: S, + object: { + attrs: { + data: null, type: null, name: null, usemap: null, form: null, width: null, height: null, + typemustmatch: ["typemustmatch"] + } + }, + ol: { attrs: { reversed: ["reversed"], start: null, type: ["1", "a", "A", "i", "I"] }, + children: ["li", "script", "template", "ul", "ol"] }, + optgroup: { attrs: { disabled: ["disabled"], label: null } }, + option: { attrs: { disabled: ["disabled"], label: null, selected: ["selected"], value: null } }, + output: { attrs: { for: null, form: null, name: null } }, + p: S, + param: { attrs: { name: null, value: null } }, + pre: S, + progress: { attrs: { value: null, max: null } }, + q: { attrs: { cite: null } }, + rp: S, + rt: S, + ruby: S, + samp: S, + script: { + attrs: { + type: ["text/javascript"], + src: null, + async: ["async"], + defer: ["defer"], + charset: Charsets + } + }, + section: S, + select: { + attrs: { + form: null, name: null, size: null, + autofocus: ["autofocus"], + disabled: ["disabled"], + multiple: ["multiple"] + } + }, + slot: { attrs: { name: null } }, + small: S, + source: { attrs: { src: null, type: null, media: null } }, + span: S, + strong: S, + style: { + attrs: { + type: ["text/css"], + media: null, + scoped: null + } + }, + sub: S, + summary: S, + sup: S, + table: S, + tbody: S, + td: { attrs: { colspan: null, rowspan: null, headers: null } }, + template: S, + textarea: { + attrs: { + dirname: null, form: null, maxlength: null, name: null, placeholder: null, + rows: null, cols: null, + autofocus: ["autofocus"], + disabled: ["disabled"], + readonly: ["readonly"], + required: ["required"], + wrap: ["soft", "hard"] + } + }, + tfoot: S, + th: { attrs: { colspan: null, rowspan: null, headers: null, scope: ["row", "col", "rowgroup", "colgroup"] } }, + thead: S, + time: { attrs: { datetime: null } }, + title: S, + tr: S, + track: { + attrs: { + src: null, label: null, default: null, + kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"], + srclang: null + } + }, + ul: { children: ["li", "script", "template", "ul", "ol"] }, + var: S, + video: { + attrs: { + src: null, poster: null, width: null, height: null, + crossorigin: ["anonymous", "use-credentials"], + preload: ["auto", "metadata", "none"], + autoplay: ["autoplay"], + mediagroup: ["movie"], + muted: ["muted"], + controls: ["controls"] + } + }, + wbr: S +}; +const GlobalAttrs = { + accesskey: null, + class: null, + contenteditable: Bool, + contextmenu: null, + dir: ["ltr", "rtl", "auto"], + draggable: ["true", "false", "auto"], + dropzone: ["copy", "move", "link", "string:", "file:"], + hidden: ["hidden"], + id: null, + inert: ["inert"], + itemid: null, + itemprop: null, + itemref: null, + itemscope: ["itemscope"], + itemtype: null, + lang: ["ar", "bn", "de", "en-GB", "en-US", "es", "fr", "hi", "id", "ja", "pa", "pt", "ru", "tr", "zh"], + spellcheck: Bool, + autocorrect: Bool, + autocapitalize: Bool, + style: null, + tabindex: null, + title: null, + translate: ["yes", "no"], + rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"], + role: /*@__PURE__*/"alert application article banner button cell checkbox complementary contentinfo dialog document feed figure form grid gridcell heading img list listbox listitem main navigation region row rowgroup search switch tab table tabpanel textbox timer".split(" "), + "aria-activedescendant": null, + "aria-atomic": Bool, + "aria-autocomplete": ["inline", "list", "both", "none"], + "aria-busy": Bool, + "aria-checked": ["true", "false", "mixed", "undefined"], + "aria-controls": null, + "aria-describedby": null, + "aria-disabled": Bool, + "aria-dropeffect": null, + "aria-expanded": ["true", "false", "undefined"], + "aria-flowto": null, + "aria-grabbed": ["true", "false", "undefined"], + "aria-haspopup": Bool, + "aria-hidden": Bool, + "aria-invalid": ["true", "false", "grammar", "spelling"], + "aria-label": null, + "aria-labelledby": null, + "aria-level": null, + "aria-live": ["off", "polite", "assertive"], + "aria-multiline": Bool, + "aria-multiselectable": Bool, + "aria-owns": null, + "aria-posinset": null, + "aria-pressed": ["true", "false", "mixed", "undefined"], + "aria-readonly": Bool, + "aria-relevant": null, + "aria-required": Bool, + "aria-selected": ["true", "false", "undefined"], + "aria-setsize": null, + "aria-sort": ["ascending", "descending", "none", "other"], + "aria-valuemax": null, + "aria-valuemin": null, + "aria-valuenow": null, + "aria-valuetext": null +}; +const eventAttributes = /*@__PURE__*/("beforeunload copy cut dragstart dragover dragleave dragenter dragend " + + "drag paste focus blur change click load mousedown mouseenter mouseleave " + + "mouseup keydown keyup resize scroll unload").split(" ").map(n => "on" + n); +for (let a of eventAttributes) + GlobalAttrs[a] = null; +class Schema { + constructor(extraTags, extraAttrs) { + this.tags = Object.assign(Object.assign({}, Tags), extraTags); + this.globalAttrs = Object.assign(Object.assign({}, GlobalAttrs), extraAttrs); + this.allTags = Object.keys(this.tags); + this.globalAttrNames = Object.keys(this.globalAttrs); + } +} +Schema.default = /*@__PURE__*/new Schema; +function elementName(doc, tree, max = doc.length) { + if (!tree) + return ""; + let tag = tree.firstChild; + let name = tag && tag.getChild("TagName"); + return name ? doc.sliceString(name.from, Math.min(name.to, max)) : ""; +} +function findParentElement(tree, skip = false) { + for (; tree; tree = tree.parent) + if (tree.name == "Element") { + if (skip) + skip = false; + else + return tree; + } + return null; +} +function allowedChildren(doc, tree, schema) { + let parentInfo = schema.tags[elementName(doc, findParentElement(tree))]; + return (parentInfo === null || parentInfo === void 0 ? void 0 : parentInfo.children) || schema.allTags; +} +function openTags(doc, tree) { + let open = []; + for (let parent = findParentElement(tree); parent && !parent.type.isTop; parent = findParentElement(parent.parent)) { + let tagName = elementName(doc, parent); + if (tagName && parent.lastChild.name == "CloseTag") + break; + if (tagName && open.indexOf(tagName) < 0 && (tree.name == "EndTag" || tree.from >= parent.firstChild.to)) + open.push(tagName); + } + return open; +} +const identifier = /^[:\-\.\w\u00b7-\uffff]*$/; +function completeTag(state, schema, tree, from, to) { + let end = /\s*>/.test(state.sliceDoc(to, to + 5)) ? "" : ">"; + let parent = findParentElement(tree, true); + return { from, to, + options: allowedChildren(state.doc, parent, schema).map(tagName => ({ label: tagName, type: "type" })).concat(openTags(state.doc, tree).map((tag, i) => ({ label: "/" + tag, apply: "/" + tag + end, + type: "type", boost: 99 - i }))), + validFor: /^\/?[:\-\.\w\u00b7-\uffff]*$/ }; +} +function completeCloseTag(state, tree, from, to) { + let end = /\s*>/.test(state.sliceDoc(to, to + 5)) ? "" : ">"; + return { from, to, + options: openTags(state.doc, tree).map((tag, i) => ({ label: tag, apply: tag + end, type: "type", boost: 99 - i })), + validFor: identifier }; +} +function completeStartTag(state, schema, tree, pos) { + let options = [], level = 0; + for (let tagName of allowedChildren(state.doc, tree, schema)) + options.push({ label: "<" + tagName, type: "type" }); + for (let open of openTags(state.doc, tree)) + options.push({ label: "", type: "type", boost: 99 - level++ }); + return { from: pos, to: pos, options, validFor: /^<\/?[:\-\.\w\u00b7-\uffff]*$/ }; +} +function completeAttrName(state, schema, tree, from, to) { + let elt = findParentElement(tree), info = elt ? schema.tags[elementName(state.doc, elt)] : null; + let localAttrs = info && info.attrs ? Object.keys(info.attrs) : []; + let names = info && info.globalAttrs === false ? localAttrs + : localAttrs.length ? localAttrs.concat(schema.globalAttrNames) : schema.globalAttrNames; + return { from, to, + options: names.map(attrName => ({ label: attrName, type: "property" })), + validFor: identifier }; +} +function completeAttrValue(state, schema, tree, from, to) { + var _a; + let nameNode = (_a = tree.parent) === null || _a === void 0 ? void 0 : _a.getChild("AttributeName"); + let options = [], token = undefined; + if (nameNode) { + let attrName = state.sliceDoc(nameNode.from, nameNode.to); + let attrs = schema.globalAttrs[attrName]; + if (!attrs) { + let elt = findParentElement(tree), info = elt ? schema.tags[elementName(state.doc, elt)] : null; + attrs = (info === null || info === void 0 ? void 0 : info.attrs) && info.attrs[attrName]; + } + if (attrs) { + let base = state.sliceDoc(from, to).toLowerCase(), quoteStart = '"', quoteEnd = '"'; + if (/^['"]/.test(base)) { + token = base[0] == '"' ? /^[^"]*$/ : /^[^']*$/; + quoteStart = ""; + quoteEnd = state.sliceDoc(to, to + 1) == base[0] ? "" : base[0]; + base = base.slice(1); + from++; + } + else { + token = /^[^\s<>='"]*$/; + } + for (let value of attrs) + options.push({ label: value, apply: quoteStart + value + quoteEnd, type: "constant" }); + } + } + return { from, to, options, validFor: token }; +} +function htmlCompletionFor(schema, context) { + let { state, pos } = context, tree = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_1__.syntaxTree)(state).resolveInner(pos, -1), around = tree.resolve(pos); + for (let scan = pos, before; around == tree && (before = tree.childBefore(scan));) { + let last = before.lastChild; + if (!last || !last.type.isError || last.from < last.to) + break; + around = tree = before; + scan = last.from; + } + if (tree.name == "TagName") { + return tree.parent && /CloseTag$/.test(tree.parent.name) ? completeCloseTag(state, tree, tree.from, pos) + : completeTag(state, schema, tree, tree.from, pos); + } + else if (tree.name == "StartTag") { + return completeTag(state, schema, tree, pos, pos); + } + else if (tree.name == "StartCloseTag" || tree.name == "IncompleteCloseTag") { + return completeCloseTag(state, tree, pos, pos); + } + else if (tree.name == "OpenTag" || tree.name == "SelfClosingTag" || tree.name == "AttributeName") { + return completeAttrName(state, schema, tree, tree.name == "AttributeName" ? tree.from : pos, pos); + } + else if (tree.name == "Is" || tree.name == "AttributeValue" || tree.name == "UnquotedAttributeValue") { + return completeAttrValue(state, schema, tree, tree.name == "Is" ? pos : tree.from, pos); + } + else if (context.explicit && (around.name == "Element" || around.name == "Text" || around.name == "Document")) { + return completeStartTag(state, schema, tree, pos); + } + else { + return null; + } +} +/** +HTML tag completion. Opens and closes tags and attributes in a +context-aware way. +*/ +function htmlCompletionSource(context) { + return htmlCompletionFor(Schema.default, context); +} +/** +Create a completion source for HTML extended with additional tags +or attributes. +*/ +function htmlCompletionSourceWith(config) { + let { extraTags, extraGlobalAttributes: extraAttrs } = config; + let schema = extraAttrs || extraTags ? new Schema(extraTags, extraAttrs) : Schema.default; + return (context) => htmlCompletionFor(schema, context); +} + +const jsonParser = /*@__PURE__*/_codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.javascriptLanguage.parser.configure({ top: "SingleExpression" }); +const defaultNesting = [ + { tag: "script", + attrs: attrs => attrs.type == "text/typescript" || attrs.lang == "ts", + parser: _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.typescriptLanguage.parser }, + { tag: "script", + attrs: attrs => attrs.type == "text/babel" || attrs.type == "text/jsx", + parser: _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.jsxLanguage.parser }, + { tag: "script", + attrs: attrs => attrs.type == "text/typescript-jsx", + parser: _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.tsxLanguage.parser }, + { tag: "script", + attrs(attrs) { + return /^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(attrs.type); + }, + parser: jsonParser }, + { tag: "script", + attrs(attrs) { + return !attrs.type || /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(attrs.type); + }, + parser: _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.javascriptLanguage.parser }, + { tag: "style", + attrs(attrs) { + return (!attrs.lang || attrs.lang == "css") && (!attrs.type || /^(text\/)?(x-)?(stylesheet|css)$/i.test(attrs.type)); + }, + parser: _codemirror_lang_css__WEBPACK_IMPORTED_MODULE_3__.cssLanguage.parser } +]; +const defaultAttrs = /*@__PURE__*/[ + { name: "style", + parser: /*@__PURE__*/_codemirror_lang_css__WEBPACK_IMPORTED_MODULE_3__.cssLanguage.parser.configure({ top: "Styles" }) } +].concat(/*@__PURE__*/eventAttributes.map(name => ({ name, parser: _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.javascriptLanguage.parser }))); +/** +A language provider based on the [Lezer HTML +parser](https://github.com/lezer-parser/html), extended with the +JavaScript and CSS parsers to parse the content of ` - - - + + + + + + +
@@ -298,390 +67,5 @@

Error

There was an error processing your EPUB file.

- - - - + \ No newline at end of file diff --git a/manifest.json b/manifest.json deleted file mode 100644 index 96a10a6..0000000 --- a/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "HTMLReader", - "short_name": "HTMLReader", - "start_url": "/HTMLReader/", - "display": "standalone", - "background_color": "#f5f5f5", - "theme_color": "#2196F3", - "icons": [ - { - "src": "/HTMLReader/favicon.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/HTMLReader/favicon.png", - "sizes": "512x512", - "type": "image/png" - } - ] -} diff --git a/service-worker.js b/service-worker.js deleted file mode 100644 index f6cf42e..0000000 --- a/service-worker.js +++ /dev/null @@ -1,18 +0,0 @@ -self.addEventListener("install", (event) => { - event.waitUntil( - caches.open("v1").then((cache) => { - return cache.addAll([ - "/HTMLReader/", - "/HTMLReader/index.html" - ]); - }) - ); -}); - -self.addEventListener("fetch", (event) => { - event.respondWith( - caches.match(event.request).then((response) => { - return response || fetch(event.request); - }) - ); -}); From 331fbcab1caa9735ecef60efca08d8154f1a5ea8 Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Sat, 30 Aug 2025 19:38:38 +0000 Subject: [PATCH 03/20] Huh, how did that happen --- Build/index.html | 161 +++++++++++++++++------------------------------ 1 file changed, 58 insertions(+), 103 deletions(-) diff --git a/Build/index.html b/Build/index.html index 36e8835..a124f9a 100644 --- a/Build/index.html +++ b/Build/index.html @@ -1,112 +1,67 @@ - - - HTMLRunner - - - - - - - - - - - - - - - - + + + + HTMLReader + -
-
+
+
+ HTMLReader +
-
-
-
- -
- - - - - - - - -
-
-
-
-
-
HTML
-
CSS
-
JavaScript
-
-
- - -
-
-
-
Preview
-
Console
-
-
- -
-
-
-
+
+ + + + + + +
- - - - +
+
+
+
+
+ +
+ Page + + of + 1 +
+ +
+ +
+
+

Table of Contents

+ +
+
+
+ +
+
+

Library

+ +
+
+
+
+
+

Loading EPUB...

+

Please wait while your book is being processed.

+
+
+

Error

+

There was an error processing your EPUB file.

+ +
+ \ No newline at end of file From 07bde5ee5ada8998bc2e840769fbc1532afdf0c2 Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Sat, 30 Aug 2025 19:43:13 +0000 Subject: [PATCH 04/20] Fix table of contents bug --- Build/src/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/Build/src/style.css b/Build/src/style.css index 465e9ba..bbeeb33 100644 --- a/Build/src/style.css +++ b/Build/src/style.css @@ -112,6 +112,7 @@ input[type="number"] { z-index: 10; display: flex; flex-direction: column; + z-index: 1010; } .toc-container.open { From 9d0c3e0c507281c34b3d9c39b3fafa94d07be85c Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Thu, 11 Sep 2025 19:27:10 -0600 Subject: [PATCH 05/20] what is that doing in here?! --- Build/Build/Buildscripts/build-all.sh | 16 - Build/Build/Buildscripts/build-inline.sh | 67 - Build/Build/Buildscripts/build.sh | 21 - Build/Build/package-lock.json | 5997 ---------------------- Build/Build/package.json | 53 - Build/Build/src/console.ts | 129 - Build/Build/src/editor.ts | 139 - Build/Build/src/index.html | 112 - Build/Build/src/main.ts | 542 -- Build/Build/src/runner.ts | 207 - Build/Build/src/state.ts | 148 - Build/Build/src/styles.css | 559 -- Build/Build/src/types.ts | 51 - Build/Build/src/ui.ts | 144 - Build/Build/src/utils.ts | 19 - Build/Build/tsconfig.json | 16 - Build/Build/webpack.config.js | 39 - 17 files changed, 8259 deletions(-) delete mode 100755 Build/Build/Buildscripts/build-all.sh delete mode 100755 Build/Build/Buildscripts/build-inline.sh delete mode 100755 Build/Build/Buildscripts/build.sh delete mode 100644 Build/Build/package-lock.json delete mode 100644 Build/Build/package.json delete mode 100644 Build/Build/src/console.ts delete mode 100644 Build/Build/src/editor.ts delete mode 100644 Build/Build/src/index.html delete mode 100644 Build/Build/src/main.ts delete mode 100644 Build/Build/src/runner.ts delete mode 100644 Build/Build/src/state.ts delete mode 100644 Build/Build/src/styles.css delete mode 100644 Build/Build/src/types.ts delete mode 100644 Build/Build/src/ui.ts delete mode 100644 Build/Build/src/utils.ts delete mode 100644 Build/Build/tsconfig.json delete mode 100644 Build/Build/webpack.config.js diff --git a/Build/Build/Buildscripts/build-all.sh b/Build/Build/Buildscripts/build-all.sh deleted file mode 100755 index 7ac046f..0000000 --- a/Build/Build/Buildscripts/build-all.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -set -e # Exit immediately on error - -echo "Starting full build..." -echo "" - -# Determine the directory of this script -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -# Run each script relative to this directory -"$SCRIPT_DIR/build.sh" -echo "" -"$SCRIPT_DIR/build-inline.sh" -echo "" - -echo "Full build completed." diff --git a/Build/Build/Buildscripts/build-inline.sh b/Build/Build/Buildscripts/build-inline.sh deleted file mode 100755 index 0b06d26..0000000 --- a/Build/Build/Buildscripts/build-inline.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash -set -euo pipefail - -echo "Starting inlining process..." - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -DIST_DIR="$SCRIPT_DIR/../dist" - -HTML_FILE="$DIST_DIR/index.html" -CSS_FILE="$DIST_DIR/styles.css" -JS_FILE="$DIST_DIR/main.js" -OUTPUT_FILE="$DIST_DIR/index-inline.html" - -# Check that required files exist -if [[ ! -f "$HTML_FILE" || ! -f "$CSS_FILE" || ! -f "$JS_FILE" ]]; then - echo "Missing one or more required files in $DIST_DIR." - exit 1 -fi - -# Step 1: Create a backup of the original HTML -cp "$HTML_FILE" "$OUTPUT_FILE" - -# Step 2: Read and indent CSS and JS -INDENTED_CSS=$(sed 's/^/ /' "$CSS_FILE") -INDENTED_JS=$(sed 's/^/ /' "$JS_FILE") - -# Step 3: Replace and |@@INLINE_JS@@|g' "$OUTPUT_FILE" -sed -i.bak "s|]*data-inline=\"true\"[^>]*src='main\.js'[^>]*>|@@INLINE_JS@@|g" "$OUTPUT_FILE" - -# Step 4: Write indented CSS and JS to temporary files -INLINE_CSS_FILE=$(mktemp) -INLINE_JS_FILE=$(mktemp) - -{ - echo " " -} > "$INLINE_CSS_FILE" - -{ - echo " " -} > "$INLINE_JS_FILE" - -# Step 5: Replace placeholders with inline content -awk -v css="$INLINE_CSS_FILE" -v js="$INLINE_JS_FILE" ' -/@@INLINE_CSS@@/ { - while ((getline line < css) > 0) print line - close(css) - next -} -/@@INLINE_JS@@/ { - while ((getline line < js) > 0) print line - close(js) - next -} -{ print } -' "$OUTPUT_FILE" > "$OUTPUT_FILE.tmp" && mv "$OUTPUT_FILE.tmp" "$OUTPUT_FILE" - -# Clean up -rm -f "$INLINE_CSS_FILE" "$INLINE_JS_FILE" "$OUTPUT_FILE.bak" - -echo "Inlined output written to $OUTPUT_FILE" diff --git a/Build/Build/Buildscripts/build.sh b/Build/Build/Buildscripts/build.sh deleted file mode 100755 index 15690e0..0000000 --- a/Build/Build/Buildscripts/build.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -set -e - -echo "Building HTMLRunner" - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" # project root -BUILD_DIR="$ROOT_DIR/Build" # e.g., Build/ -DIST_DIR="$BUILD_DIR/dist" # final output - -cd "$BUILD_DIR" - -npm install -npm run build - -echo "Copying extra files..." -cp "$ROOT_DIR/favicon.png" "$DIST_DIR/" -cp "$ROOT_DIR/manifest.json" "$DIST_DIR/" -cp "$ROOT_DIR/service-worker.js" "$DIST_DIR/" - -echo "Build completed." diff --git a/Build/Build/package-lock.json b/Build/Build/package-lock.json deleted file mode 100644 index cceec70..0000000 --- a/Build/Build/package-lock.json +++ /dev/null @@ -1,5997 +0,0 @@ -{ - "name": "htmlrunner", - "version": "1.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "htmlrunner", - "version": "1.1.0", - "license": "ISC", - "dependencies": { - "@babel/core": "^7.28.3", - "@babel/parser": "^7.27.5", - "@babel/runtime": "^7.28.2", - "@codemirror/commands": "^6.8.1", - "@codemirror/lang-css": "^6.3.1", - "@codemirror/lang-html": "^6.4.9", - "@codemirror/lang-javascript": "^6.2.4", - "@codemirror/lint": "^6.8.5", - "@codemirror/state": "^6.5.2", - "@codemirror/view": "^6.38.1", - "@prettier/plugin-xml": "^3.4.2", - "@types/codemirror": "^5.60.16", - "@uiw/codemirror-theme-bbedit": "^4.25.1", - "@uiw/codemirror-theme-monokai": "^4.25.1", - "codemirror": "^6.0.2", - "copy-webpack-plugin": "^13.0.0", - "eslint": "^9.34.0", - "eslint-linter-browserify": "^9.31.0", - "file-saver": "^2.0.5", - "fontawesome": "^5.6.3", - "jszip": "^3.10.1", - "prettier": "^3.6.2", - "prettier-plugin-css-order": "^2.1.2", - "split.js": "^1.6.5" - }, - "devDependencies": { - "@types/file-saver": "^2.0.7", - "@types/prettier": "^3.0.0", - "@types/split.js": "^1.6.0", - "copy-webpack-plugin": "^13.0.0", - "htmlhint": "^1.6.3", - "ts-loader": "^9.5.2", - "typescript": "^5.9.2", - "webpack": "^5.100.1", - "webpack-cli": "^6.0.1", - "webpack-dev-server": "^5.2.2" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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==", - "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.27.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz", - "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@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.3", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", - "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/core/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/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==", - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", - "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-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==", - "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-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "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==", - "license": "MIT", - "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==", - "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==", - "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-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==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", - "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", - "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==", - "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.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/traverse/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==", - "license": "MIT" - }, - "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@codemirror/autocomplete": { - "version": "6.18.6", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", - "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/commands": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz", - "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.27.0", - "@lezer/common": "^1.1.0" - } - }, - "node_modules/@codemirror/lang-css": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", - "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.2", - "@lezer/css": "^1.1.7" - } - }, - "node_modules/@codemirror/lang-html": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.9.tgz", - "integrity": "sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/lang-css": "^6.0.0", - "@codemirror/lang-javascript": "^6.0.0", - "@codemirror/language": "^6.4.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0", - "@lezer/css": "^1.1.0", - "@lezer/html": "^1.3.0" - } - }, - "node_modules/@codemirror/lang-javascript": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz", - "integrity": "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.6.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0", - "@lezer/javascript": "^1.0.0" - } - }, - "node_modules/@codemirror/language": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz", - "integrity": "sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.23.0", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/lint": { - "version": "6.8.5", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", - "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.35.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/search": { - "version": "6.5.11", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.11.tgz", - "integrity": "sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/state": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", - "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", - "dependencies": { - "@marijn/find-cluster-break": "^1.0.0" - } - }, - "node_modules/@codemirror/view": { - "version": "6.38.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.1.tgz", - "integrity": "sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.5.0", - "crelt": "^1.0.6", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", - "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.17.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "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==", - "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==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "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==", - "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-array/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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-array/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==" - }, - "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==", - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "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==", - "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==", - "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/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/@eslint/eslintrc/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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/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==" - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc/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==" - }, - "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", - "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==", - "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==", - "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/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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==", - "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==", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@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==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", - "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", - "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", - "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@lezer/common": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", - "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", - "license": "MIT" - }, - "node_modules/@lezer/css": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.2.1.tgz", - "integrity": "sha512-2F5tOqzKEKbCUNraIXc0f6HKeyKlmMWJnBB0i4XW6dJgssrZO/YlZ2pY5xgyqDleqqhiNJ3dQhbrV2aClZQMvg==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.0" - } - }, - "node_modules/@lezer/highlight": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", - "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/html": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz", - "integrity": "sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/javascript": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.1.tgz", - "integrity": "sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.1.3", - "@lezer/lr": "^1.3.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", - "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", - "license": "MIT" - }, - "node_modules/@prettier/plugin-xml": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-3.4.2.tgz", - "integrity": "sha512-/UyNlHfkuLXG6Ed85KB0WBF283xn2yavR+UtRibBRUcvEJId2DSLdGXwJ/cDa1X++SWDPzq3+GSFniHjkNy7yg==", - "license": "MIT", - "dependencies": { - "@xml-tools/parser": "^1.0.11" - }, - "peerDependencies": { - "prettier": "^3.0.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/codemirror": { - "version": "5.60.16", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.16.tgz", - "integrity": "sha512-V/yHdamffSS075jit+fDxaOAmdP2liok8NSNJnAZfDJErzOheuygHZEhAJrfmk5TEyM32MhkZjwo/idX791yxw==", - "license": "MIT", - "dependencies": { - "@types/tern": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz", - "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/file-saver": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.7.tgz", - "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.15.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.24.tgz", - "integrity": "sha512-w9CZGm9RDjzTh/D+hFwlBJ3ziUaVw7oufKA3vOFSOZlzmW9AkZnfjPb+DLnrV6qtgL/LNmP0/2zBNCFHL3F0ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==", - "deprecated": "This is a stub types definition. prettier provides its own type definitions, so you do not need this installed.", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sarif": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", - "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/split.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@types/split.js/-/split.js-1.6.0.tgz", - "integrity": "sha512-tR/wWtnfZ+ZiEFrusKHn1qKUnZlpROff7a6wvRwS9ImI3pD6ytrRmgt4mbPM2FpRUUTIKsfZXGXBmuvalMUVzw==", - "deprecated": "This is a stub types definition. split.js provides its own type definitions, so you do not need this installed.", - "dev": true, - "license": "MIT", - "dependencies": { - "split.js": "*" - } - }, - "node_modules/@types/tern": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", - "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@uiw/codemirror-theme-bbedit": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-bbedit/-/codemirror-theme-bbedit-4.25.1.tgz", - "integrity": "sha512-PF2WmeES5lP6HWLW95RS3dExvcxWQBg68pwSVwFUbtLm26nxcmsx/YDIOwAHemv5+jBRQuVU+sxiK9AQSEybkg==", - "license": "MIT", - "dependencies": { - "@uiw/codemirror-themes": "4.25.1" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, - "node_modules/@uiw/codemirror-theme-bbedit/node_modules/@uiw/codemirror-themes": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.25.1.tgz", - "integrity": "sha512-6o8tQ8bdq14RuVFpZ7l9u8KnuPq824uG3U1VV933Uhv8mfaxaoaOQSjv6T2bQUPhjH6ZlEu5+tAMkOfIL21eIQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/language": ">=6.0.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/view": ">=6.0.0" - } - }, - "node_modules/@uiw/codemirror-theme-monokai": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-monokai/-/codemirror-theme-monokai-4.25.1.tgz", - "integrity": "sha512-UWGDOTdeosGSnVar56E2/8ktPVNeGmjAz2rJmHCqiGPB+Jb49WqNT8m9aGVB8/BZiFwv7Dv0EIyL71tR9ILzmA==", - "license": "MIT", - "dependencies": { - "@uiw/codemirror-themes": "4.25.1" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, - "node_modules/@uiw/codemirror-theme-monokai/node_modules/@uiw/codemirror-themes": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.25.1.tgz", - "integrity": "sha512-6o8tQ8bdq14RuVFpZ7l9u8KnuPq824uG3U1VV933Uhv8mfaxaoaOQSjv6T2bQUPhjH6ZlEu5+tAMkOfIL21eIQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/language": ">=6.0.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/view": ">=6.0.0" - } - }, - "node_modules/@uiw/codemirror-themes": { - "version": "4.24.1", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.24.1.tgz", - "integrity": "sha512-hduBbFNiWNW6nYa2/giKQ9YpzhWNw87BGpCjC+cXYMZ7bCD6q5DC6Hw+7z7ZwSzEaOQvV91lmirOjJ8hn9+pkg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/language": ">=6.0.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/view": ">=6.0.0" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", - "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", - "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", - "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xml-tools/parser": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", - "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", - "license": "Apache-2.0", - "dependencies": { - "chevrotain": "7.1.1" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.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==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "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==", - "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/anymatch/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/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "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==", - "license": "MIT" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true, - "license": "MIT" - }, - "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/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "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/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/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", - "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": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", - "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/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/chevrotain": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", - "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", - "license": "Apache-2.0", - "dependencies": { - "regexp-to-ast": "0.5.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/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/codemirror": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", - "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "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==", - "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/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/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-webpack-plugin": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", - "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-parent": "^6.0.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2", - "tinyglobby": "^0.2.12" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "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==" - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "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/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.159", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.159.tgz", - "integrity": "sha512-CEvHptWAMV5p6GJ0Lq8aheyvVbfzVrv5mmidu1D3pidoVNkB3tTBsTMVtPJ+rzRK5oV229mCLz9Zj/hNvU8GBA==", - "license": "ISC" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.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.34.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-linter-browserify": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/eslint-linter-browserify/-/eslint-linter-browserify-9.31.0.tgz", - "integrity": "sha512-Utv/GchpL5EkPK1FcYvPjdfcYl6nEr2SaJgY4cZHRt/IVGxvojhdZQLHSC9CTpWVWt1fQ7McrzyfCCD1QxB9ow==", - "license": "MIT" - }, - "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": "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==", - "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/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/eslint/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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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==", - "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/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/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==" - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/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==" - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "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/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "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==", - "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==", - "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==", - "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/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "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-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==" - }, - "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==" - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fdir": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "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==", - "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/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "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==", - "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==" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fontawesome": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/fontawesome/-/fontawesome-5.6.3.tgz", - "integrity": "sha512-FCc+CawwsJWWprVEg9X14yI7zI+l9YVAyhzgu70qwGeDn0tLLDH/dVfqgij72g4BBGgLGfK2qnvFGAmYUkhaWg==", - "license": "MIT" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "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==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "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": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "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==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "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/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/htmlhint": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-1.6.3.tgz", - "integrity": "sha512-AVmlXD75nRVcb+a+6PZxUgSFIR67KbzrwooCzyx0lV5A17EJioxtOUuM1k9z+xXjzhZt0z3vntcu5JPSH/XHxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "3.2.6", - "chalk": "4.1.2", - "commander": "11.1.0", - "glob": "^8.1.0", - "is-glob": "^4.0.3", - "node-sarif-builder": "^3.2.0", - "strip-json-comments": "3.1.1", - "xml": "1.0.1" - }, - "bin": { - "htmlhint": "bin/htmlhint" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "type": "Open Collective", - "url": "https://opencollective.com/htmlhint" - } - }, - "node_modules/htmlhint/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.18" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "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==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "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==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "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==", - "engines": { - "node": ">=0.8.19" - } - }, - "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/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "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-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-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-network-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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==", - "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==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "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==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "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==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "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==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/launch-editor": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", - "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "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==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==" - }, - "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==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", - "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.3.0", - "tree-dump": "^1.0.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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/micromatch/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/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "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", - "peer": true, - "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==" - }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" - }, - "node_modules/node-sarif-builder": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.2.0.tgz", - "integrity": "sha512-kVIOdynrF2CRodHZeP/97Rh1syTUHBNiw17hUCIVhlhEsWlfJm19MuO56s4MdKbr22xWx6mzMnNAgXzVlIYM9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/sarif": "^2.1.7", - "fs-extra": "^11.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "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/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/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true, - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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/open": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", - "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "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==", - "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/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "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-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, - "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": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "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", - "peer": true, - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-less": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz", - "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "postcss": "^8.3.5" - } - }, - "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==", - "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/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "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==", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-css-order": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier-plugin-css-order/-/prettier-plugin-css-order-2.1.2.tgz", - "integrity": "sha512-vomxPjHI6pOMYcBuouSJHxxQClJXaUpU9rsV9IAO2wrSTZILRRlrxAAR8t9UF6wtczLkLfNRFUwM+ZbGXOONUA==", - "license": "ISC", - "dependencies": { - "css-declaration-sorter": "^7.1.1", - "postcss-less": "^6.0.0", - "postcss-scss": "^4.0.9" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "prettier": "3.x" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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/readdirp/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/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/regexp-to-ast": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", - "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "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-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "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/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true, - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "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/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/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/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "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", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/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/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy-transport/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/spdy/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy/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/split.js": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", - "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==", - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-mod": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", - "license": "MIT" - }, - "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==", - "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/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.40.0.tgz", - "integrity": "sha512-cfeKl/jjwSR5ar7d0FGmave9hFGJT8obyo0z+CrQOylLDbk7X81nPU6vq9VORa5jU30SkDnT2FXjLbR8HLP+xA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "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/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tree-dump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", - "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/ts-loader": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", - "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "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==", - "dev": true, - "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==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "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/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "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": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "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/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webpack": { - "version": "5.100.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.100.1.tgz", - "integrity": "sha512-YJB/ESPUe2Locd0NKXmw72Dx8fZQk1gTzI6rc9TAT4+Sypbnhl8jd8RywB1bDsDF9Dy1RUR7gn3q/ZJTd0OZZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.2", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", - "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.6.1", - "@webpack-cli/configtest": "^3.0.1", - "@webpack-cli/info": "^3.0.1", - "@webpack-cli/serve": "^3.0.1", - "colorette": "^2.0.14", - "commander": "^12.1.0", - "cross-spawn": "^7.0.3", - "envinfo": "^7.14.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^6.0.1" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.82.0" - }, - "peerDependenciesMeta": { - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", - "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", - "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/express-serve-static-core": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.9", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "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/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "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/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "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==", - "license": "ISC" - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/Build/Build/package.json b/Build/Build/package.json deleted file mode 100644 index 7f714e5..0000000 --- a/Build/Build/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "htmlrunner", - "version": "1.1.0", - "description": "A small live HTML/JS runner with console capture.", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "webpack", - "watch": "webpack --watch", - "start": "webpack serve --open" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "@babel/core": "^7.28.3", - "@babel/parser": "^7.27.5", - "@babel/runtime": "^7.28.2", - "@codemirror/commands": "^6.8.1", - "@codemirror/lang-css": "^6.3.1", - "@codemirror/lang-html": "^6.4.9", - "@codemirror/lang-javascript": "^6.2.4", - "@codemirror/lint": "^6.8.5", - "@codemirror/state": "^6.5.2", - "@codemirror/view": "^6.38.1", - "@prettier/plugin-xml": "^3.4.2", - "@types/codemirror": "^5.60.16", - "@uiw/codemirror-theme-bbedit": "^4.25.1", - "@uiw/codemirror-theme-monokai": "^4.25.1", - "codemirror": "^6.0.2", - "eslint": "^9.34.0", - "eslint-linter-browserify": "^9.31.0", - "file-saver": "^2.0.5", - "fontawesome": "^5.6.3", - "jszip": "^3.10.1", - "prettier": "^3.6.2", - "prettier-plugin-css-order": "^2.1.2", - "split.js": "^1.6.5", - "copy-webpack-plugin": "^13.0.0" - }, - "devDependencies": { - "@types/file-saver": "^2.0.7", - "@types/prettier": "^3.0.0", - "@types/split.js": "^1.6.0", - "copy-webpack-plugin": "^13.0.0", - "htmlhint": "^1.6.3", - "ts-loader": "^9.5.2", - "typescript": "^5.9.2", - "webpack": "^5.100.1", - "webpack-cli": "^6.0.1", - "webpack-dev-server": "^5.2.2" - } -} diff --git a/Build/Build/src/console.ts b/Build/Build/src/console.ts deleted file mode 100644 index 9cfb18a..0000000 --- a/Build/Build/src/console.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { ConsoleMessage, StackInfo } from './types'; - -export const consoleOutput = document.getElementById('console') as HTMLDivElement; - -// Console interceptor code that will be injected into the preview iframe -export const consoleInterceptor = ` - const originalConsole = { log: console.log, error: console.error, warn: console.warn, info: console.info }; - function sendToConsole(level, ...args) { - window.parent.postMessage({ type: 'console', level, data: args, timestamp: new Date().toISOString() }, '*'); - originalConsole[level].apply(console, args); - } - console.log = (...args) => sendToConsole('log', ...args); - console.error = (...args) => sendToConsole('error', ...args); - console.warn = (...args) => sendToConsole('warn', ...args); - console.info = (...args) => sendToConsole('info', ...args); - window.onerror = (message, source, lineno, colno, error) => { - sendToConsole('error', error || message, { stack: error?.stack }); - return true; - }; - window.onunhandledrejection = (event) => { - sendToConsole('error', event.reason, { stack: event.reason?.stack }); - }; -`; - -// Initialize console message handler -export function initializeConsole(): void { - window.addEventListener('message', handleConsoleMessage); -} - -function handleConsoleMessage(event: MessageEvent): void { - if (event.data.type === 'console') { - const entry = document.createElement('div'); - entry.className = 'console-entry'; - const timestamp = document.createElement('span'); - timestamp.className = 'timestamp'; - timestamp.textContent = new Date(event.data.timestamp).toLocaleTimeString(); - const message = document.createElement('span'); - message.className = `console-${event.data.level}`; - if (event.data.data && event.data.data.length) { - event.data.data.forEach((item: any, i: number) => { - if (i > 0) message.appendChild(document.createTextNode(' ')); - if (item && typeof item === 'object') { - message.appendChild(renderObject(item)); - } else { - message.appendChild(document.createTextNode(String(item))); - } - }); - } - if (event.data.data[1]?.stack) { - const stack = document.createElement('div'); - stack.className = 'console-stack'; - stack.textContent = event.data.data[1].stack; - stack.addEventListener('click', () => stack.classList.toggle('expanded')); - message.appendChild(stack); - } - entry.appendChild(timestamp); - entry.appendChild(document.createTextNode(' ')); - entry.appendChild(message); - consoleOutput.appendChild(entry); - consoleOutput.scrollTop = consoleOutput.scrollHeight; - } -} - -function renderObject(obj: any, level = 0, visited = new WeakSet()): Node { - if (obj === null) return document.createTextNode('null'); - if (typeof obj !== 'object') return document.createTextNode(String(obj)); - if (visited.has(obj)) return document.createTextNode('[Circular]'); - if (level > 3) return document.createTextNode('[...]'); - visited.add(obj); - - const container = document.createElement('span'); - if (obj instanceof Error) { - const errorEl = document.createElement('span'); - errorEl.className = 'console-error'; - errorEl.textContent = `${obj.name}: ${obj.message}`; - if (obj.stack) errorEl.textContent += `\n${obj.stack.split('\n').slice(1).join('\n')}`; - container.appendChild(errorEl); - return container; - } - - const preview = document.createElement('span'); - preview.className = 'console-object'; - preview.textContent = Array.isArray(obj) ? `Array(${obj.length})` : '{...}'; - const content = document.createElement('div'); - content.className = 'console-object-content'; - - Object.entries(obj).forEach(([key, value]) => { - const prop = document.createElement('div'); - prop.textContent = `${key}: `; - prop.appendChild(renderObject(value, level + 1, visited)); - content.appendChild(prop); - }); - - preview.addEventListener('click', (e) => { - e.stopPropagation(); - preview.classList.toggle('expanded'); - }); - - container.appendChild(preview); - container.appendChild(content); - return container; -} - -export function clearConsole(): void { - consoleOutput.innerHTML = ''; -} - -export function logConsoleError(message: string, stack: StackInfo = {}): void { - const entry = document.createElement('div'); - entry.className = 'console-entry'; - const timestamp = document.createElement('span'); - timestamp.className = 'timestamp'; - timestamp.textContent = new Date().toLocaleTimeString(); - const msg = document.createElement('span'); - msg.className = 'console-error'; - msg.textContent = message; - if (stack.stack) { - const stackEl = document.createElement('div'); - stackEl.className = 'console-stack'; - stackEl.textContent = stack.stack; - stackEl.addEventListener('click', () => stackEl.classList.toggle('expanded')); - msg.appendChild(stackEl); - } - entry.appendChild(timestamp); - entry.appendChild(document.createTextNode(' ')); - entry.appendChild(msg); - consoleOutput.appendChild(entry); - consoleOutput.scrollTop = consoleOutput.scrollHeight; -} diff --git a/Build/Build/src/editor.ts b/Build/Build/src/editor.ts deleted file mode 100644 index 3fd56f8..0000000 --- a/Build/Build/src/editor.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { Compartment, EditorState, Extension } from "@codemirror/state"; -import { EditorView, lineNumbers, keymap } from "@codemirror/view"; // Add standardKeymap, defaultKeymap -import { defaultKeymap, standardKeymap } from "@codemirror/commands"; -import { html } from "@codemirror/lang-html"; -import { css } from "@codemirror/lang-css"; -import { javascript } from "@codemirror/lang-javascript"; -import { linter, lintGutter } from "@codemirror/lint"; -import { monokai } from "@uiw/codemirror-theme-monokai"; -import { bbedit } from "@uiw/codemirror-theme-bbedit"; -import { CodeMirrorEditor, Editors } from "./types"; -import { runCode } from "./runner"; -import { toggleSearch } from "./main"; -import { debounce } from "./utils"; -import { saveState } from "./state"; -import { search } from "@codemirror/search"; -import { toggleComment } from "@codemirror/commands"; // Ensure toggleComment is imported - -export let isDarkMode: boolean = localStorage.getItem("darkMode") === "true"; -export let isAutoRun: boolean = localStorage.getItem("autoRun") === "true"; - -export const editors: Editors = { - html: null as unknown as CodeMirrorEditor, - css: null as unknown as CodeMirrorEditor, - js: null as unknown as CodeMirrorEditor, -}; - -export function setDarkMode(value: boolean): void { - isDarkMode = value; - Object.values(editors).forEach((editor) => { - editor.view.dispatch({ - effects: editor.themeCompartment.reconfigure( - isDarkMode ? monokai : bbedit - ), - }); - }); -} - -export function setAutoRun(value: boolean): void { - isAutoRun = value; -} - -function createEditorConfig( - language: Extension, - container: HTMLElement, - content: string -): CodeMirrorEditor { - const themeCompartment = new Compartment(); - const autoRunCompartment = new Compartment(); - - const view = new EditorView({ - state: EditorState.create({ - doc: content, - extensions: [ - lineNumbers(), - language, - themeCompartment.of(isDarkMode ? monokai : bbedit), - EditorView.lineWrapping, - EditorState.tabSize.of(2), - EditorView.theme({ - "&": { height: "100%" }, - ".cm-scroller": { overflow: "auto" }, - ".cm-content": { minHeight: "100%" } - }), - search(), - linter( - (view) => { - return []; - }, - { delay: 100 } - ), - lintGutter(), - keymap.of([ - ...standardKeymap, // Add standard keymap - ...defaultKeymap, // Add default keymap - { - key: "Ctrl-/", - run: (view: EditorView) => { - view.dispatch({ - changes: { from: 0, to: view.state.doc.length, insert: "" }, - }); - return true; - }, - preventDefault: true, - }, - ]), - autoRunCompartment.of( - isAutoRun - ? EditorView.updateListener.of((update) => { - if (update.docChanged) { - debounce(runCode, 1000)(); - } - }) - : [] - ), - // Autosave listener - EditorView.updateListener.of((update) => { - if (update.docChanged) { - debounce(saveState, 1000)(); - } - }), - ], - }), - parent: container, - }); - - // Prevent Enter from submitting a form - view.dom.addEventListener("keydown", (event) => { - if (event.key === "Enter") { - event.stopPropagation(); // Prevent form submission - } - }); - - return { - view, - state: view.state, - themeCompartment, - autoRunCompartment, - }; -} - -export function initializeEditors(): void { - const htmlContainer = document.getElementById( - "html-editor-container" - ) as HTMLElement; - const cssContainer = document.getElementById( - "css-editor-container" - ) as HTMLElement; - const jsContainer = document.getElementById( - "js-editor-container" - ) as HTMLElement; - - if (!htmlContainer || !cssContainer || !jsContainer) { - throw new Error("Editor containers not found"); - } - - editors.html = createEditorConfig(html(), htmlContainer, ""); - editors.css = createEditorConfig(css(), cssContainer, ""); - editors.js = createEditorConfig(javascript(), jsContainer, ""); -} \ No newline at end of file diff --git a/Build/Build/src/index.html b/Build/Build/src/index.html deleted file mode 100644 index 36e8835..0000000 --- a/Build/Build/src/index.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - HTMLRunner - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
- -
- - - - - - - - -
-
-
-
-
-
HTML
-
CSS
-
JavaScript
-
-
- - -
-
-
-
Preview
-
Console
-
-
- -
-
-
-
-
- - - - - - \ No newline at end of file diff --git a/Build/Build/src/main.ts b/Build/Build/src/main.ts deleted file mode 100644 index f40111b..0000000 --- a/Build/Build/src/main.ts +++ /dev/null @@ -1,542 +0,0 @@ -import { initializeEditors, setDarkMode, setAutoRun } from "./editor"; -import { EditorView, keymap } from "@codemirror/view"; -import { EditorState, StateEffect } from "@codemirror/state"; -import { - search, - openSearchPanel, - searchPanelOpen, - closeSearchPanel, -} from "@codemirror/search"; -import { toggleComment } from "@codemirror/commands"; -import Split from "split.js"; -import * as prettier from "prettier/standalone"; -import * as parserHtml from "prettier/plugins/html"; -import * as parserCss from "prettier/plugins/postcss"; -import * as parserFlow from "prettier/plugins/flow"; -import * as prettierPluginEstree from "prettier/plugins/estree"; -import JSZip from "jszip"; -import { saveAs } from "file-saver"; -import { copyToClipboard } from "./utils"; -import { editors } from "./editor"; -import { - Editors, - State, - ConsoleMessage, - StackInfo, - CodeMirrorEditor, -} from "./types"; -import { consoleInterceptor, consoleOutput, clearConsole, logConsoleError } from "./console"; -import { runCode, formatCode } from "./runner"; -import { resetCode, state, saveState, loadState } from "./state"; -import { switchTab, switchOutput, showError, showLoading, hideLoading, updateThemeIcon, setPageDarkMode } from "./ui"; // Import updateThemeIcon - -// Type declarations for global window properties -declare global { - interface Window { - prettierPlugins: any[]; - runCode: () => void; - clearConsole: () => void; - resetCode: () => void; - formatCode: () => Promise; - toggleAutoRun: () => void; - toggleDarkMode: () => void; - switchTab: (tab: string) => void; - switchOutput: (output: string) => void; - exportAsZip: () => Promise; - copyAllConsole: () => void; - copyEditorContent: (editor: string) => void; - toggleSearch: () => void; - } -} - -// Register Prettier plugins -const plugins = [parserHtml, parserCss, parserFlow]; -window.prettierPlugins = plugins; - -let currentTab: string = "html"; -let currentOutput: string = "preview"; -let isDarkMode: boolean = localStorage.getItem("darkMode") === "true"; -let isAutoRun: boolean = localStorage.getItem("autoRun") === "true"; -let splitInstance: Split.Instance; -const loadingEl = document.getElementById("loading") as HTMLDivElement; -const errorEl = document.getElementById("error-message") as HTMLDivElement; -const preview = document.getElementById("preview") as HTMLIFrameElement; - -if (!consoleOutput || !loadingEl || !errorEl || !preview) { - throw new Error("Required DOM elements not found"); -} - -// Initialize Split.js -function initializeSplit() { - if (splitInstance) { - splitInstance.destroy(); - } - - const elements = ["#editor-panel", "#output-panel"]; - const direction = window.innerWidth <= 768 ? "vertical" : "horizontal"; - - if (!elements.every((id) => document.querySelector(id))) { - console.error("Split.js elements not found"); - return; - } - - splitInstance = Split(elements, { - sizes: state.splitSizes || [50, 50], - minSize: 200, - gutterSize: 10, - snapOffset: 0, - dragInterval: 1, - direction, - elementStyle: (dimension, size, gutterSize) => ({ - "flex-basis": `calc(${size}% - ${gutterSize}px)`, - }), - gutterStyle: (dimension, gutterSize) => ({ - "flex-basis": `${gutterSize}px`, - }), - onDragStart: function () { - document.body.style.cursor = - direction === "horizontal" ? "col-resize" : "row-resize"; - }, - onDrag: function () { - Object.values(editors).forEach((editor) => editor.view.requestMeasure()); - }, - onDragEnd: function (sizes) { - document.body.style.cursor = ""; - state.splitSizes = sizes; - saveState(); - Object.values(editors).forEach((editor) => editor.view.requestMeasure()); - }, - }); - - setTimeout(() => { - Object.values(editors).forEach((editor) => editor.view.requestMeasure()); - }, 0); -} - -// Handle window resize -let resizeTimeout: number; -const handleResize = () => { - if (resizeTimeout) { - window.clearTimeout(resizeTimeout); - } - resizeTimeout = window.setTimeout(() => { - initializeSplit(); - }, 250); -}; - -window.removeEventListener("resize", handleResize); -window.addEventListener("resize", handleResize); - -window.addEventListener("beforeunload", () => { - if (splitInstance) { - splitInstance.destroy(); - } -}); - -// Add global keyboard shortcut handler for search -function addGlobalSearchShortcuts() { - const preventDefault = (e: KeyboardEvent) => { - if ((e.ctrlKey || e.metaKey) && (e.key === "f" || e.key === "h")) { - e.preventDefault(); - e.stopPropagation(); - toggleSearch(e.key === "f" ? "find" : "replace"); - } - }; - window.addEventListener("keydown", preventDefault, true); -} - -// Initialize search controls -function initializeSearchControls(tabsContainer: Element): void { - const searchControls = document.createElement("div"); - searchControls.className = "search-controls"; - - const searchBtn = document.createElement("button"); - searchBtn.className = "search-btn"; - searchBtn.innerHTML = ''; - searchBtn.title = "Search (Ctrl+F)"; - searchBtn.onclick = () => toggleSearch("find"); - - const replaceBtn = document.createElement("button"); - replaceBtn.className = "replace-btn"; - replaceBtn.innerHTML = ''; - replaceBtn.title = "Replace (Ctrl+H)"; - replaceBtn.onclick = () => toggleSearch("replace"); - - searchControls.appendChild(searchBtn); - searchControls.appendChild(replaceBtn); - tabsContainer.appendChild(searchControls); -} - -// Console message handling -window.addEventListener("message", (event: MessageEvent) => { - if (event.data.type === "console") { - const entry = document.createElement("div"); - entry.className = `console-entry ${!activeFilters.has(event.data.level) ? "filtered" : ""}`; - - const timestamp = document.createElement("span"); - timestamp.className = "timestamp"; - timestamp.textContent = new Date(event.data.timestamp).toLocaleTimeString(); - - const message = document.createElement("span"); - message.className = `console-${event.data.level}`; - if (event.data.data && event.data.data.length) { - event.data.data.forEach((item: any, i: number) => { - if (i > 0) message.appendChild(document.createTextNode(" ")); - if (item && typeof item === "object") { - message.appendChild(renderObject(item)); - } else { - message.appendChild(document.createTextNode(String(item))); - } - }); - } - - if (event.data.data[1]?.stack) { - const stack = document.createElement("div"); - stack.className = "console-stack"; - stack.textContent = event.data.data[1].stack; - stack.addEventListener("click", () => stack.classList.toggle("expanded")); - message.appendChild(stack); - } - - const copyBtn = document.createElement("button"); - copyBtn.className = "copy-btn"; - copyBtn.innerHTML = ''; - copyBtn.addEventListener("click", () => { - const text = event.data.data - .map((item: any) => - typeof item === "object" - ? JSON.stringify(item, null, 2) - : String(item) - ) - .join(" "); - copyToClipboard(text); - copyBtn.innerHTML = ''; - setTimeout(() => { - copyBtn.innerHTML = ''; - }, 2000); - }); - - entry.appendChild(timestamp); - entry.appendChild(document.createTextNode(" ")); - entry.appendChild(message); - entry.appendChild(copyBtn); - consoleOutput.appendChild(entry); - consoleOutput.scrollTop = consoleOutput.scrollHeight; - } -}); - -// Render objects with depth limit and circular reference handling -function renderObject(obj: any, level = 0, visited = new WeakSet()): Node { - if (obj === null) return document.createTextNode("null"); - if (typeof obj !== "object") return document.createTextNode(String(obj)); - if (visited.has(obj)) return document.createTextNode("[Circular]"); - if (level > 3) return document.createTextNode("[...]"); - visited.add(obj); - - const container = document.createElement("span"); - if (obj instanceof Error) { - const errorEl = document.createElement("span"); - errorEl.className = "console-error"; - errorEl.textContent = `${obj.name}: ${obj.message}`; - if (obj.stack) - errorEl.textContent += `\n${obj.stack.split("\n").slice(1).join("\n")}`; - container.appendChild(errorEl); - return container; - } - - const preview = document.createElement("span"); - preview.className = "console-object"; - preview.textContent = Array.isArray(obj) ? `Array(${obj.length})` : "{...}"; - const content = document.createElement("div"); - content.className = "console-object-content"; - - Object.entries(obj).forEach(([key, value]) => { - const prop = document.createElement("div"); - prop.textContent = `${key}: `; - prop.appendChild(renderObject(value, level + 1, visited)); - content.appendChild(prop); - }); - - preview.addEventListener("click", (e) => { - e.stopPropagation(); - preview.classList.toggle("expanded"); - }); - - container.appendChild(preview); - container.appendChild(content); - return container; -} - -// Toggle auto-run -function toggleAutoRun(): void { - isAutoRun = !isAutoRun; - setAutoRun(isAutoRun); - localStorage.setItem("autoRun", String(isAutoRun)); - updateAutoRunStatus(); - - Object.values(editors).forEach((editor) => { - const listener = isAutoRun - ? EditorView.updateListener.of((update) => { - if (update.docChanged) { - debounce(runCode, 1000)(); - } - }) - : []; - editor.view.dispatch({ - effects: editor.autoRunCompartment.reconfigure(listener), - }); - }); -} - -function updateAutoRunStatus(): void { - const statusEl = document.getElementById("auto-run-status"); - if (statusEl) { - statusEl.textContent = isAutoRun ? "On" : "Off"; - } -} - -// Toggle dark mode -function toggleDarkMode(): void { - isDarkMode = !isDarkMode; - setDarkMode(isDarkMode); - document.body.classList.toggle("dark-mode"); - localStorage.setItem("darkMode", String(isDarkMode)); - updateThemeIcon(); -} - -// Export editors' content as ZIP -async function exportAsZip() { - const html = editors.html.view.state.doc.toString().trim(); - const css = editors.css.view.state.doc.toString().trim(); - const js = editors.js.view.state.doc.toString().trim(); - - const files: { name: string; content: string }[] = []; - if (html) files.push({ name: "index.html", content: html }); - if (css) files.push({ name: "styles.css", content: css }); - if (js) files.push({ name: "script.js", content: js }); - - if (files.length === 0) { - alert("Nothing to export!"); - return; - } - - if (files.length === 1) { - const blob = new Blob([files[0].content], { type: "text/plain" }); - saveAs(blob, files[0].name); - return; - } - - const zip = new JSZip(); - for (const file of files) { - zip.file(file.name, file.content); - } - - const content = await zip.generateAsync({ type: "blob" }); - saveAs(content, "htmlrunner-export.zip"); -} - - -// Copy console content -function copyAllConsole(): void { - const entries = Array.from(consoleOutput.children); - const text = entries - .map((entry) => { - const timestamp = entry.querySelector(".timestamp")?.textContent || ""; - const message = Array.from( - entry.querySelectorAll( - ".console-log, .console-error, .console-warn, .console-info" - ) - ) - .map((el) => el.textContent) - .join(""); - return `${timestamp} ${message}`; - }) - .join("\n"); - copyToClipboard(text); -} - -// Copy editor content -function copyEditorContent(editor: string): void { - const content = editors[editor].view.state.doc.toString(); - copyToClipboard(content); -} - -// Initialize copy buttons -function initializeCopyButtons(): void { - ["html", "css", "js"].forEach((editorType) => { - const container = document.getElementById(`${editorType}-editor-container`); - if (container) { - const copyBtn = document.createElement("button"); - copyBtn.className = "copy-btn"; - copyBtn.innerHTML = ''; - copyBtn.addEventListener("click", () => { - copyEditorContent(editorType); - copyBtn.innerHTML = ''; - setTimeout(() => { - copyBtn.innerHTML = ''; - }, 2000); - }); - container.appendChild(copyBtn); - } - }); - - const consoleTab = document.querySelector( - '.output-tabs .tab[data-output="console"]' - ); - if (consoleTab) { - const copyAllBtn = document.createElement("button"); - copyAllBtn.className = "copy-btn"; - copyAllBtn.style.position = "static"; - copyAllBtn.style.marginLeft = "auto"; - copyAllBtn.style.opacity = "1"; - copyAllBtn.innerHTML = ' Copy All'; - copyAllBtn.addEventListener("click", () => { - copyAllConsole(); - copyAllBtn.innerHTML = ' Copied!'; - setTimeout(() => { - copyAllBtn.innerHTML = ' Copy All'; - }, 2000); - }); - consoleTab.parentElement?.appendChild(copyAllBtn); - } -} - -// Log filter state -let activeFilters = new Set(["log", "error", "warn", "info"]); - -function toggleLogFilter(type: "log" | "error" | "warn" | "info"): void { - const button = document.querySelector(`.filter-toggle.${type}`); - if (button) { - const isActive = button.classList.contains("active"); - if (isActive) { - activeFilters.delete(type); - button.classList.remove("active"); - } else { - activeFilters.add(type); - button.classList.add("active"); - } - localStorage.setItem( - "logFilters", - JSON.stringify(Array.from(activeFilters)) - ); - applyLogFilters(); - } -} - -function applyLogFilters(): void { - document.querySelectorAll(".console-entry").forEach((entry) => { - const messageElement = entry.querySelector( - ".console-log, .console-error, .console-warn, .console-info" - ); - if (messageElement) { - const logType = Array.from(messageElement.classList) - .find((cls) => cls.startsWith("console-")) - ?.replace("console-", ""); - if (logType && !activeFilters.has(logType)) { - entry.className = "console-entry filtered"; - } else { - entry.className = "console-entry"; - } - } - }); -} - -function initializeLogFilters(): void { - try { - const savedFilters = localStorage.getItem("logFilters"); - if (savedFilters) { - activeFilters = new Set(JSON.parse(savedFilters)); - } - } catch (e) { - console.error("Failed to load log filters:", e); - } - - const consoleTab = document.querySelector(".output-tabs"); - if (consoleTab) { - const filtersDiv = document.createElement("div"); - filtersDiv.className = "console-filters"; - - ["log", "error", "warn", "info"].forEach((type) => { - const button = document.createElement("button"); - button.className = `filter-toggle ${type} ${activeFilters.has(type) ? "active" : ""}`; - button.innerHTML = `${type.charAt(0).toUpperCase() + type.slice(1)}`; - button.onclick = () => toggleLogFilter(type as any); - filtersDiv.appendChild(button); - }); - - consoleTab.insertBefore(filtersDiv, consoleTab.lastElementChild); - } -} - -// Search toggle function -export function toggleSearch(mode: "find" | "replace" = "find"): void { - const editor = editors[currentTab].view; - if (editor) { - const isOpen = searchPanelOpen(editor.state); - if (isOpen) { - closeSearchPanel(editor); - } else { - openSearchPanel(editor); - } - } -} - -function debounce any>( - func: T, - wait: number -): (...args: Parameters) => void { - let timeout: number | undefined; - return function (this: any, ...args: Parameters): void { - if (timeout) window.clearTimeout(timeout); - timeout = window.setTimeout(() => func.apply(this, args), wait); - }; -} - -// Expose functions to window object -Object.assign(window, { - runCode, - clearConsole, - resetCode, - formatCode, - toggleAutoRun, - toggleDarkMode, - switchTab, - switchOutput, - exportAsZip, - copyAllConsole, - copyEditorContent, - toggleSearch, -}); - -// Initialize -document.addEventListener("DOMContentLoaded", async () => { - initializeEditors(); - initializeCopyButtons(); - initializeSplit(); - updateAutoRunStatus(); - initializeLogFilters(); - addGlobalSearchShortcuts(); - - const editorTabs = document.querySelector(".editor-tabs"); - if (editorTabs) { - initializeSearchControls(editorTabs); - } - - // Apply dark mode to page and editors on load - if (isDarkMode) { - setPageDarkMode(true); - } - - loadState(); - formatCode().catch((error) => { - showError(`Error formatting code: ${error.message}`); - }); -}); \ No newline at end of file diff --git a/Build/Build/src/runner.ts b/Build/Build/src/runner.ts deleted file mode 100644 index 24cebc1..0000000 --- a/Build/Build/src/runner.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { editors } from "./editor"; -import { consoleInterceptor } from "./console"; -import { showError, showLoading, hideLoading, switchOutput } from "./ui"; -import { clearConsole, logConsoleError } from "./console"; -import { saveState } from "./state"; -import * as prettier from "prettier/standalone"; -import * as parserHtml from "prettier/plugins/html"; -import * as parserCss from "prettier/plugins/postcss"; -import * as parserBabel from "prettier/plugins/babel"; // Use Babel instead of Flow -import * as prettierPluginEstree from "prettier/plugins/estree"; - -export function runCode(): void { - showLoading(); - clearConsole(); - try { - const html = editors.html.view.state.doc.toString(); - const css = editors.css.view.state.doc.toString(); - const js = editors.js.view.state.doc.toString(); - - // Pre-parse JS - try { - if (js.trim()) new Function(js); - } catch (syntaxError: any) { - logConsoleError(`SyntaxError: ${syntaxError.message}`); - hideLoading(); - return; - } - - let docContent; - const isFullHtml = /]|', - "", - " -

Hello, HTMLRunner!

-

This is a demo page.

- - - -``` - -**CSS:** -```css -body { - font-family: Arial, sans-serif; - margin: 20px; - line-height: 1.6; -} -button { - background: #2196f3; - color: white; - border: none; - padding: 10px 15px; - border-radius: 4px; - cursor: pointer; - font-size: 16px; -} -button:hover { - background: #1976d2; -} -``` - -**JavaScript:** -```javascript -function testFunction() { - console.log('Button clicked!'); - console.warn('This is a warning'); - console.error('This is an error'); - console.info('This is an info'); - console.log('Object:', { name: 'Alice', age: 25, hobbies: ['coding', 'reading'] }); -} - -``` - -## Dependencies - -- **Code Editor:** CodeMirror 5 -- **Code Formatting:** Prettier -- **UI Layout:** Split.js for resizable panels -- **Webpack:** for compacting the code - -## 🔧 Development - -### Prerequisites -- Node.js (v18 or higher) -- npm or yarn - -### Local Installation and/or Development Setup -(this is if you want to install locally but not use the single file version, or if you want to contribute.) - -1. **Clone the repository** - ```bash - git clone https://github.com/NellowTCS/HTMLRunner.git - cd HTMLRunner/Build - ``` - -2. **Build** - ``` - ./build.sh - ``` - or (if you also want to build the single file version) - ``` - ./build-all.sh - ``` -3. **Or Build and auto serve locally** - ```bash - npm start - ``` - -### Contributing -1. Fork the repository -2. Create a feature branch (`git checkout -b feature/AmazingFeature`) -3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) -4. Push to the branch (`git push origin feature/AmazingFeature`) -5. Open a Pull Request - -## Browser Support - -HTMLRunner works on all modern browsers: -- ✅ Chrome 80+ -- ✅ Firefox 75+ -- ✅ Safari 13+ -- ✅ Edge 80+ - -## Future Features - -- [ ] **File System Integration** - Save/Load projects from Folders or IndexedDB -- [ ] **Multiple Projects/Files** -- [ ] **Importing Files** -- [ ] **Collaboration Features** - Share code with others -- [ ] **Plugin System** - Extend functionality -- [ ] **More Language Support** - TypeScript, WASM, etc. -- [ ] **Version Control** - Built-in Git integration? -- [ ] **Template Library** - Pre-built code snippets -- [ ] **Performance Profiler** - Analyze code performance -- [ ] **Auto Completion** (using the built in CodeMirror tools) -- [ ] **Code Folding** -- [ ] **Clickable Stack Traces** - -## License - -This project is licensed under the GNU GPL v3.0 License - see the [LICENSE](LICENSE) file for details. - -## Contributing - -Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change. - ---- - -**⭐ If you find HTMLRunner useful, please consider giving it a star on GitHub!** - -For questions, suggestions, or issues, please [open an issue](https://github.com/NellowTCS/HTMLRunner/issues) on GitHub. From ad0bcace98100cbd2909a1fc070ead10ac8ca990 Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Thu, 11 Sep 2025 20:01:52 -0600 Subject: [PATCH 09/20] Delete Build/LICENSE --- Build/LICENSE | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 Build/LICENSE diff --git a/Build/LICENSE b/Build/LICENSE deleted file mode 100644 index 4ee379b..0000000 --- a/Build/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 NellowTCS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. From e02a2f68e9ae75d28a0f2a88143fd472da2630cd Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Thu, 11 Sep 2025 20:02:19 -0600 Subject: [PATCH 10/20] HTMLRunner was accidentally copied into this,removing --- Build/styles.css | 559 ----------------------------------------------- 1 file changed, 559 deletions(-) delete mode 100644 Build/styles.css diff --git a/Build/styles.css b/Build/styles.css deleted file mode 100644 index 716d825..0000000 --- a/Build/styles.css +++ /dev/null @@ -1,559 +0,0 @@ -body { - font-family: Arial, sans-serif; - background-color: #f5f5f5; - height: 100vh; - overflow: hidden; - margin: 0; - padding: 0; -} -.container { - display: flex; - flex-direction: column; - height: 100vh; - background: #f5f5f5; -} -.header { - background: linear-gradient(90deg, #2196F3, #21CBF3); - padding: 12px 20px; - display: flex; - align-items: center; - justify-content: space-between; - color: white; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); -} -.logo { - font-size: 20px; - font-weight: bold; - background: linear-gradient(135deg, #181d21 0%, #1b2e35 100%); - -webkit-background-clip: text; - background-clip: text; - -webkit-text-fill-color: transparent; -} -.controls { - display: flex; - gap: 10px; - align-items: center; -} -.btn { - padding: 8px 16px; - border: none; - border-radius: 4px; - cursor: pointer; - font-weight: 500; - transition: background-color 0.2s, transform 0.1s; - font-size: 14px; - display: flex; - align-items: center; - gap: 6px; -} -.btn:active { - transform: translateY(1px); -} -.btn-run { - background-color: #2196F3; - color: white; -} -.btn-clear { - background-color: #f44336; - color: white; -} -.btn-reset { - background-color: #607D8B; - color: white; -} -.btn-format { - background-color: #4CAF50; - color: white; -} -.btn-auto-run { - background-color: #FF9800; - color: white; -} -.btn-download { - background-color: #1c29d9; - color: white; -} -.btn:hover { - opacity: 0.9; -} -.main { - flex: 1; - display: flex; - overflow: hidden; - background-color: white; - margin: 10px; - border-radius: 4px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - position: relative; -} -.editor-panel, .output-panel { - display: flex; - flex-direction: column; - background: white; - min-width: 0; /* Important for flexbox and Split.js */ -} -.editor-tabs, .output-tabs { - display: flex; - background: #f5f5f5; - border-bottom: 1px solid #e0e0e0; -} -.tab { - padding: 10px 20px; - cursor: pointer; - color: #757575; - border-right: 1px solid #e0e0e0; - transition: all 0.2s; -} -.tab.active { - color: #2196F3; - background: white; - font-weight: 500; -} -.editor-container { - flex: 1; - position: relative; - overflow: hidden; - display: none; -} -.editor-container:not([style*="display: none"]) { - display: block; -} -.CodeMirror { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - height: 100%; - width: 100%; - font-family: 'Fira Code', monospace; - font-size: 14px; - line-height: 1.5; -} -.output-content { - flex: 1; - position: relative; - overflow: hidden; - display: flex; - flex-direction: column; -} -.preview, .console { - flex: 1; - display: none; - height: 100%; -} -.preview.active, .console.active { - display: block; -} -.console { - height: 100%; - padding: 15px; - font-family: 'Courier New', monospace; - font-size: 13px; - overflow-y: auto; - background: white; - color: #212121; - display: none; -} -.console.active { - display: block; -} -.console-entry { - margin-bottom: 16px; - margin-top: 12px; - padding: 0; - position: relative; -} - -.console-log { - color: #212121; - padding: 6px 12px; - margin: 6px 0; - line-height: 2.8; -} - -.console-error { - color: #d32f2f; - background: #ffebee; - padding: 8px 14px; - margin: 8px 18px; - border-radius: 8px; - border-left: 3px solid #d32f2f; - line-height: 2.8; - word-break: break-word; -} - -.console-warn { - color: #f57c00; - background: #fff3e0; - padding: 8px 14px; - margin: 8px 18px; - border-radius: 8px; - border-left: 3px solid #ff9800; - line-height: 2.8; - word-break: break-word; -} - -.console-info { - color: #0288d1; - background: rgba(2, 136, 209, 0.1); - padding: 8px 14px; - margin: 8px 18px; - border-radius: 8px; - border-left: 3px solid #0288d1; - line-height: 2.8; - word-break: break-word; -} -.console-stack { - cursor: pointer; - color: #757575; - font-size: 11px; - display: none; - margin-top: 8px; - padding: 8px; - background: rgba(0, 0, 0, 0.05); - border-radius: 4px; -} -.console-stack.expanded { display: block; } -.timestamp { color: #757575; font-size: 11px; margin-right: 8px; } -.loading { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(255, 255, 255, 0.8); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; - opacity: 0; - pointer-events: none; - transition: opacity 0.3s; -} -.loading.active { - opacity: 1; - pointer-events: all; -} -.spinner { - border: 4px solid rgba(33, 150, 243, 0.2); - border-radius: 50%; - border-top: 4px solid #2196F3; - width: 40px; - height: 40px; - animation: spin 1s linear infinite; -} -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} -.console-object { cursor: pointer; color: #795548; font-style: italic; } -.console-object:before { content: '▶ '; font-size: 10px; display: inline-block; transition: transform 0.2s; } -.console-object.expanded:before { transform: rotate(90deg); } -.console-object-content { display: none; margin-left: 20px; border-left: 1px solid #e0e0e0; padding-left: 10px; } -.console-object.expanded+.console-object-content { display: block; } -.error-message { - background: #ffebee; - color: #d32f2f; - padding: 10px; - margin: 10px; - border-radius: 4px; - border-left: 4px solid #d32f2f; - display: none; -} -/* Dark mode styles */ -body.dark-mode { background-color: #1a1a1a; color: #e0e0e0; } -.dark-mode .header { background: linear-gradient(135deg, #181d21 0%, #1b2e35 100%); } -.dark-mode .logo { background: linear-gradient(135deg, #64b5f6, #80d8ff); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; } -.dark-mode .container { background: #1a1a1a; } -.dark-mode .main, .dark-mode .editor-panel, .dark-mode .output-panel, .dark-mode .console { background-color: #2d2d2d; color: #e0e0e0; } -.dark-mode .CodeMirror { background: #1e1e1e; color: #e0e0e0; } -.dark-mode .editor-tabs, .dark-mode .output-tabs { background: #333; border-bottom-color: #444; } -.dark-mode .tab { color: #aaa; border-right-color: #444; } -.dark-mode .tab.active { background: linear-gradient(135deg, #1e262c 0%, #23363e 100%); color: #fff; } -.dark-mode .console-error { background: #3e2723; border-left-color: #d32f2f; } -.dark-mode .console-warn { background: #3e2c00; border-left-color: #ff9800; } -.dark-mode .console-info { color: #4fc3f7; } -.dark-mode .console-log { color: #e0e0e0; } -.dark-mode .console-object { color: #9cdcfe; } -.dark-mode .console-object-content { border-left-color: #444; } -.dark-mode .timestamp { color: #888; } -.dark-mode .console-stack { color: #888; } -.theme-toggle { - background: none; - border: 2px solid #1A5E97; - color: #1A5E97; - padding: 6px 12px; - border-radius: 20px; - cursor: pointer; - display: flex; - align-items: center; - gap: 6px; -} -.dark-mode .theme-toggle { border-color: #64b5f6; color: #64b5f6; } -.theme-toggle:hover { background: rgba(33, 150, 243, 0.1); } -.dark-mode .theme-toggle:hover { background: rgba(100, 181, 246, 0.1); } -/* Split.js gutter */ -.gutter { - background-color: #eee; - background-repeat: no-repeat; - background-position: 50%; - transition: background-color 0.2s; -} -.gutter:hover { - background-color: #ddd; -} -.gutter.gutter-horizontal { - cursor: col-resize; - width: 10px !important; -} -.gutter.gutter-vertical { - cursor: row-resize; - height: 10px !important; -} -.dark-mode .gutter { - background-color: #333; -} -.dark-mode .gutter:hover { - background-color: #444; -} -.copy-btn { - position: absolute; - right: 8px; - top: 8px; - padding: 4px 8px; - background: rgba(255, 255, 255, 0.9); - border: 1px solid #e0e0e0; - border-radius: 4px; - cursor: pointer; - font-size: 12px; - display: flex; - align-items: center; - gap: 4px; - opacity: 0; - transition: opacity 0.2s; -} - -.copy-btn:hover { - background: rgba(255, 255, 255, 1); -} - -.console-entry:hover .copy-btn, -.editor-container:hover .copy-btn { - opacity: 1; -} - -.copy-btn i { - font-size: 12px; -} - -.dark-mode .copy-btn { - background: rgba(40, 40, 40, 0.9); - border-color: #444; - color: #e0e0e0; -} - -.dark-mode .copy-btn:hover { - background: rgba(40, 40, 40, 1); -} -.console-filters { - display: flex; - gap: 8px; - margin-left: auto; - margin-right: 8px; -} - -.filter-toggle { - background: #fce5e5; - border: 1px solid #e0e0e0; - border-radius: 4px; - padding: 4px 8px; - cursor: pointer; - font-size: 12px; - display: flex; - align-items: center; - gap: 4px; - transition: all 0.2s; - font-weight: normal; -} - -.filter-toggle.active { - background: rgb(235, 251, 231); - border-width: 2px; - font-weight: bold; - box-shadow: 0 1px 3px rgba(0,0,0,0.1); -} - -.filter-toggle:hover { - background: white; -} - -.filter-toggle.log { - color: #212121; -} - -.filter-toggle.error { - color: #d32f2f; -} - -.filter-toggle.warn { - color: #f57c00; -} - -.filter-toggle.info { - color: #0288d1; -} - -.console-entry.filtered { - display: none; -} - -.dark-mode .filter-toggle { - background:rgb(66, 51, 51); - border-color: #444; -} - -.dark-mode .filter-toggle.active { - background: rgb(51, 65, 49); - box-shadow: 0 1px 3px rgba(0,0,0,0.3); -} - -.dark-mode .filter-toggle:hover { - background: #1e1e1e; -} - -.dark-mode .filter-toggle.log { - color: #e0e0e0; -} - -.dark-mode .filter-toggle.error { - color: #f48771; -} - -.dark-mode .filter-toggle.warn { - color: #dcdcaa; -} - -.dark-mode .filter-toggle.info { - color: #4fc3f7; -} -/* Search/Replace button styles */ -.search-controls { - margin-left: auto; - display: flex; - align-items: center; - gap: 4px; - margin-right: 8px; -} - -.search-btn, .replace-btn { - background: none; - border: none; - padding: 8px 12px; - cursor: pointer; - color: #757575; - transition: all 0.2s; - font-size: 14px; - display: flex; - align-items: center; - gap: 4px; -} - -.search-btn:hover, .replace-btn:hover { - color: #2196F3; - background: rgba(33, 150, 243, 0.1); - border-radius: 4px; -} - -.search-btn i, .replace-btn i { - font-size: 14px; -} - -.dark-mode .search-btn, .dark-mode .replace-btn { - color: #aaa; -} - -.dark-mode .search-btn:hover, .dark-mode .replace-btn:hover { - color: #64b5f6; - background: rgba(100, 181, 246, 0.1); -} - -/* CodeMirror dialog styles */ -.CodeMirror-dialog { - position: absolute; - left: 0; right: 0; - top: -100%; - z-index: 15; - padding: 8px 12px; - background: var(--background-color, #f5f5f5); - border-bottom: 1px solid var(--border-color, #e0e0e0); - display: flex; - gap: 8px; - align-items: center; - color: var(--text-color, #333); - transition: top 0.2s ease-out, opacity 0.2s ease-out; - opacity: 0; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); -} - -.CodeMirror-dialog.visible { - top: 0; - opacity: 1; -} - -.CodeMirror-dialog input { - border: 1px solid var(--border-color, #ddd); - background: var(--input-background, #fff); - color: var(--text-color, #333); - padding: 6px 8px; - border-radius: 4px; - font-size: 14px; - flex: 1; - min-width: 200px; -} - -.CodeMirror-dialog button { - background: var(--button-background, #f0f0f0); - border: 1px solid var(--border-color, #ddd); - color: var(--text-color, #333); - padding: 4px 8px; - border-radius: 4px; - cursor: pointer; - font-size: 14px; -} - -.CodeMirror-dialog button:hover { - background: var(--button-hover-background, #e0e0e0); -} - -/* Search match highlighting */ -.CodeMirror-search-match { - background: rgba(255, 215, 0, 0.3); - border: 1px solid rgba(255, 215, 0, 0.5); -} - -/* Dark theme modifications */ -.dark-mode .CodeMirror-dialog { - --background-color: #1e1e1e; - --border-color: #444; - --text-color: #e0e0e0; - --input-background: #2d2d2d; - --button-background: #2d2d2d; - --button-hover-background: #3d3d3d; -} - -.dark-mode .CodeMirror-search-match { - background: rgba(255, 198, 0, 0.2); - border: 1px solid rgba(255, 198, 0, 0.4); -} -@media (max-width: 768px) { - .main { flex-direction: column; } - .editor-panel, .output-panel { height: 50%; } - .editor-tabs, .output-tabs { overflow-x: auto; white-space: nowrap; } - .tab { padding: 10px 15px; font-size: 0.9em; } -} -@media (max-width: 480px) { - .controls { flex-wrap: wrap; justify-content: flex-end; } - .btn { padding: 6px 10px; font-size: 0.8em; } - .logo { font-size: 1em; } -} From 593d621045cd9054f2a82d37fb13680d3954070e Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Thu, 11 Sep 2025 20:02:53 -0600 Subject: [PATCH 11/20] HTMLRunner was accidentally copied into this,removing --- Build/service-worker.js | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 Build/service-worker.js diff --git a/Build/service-worker.js b/Build/service-worker.js deleted file mode 100644 index c668a30..0000000 --- a/Build/service-worker.js +++ /dev/null @@ -1,15 +0,0 @@ -self.addEventListener("install", (event) => { - event.waitUntil( - caches.open("v1").then((cache) => { - return cache.addAll(["/HTMLRunner", "/HTMLRunner/index.html"]); - }) - ); -}); - -self.addEventListener("fetch", (event) => { - event.respondWith( - caches.match(event.request).then((response) => { - return response || fetch(event.request); - }) - ); -}); From 8a894d1c496a4f3f19a9944575b29f8d01b01311 Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Thu, 11 Sep 2025 20:03:09 -0600 Subject: [PATCH 12/20] HTMLRunner was accidentally copied into this,removing --- Build/manifest.json | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 Build/manifest.json diff --git a/Build/manifest.json b/Build/manifest.json deleted file mode 100644 index 887de1d..0000000 --- a/Build/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "HTMLRunner", - "short_name": "HTMLRunner", - "start_url": "/HTMLRunner/", - "display": "standalone", - "background_color": "#f5f5f5", - "theme_color": "#2196F3", - "icons": [ - { - "src": "/HTMLRunner/favicon.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/HTMLRunner/favicon.png", - "sizes": "512x512", - "type": "image/png" - } - ] -} From d432edd4fc8408b174c1130bcc055e9bb97acb1b Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Thu, 11 Sep 2025 20:03:27 -0600 Subject: [PATCH 13/20] HTMLRunner was accidentally copied into this,removing --- Build/main.js | 34940 ------------------------------------------------ 1 file changed, 34940 deletions(-) delete mode 100644 Build/main.js diff --git a/Build/main.js b/Build/main.js deleted file mode 100644 index 32c06ef..0000000 --- a/Build/main.js +++ /dev/null @@ -1,34940 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/@babel/runtime/helpers/esm/extends.js": -/*!************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/extends.js ***! - \************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _extends) -/* harmony export */ }); -function _extends() { - return _extends = Object.assign ? Object.assign.bind() : function (n) { - for (var e = 1; e < arguments.length; e++) { - var t = arguments[e]; - for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); - } - return n; - }, _extends.apply(null, arguments); -} - - -/***/ }), - -/***/ "./node_modules/@codemirror/autocomplete/dist/index.js": -/*!*************************************************************!*\ - !*** ./node_modules/@codemirror/autocomplete/dist/index.js ***! - \*************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ CompletionContext: () => (/* binding */ CompletionContext), -/* harmony export */ acceptCompletion: () => (/* binding */ acceptCompletion), -/* harmony export */ autocompletion: () => (/* binding */ autocompletion), -/* harmony export */ clearSnippet: () => (/* binding */ clearSnippet), -/* harmony export */ closeBrackets: () => (/* binding */ closeBrackets), -/* harmony export */ closeBracketsKeymap: () => (/* binding */ closeBracketsKeymap), -/* harmony export */ closeCompletion: () => (/* binding */ closeCompletion), -/* harmony export */ completeAnyWord: () => (/* binding */ completeAnyWord), -/* harmony export */ completeFromList: () => (/* binding */ completeFromList), -/* harmony export */ completionKeymap: () => (/* binding */ completionKeymap), -/* harmony export */ completionStatus: () => (/* binding */ completionStatus), -/* harmony export */ currentCompletions: () => (/* binding */ currentCompletions), -/* harmony export */ deleteBracketPair: () => (/* binding */ deleteBracketPair), -/* harmony export */ hasNextSnippetField: () => (/* binding */ hasNextSnippetField), -/* harmony export */ hasPrevSnippetField: () => (/* binding */ hasPrevSnippetField), -/* harmony export */ ifIn: () => (/* binding */ ifIn), -/* harmony export */ ifNotIn: () => (/* binding */ ifNotIn), -/* harmony export */ insertBracket: () => (/* binding */ insertBracket), -/* harmony export */ insertCompletionText: () => (/* binding */ insertCompletionText), -/* harmony export */ moveCompletionSelection: () => (/* binding */ moveCompletionSelection), -/* harmony export */ nextSnippetField: () => (/* binding */ nextSnippetField), -/* harmony export */ pickedCompletion: () => (/* binding */ pickedCompletion), -/* harmony export */ prevSnippetField: () => (/* binding */ prevSnippetField), -/* harmony export */ selectedCompletion: () => (/* binding */ selectedCompletion), -/* harmony export */ selectedCompletionIndex: () => (/* binding */ selectedCompletionIndex), -/* harmony export */ setSelectedCompletion: () => (/* binding */ setSelectedCompletion), -/* harmony export */ snippet: () => (/* binding */ snippet), -/* harmony export */ snippetCompletion: () => (/* binding */ snippetCompletion), -/* harmony export */ snippetKeymap: () => (/* binding */ snippetKeymap), -/* harmony export */ startCompletion: () => (/* binding */ startCompletion) -/* harmony export */ }); -/* harmony import */ var _codemirror_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @codemirror/state */ "./node_modules/@codemirror/state/dist/index.js"); -/* harmony import */ var _codemirror_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @codemirror/view */ "./node_modules/@codemirror/view/dist/index.js"); -/* harmony import */ var _codemirror_language__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @codemirror/language */ "./node_modules/@codemirror/language/dist/index.js"); - - - - -/** -An instance of this is passed to completion source functions. -*/ -class CompletionContext { - /** - Create a new completion context. (Mostly useful for testing - completion sources—in the editor, the extension will create - these for you.) - */ - constructor( - /** - The editor state that the completion happens in. - */ - state, - /** - The position at which the completion is happening. - */ - pos, - /** - Indicates whether completion was activated explicitly, or - implicitly by typing. The usual way to respond to this is to - only return completions when either there is part of a - completable entity before the cursor, or `explicit` is true. - */ - explicit, - /** - The editor view. May be undefined if the context was created - in a situation where there is no such view available, such as - in synchronous updates via - [`CompletionResult.update`](https://codemirror.net/6/docs/ref/#autocomplete.CompletionResult.update) - or when called by test code. - */ - view) { - this.state = state; - this.pos = pos; - this.explicit = explicit; - this.view = view; - /** - @internal - */ - this.abortListeners = []; - /** - @internal - */ - this.abortOnDocChange = false; - } - /** - Get the extent, content, and (if there is a token) type of the - token before `this.pos`. - */ - tokenBefore(types) { - let token = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.syntaxTree)(this.state).resolveInner(this.pos, -1); - while (token && types.indexOf(token.name) < 0) - token = token.parent; - return token ? { from: token.from, to: this.pos, - text: this.state.sliceDoc(token.from, this.pos), - type: token.type } : null; - } - /** - Get the match of the given expression directly before the - cursor. - */ - matchBefore(expr) { - let line = this.state.doc.lineAt(this.pos); - let start = Math.max(line.from, this.pos - 250); - let str = line.text.slice(start - line.from, this.pos - line.from); - let found = str.search(ensureAnchor(expr, false)); - return found < 0 ? null : { from: start + found, to: this.pos, text: str.slice(found) }; - } - /** - Yields true when the query has been aborted. Can be useful in - asynchronous queries to avoid doing work that will be ignored. - */ - get aborted() { return this.abortListeners == null; } - /** - Allows you to register abort handlers, which will be called when - the query is - [aborted](https://codemirror.net/6/docs/ref/#autocomplete.CompletionContext.aborted). - - By default, running queries will not be aborted for regular - typing or backspacing, on the assumption that they are likely to - return a result with a - [`validFor`](https://codemirror.net/6/docs/ref/#autocomplete.CompletionResult.validFor) field that - allows the result to be used after all. Passing `onDocChange: - true` will cause this query to be aborted for any document - change. - */ - addEventListener(type, listener, options) { - if (type == "abort" && this.abortListeners) { - this.abortListeners.push(listener); - if (options && options.onDocChange) - this.abortOnDocChange = true; - } - } -} -function toSet(chars) { - let flat = Object.keys(chars).join(""); - let words = /\w/.test(flat); - if (words) - flat = flat.replace(/\w/g, ""); - return `[${words ? "\\w" : ""}${flat.replace(/[^\w\s]/g, "\\$&")}]`; -} -function prefixMatch(options) { - let first = Object.create(null), rest = Object.create(null); - for (let { label } of options) { - first[label[0]] = true; - for (let i = 1; i < label.length; i++) - rest[label[i]] = true; - } - let source = toSet(first) + toSet(rest) + "*$"; - return [new RegExp("^" + source), new RegExp(source)]; -} -/** -Given a a fixed array of options, return an autocompleter that -completes them. -*/ -function completeFromList(list) { - let options = list.map(o => typeof o == "string" ? { label: o } : o); - let [validFor, match] = options.every(o => /^\w+$/.test(o.label)) ? [/\w*$/, /\w+$/] : prefixMatch(options); - return (context) => { - let token = context.matchBefore(match); - return token || context.explicit ? { from: token ? token.from : context.pos, options, validFor } : null; - }; -} -/** -Wrap the given completion source so that it will only fire when the -cursor is in a syntax node with one of the given names. -*/ -function ifIn(nodes, source) { - return (context) => { - for (let pos = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.syntaxTree)(context.state).resolveInner(context.pos, -1); pos; pos = pos.parent) { - if (nodes.indexOf(pos.name) > -1) - return source(context); - if (pos.type.isTop) - break; - } - return null; - }; -} -/** -Wrap the given completion source so that it will not fire when the -cursor is in a syntax node with one of the given names. -*/ -function ifNotIn(nodes, source) { - return (context) => { - for (let pos = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.syntaxTree)(context.state).resolveInner(context.pos, -1); pos; pos = pos.parent) { - if (nodes.indexOf(pos.name) > -1) - return null; - if (pos.type.isTop) - break; - } - return source(context); - }; -} -class Option { - constructor(completion, source, match, score) { - this.completion = completion; - this.source = source; - this.match = match; - this.score = score; - } -} -function cur(state) { return state.selection.main.from; } -// Make sure the given regexp has a $ at its end and, if `start` is -// true, a ^ at its start. -function ensureAnchor(expr, start) { - var _a; - let { source } = expr; - let addStart = start && source[0] != "^", addEnd = source[source.length - 1] != "$"; - if (!addStart && !addEnd) - return expr; - return new RegExp(`${addStart ? "^" : ""}(?:${source})${addEnd ? "$" : ""}`, (_a = expr.flags) !== null && _a !== void 0 ? _a : (expr.ignoreCase ? "i" : "")); -} -/** -This annotation is added to transactions that are produced by -picking a completion. -*/ -const pickedCompletion = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Annotation.define(); -/** -Helper function that returns a transaction spec which inserts a -completion's text in the main selection range, and any other -selection range that has the same text in front of it. -*/ -function insertCompletionText(state, text, from, to) { - let { main } = state.selection, fromOff = from - main.from, toOff = to - main.from; - return Object.assign(Object.assign({}, state.changeByRange(range => { - if (range != main && from != to && - state.sliceDoc(range.from + fromOff, range.from + toOff) != state.sliceDoc(from, to)) - return { range }; - let lines = state.toText(text); - return { - changes: { from: range.from + fromOff, to: to == main.from ? range.to : range.from + toOff, insert: lines }, - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.from + fromOff + lines.length) - }; - })), { scrollIntoView: true, userEvent: "input.complete" }); -} -const SourceCache = /*@__PURE__*/new WeakMap(); -function asSource(source) { - if (!Array.isArray(source)) - return source; - let known = SourceCache.get(source); - if (!known) - SourceCache.set(source, known = completeFromList(source)); - return known; -} -const startCompletionEffect = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define(); -const closeCompletionEffect = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define(); - -// A pattern matcher for fuzzy completion matching. Create an instance -// once for a pattern, and then use that to match any number of -// completions. -class FuzzyMatcher { - constructor(pattern) { - this.pattern = pattern; - this.chars = []; - this.folded = []; - // Buffers reused by calls to `match` to track matched character - // positions. - this.any = []; - this.precise = []; - this.byWord = []; - this.score = 0; - this.matched = []; - for (let p = 0; p < pattern.length;) { - let char = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(pattern, p), size = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)(char); - this.chars.push(char); - let part = pattern.slice(p, p + size), upper = part.toUpperCase(); - this.folded.push((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(upper == part ? part.toLowerCase() : upper, 0)); - p += size; - } - this.astral = pattern.length != this.chars.length; - } - ret(score, matched) { - this.score = score; - this.matched = matched; - return this; - } - // Matches a given word (completion) against the pattern (input). - // Will return a boolean indicating whether there was a match and, - // on success, set `this.score` to the score, `this.matched` to an - // array of `from, to` pairs indicating the matched parts of `word`. - // - // The score is a number that is more negative the worse the match - // is. See `Penalty` above. - match(word) { - if (this.pattern.length == 0) - return this.ret(-100 /* Penalty.NotFull */, []); - if (word.length < this.pattern.length) - return null; - let { chars, folded, any, precise, byWord } = this; - // For single-character queries, only match when they occur right - // at the start - if (chars.length == 1) { - let first = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(word, 0), firstSize = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)(first); - let score = firstSize == word.length ? 0 : -100 /* Penalty.NotFull */; - if (first == chars[0]) ; - else if (first == folded[0]) - score += -200 /* Penalty.CaseFold */; - else - return null; - return this.ret(score, [0, firstSize]); - } - let direct = word.indexOf(this.pattern); - if (direct == 0) - return this.ret(word.length == this.pattern.length ? 0 : -100 /* Penalty.NotFull */, [0, this.pattern.length]); - let len = chars.length, anyTo = 0; - if (direct < 0) { - for (let i = 0, e = Math.min(word.length, 200); i < e && anyTo < len;) { - let next = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(word, i); - if (next == chars[anyTo] || next == folded[anyTo]) - any[anyTo++] = i; - i += (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)(next); - } - // No match, exit immediately - if (anyTo < len) - return null; - } - // This tracks the extent of the precise (non-folded, not - // necessarily adjacent) match - let preciseTo = 0; - // Tracks whether there is a match that hits only characters that - // appear to be starting words. `byWordFolded` is set to true when - // a case folded character is encountered in such a match - let byWordTo = 0, byWordFolded = false; - // If we've found a partial adjacent match, these track its state - let adjacentTo = 0, adjacentStart = -1, adjacentEnd = -1; - let hasLower = /[a-z]/.test(word), wordAdjacent = true; - // Go over the option's text, scanning for the various kinds of matches - for (let i = 0, e = Math.min(word.length, 200), prevType = 0 /* Tp.NonWord */; i < e && byWordTo < len;) { - let next = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(word, i); - if (direct < 0) { - if (preciseTo < len && next == chars[preciseTo]) - precise[preciseTo++] = i; - if (adjacentTo < len) { - if (next == chars[adjacentTo] || next == folded[adjacentTo]) { - if (adjacentTo == 0) - adjacentStart = i; - adjacentEnd = i + 1; - adjacentTo++; - } - else { - adjacentTo = 0; - } - } - } - let ch, type = next < 0xff - ? (next >= 48 && next <= 57 || next >= 97 && next <= 122 ? 2 /* Tp.Lower */ : next >= 65 && next <= 90 ? 1 /* Tp.Upper */ : 0 /* Tp.NonWord */) - : ((ch = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.fromCodePoint)(next)) != ch.toLowerCase() ? 1 /* Tp.Upper */ : ch != ch.toUpperCase() ? 2 /* Tp.Lower */ : 0 /* Tp.NonWord */); - if (!i || type == 1 /* Tp.Upper */ && hasLower || prevType == 0 /* Tp.NonWord */ && type != 0 /* Tp.NonWord */) { - if (chars[byWordTo] == next || (folded[byWordTo] == next && (byWordFolded = true))) - byWord[byWordTo++] = i; - else if (byWord.length) - wordAdjacent = false; - } - prevType = type; - i += (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)(next); - } - if (byWordTo == len && byWord[0] == 0 && wordAdjacent) - return this.result(-100 /* Penalty.ByWord */ + (byWordFolded ? -200 /* Penalty.CaseFold */ : 0), byWord, word); - if (adjacentTo == len && adjacentStart == 0) - return this.ret(-200 /* Penalty.CaseFold */ - word.length + (adjacentEnd == word.length ? 0 : -100 /* Penalty.NotFull */), [0, adjacentEnd]); - if (direct > -1) - return this.ret(-700 /* Penalty.NotStart */ - word.length, [direct, direct + this.pattern.length]); - if (adjacentTo == len) - return this.ret(-200 /* Penalty.CaseFold */ + -700 /* Penalty.NotStart */ - word.length, [adjacentStart, adjacentEnd]); - if (byWordTo == len) - return this.result(-100 /* Penalty.ByWord */ + (byWordFolded ? -200 /* Penalty.CaseFold */ : 0) + -700 /* Penalty.NotStart */ + - (wordAdjacent ? 0 : -1100 /* Penalty.Gap */), byWord, word); - return chars.length == 2 ? null - : this.result((any[0] ? -700 /* Penalty.NotStart */ : 0) + -200 /* Penalty.CaseFold */ + -1100 /* Penalty.Gap */, any, word); - } - result(score, positions, word) { - let result = [], i = 0; - for (let pos of positions) { - let to = pos + (this.astral ? (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(word, pos)) : 1); - if (i && result[i - 1] == pos) - result[i - 1] = to; - else { - result[i++] = pos; - result[i++] = to; - } - } - return this.ret(score - word.length, result); - } -} -class StrictMatcher { - constructor(pattern) { - this.pattern = pattern; - this.matched = []; - this.score = 0; - this.folded = pattern.toLowerCase(); - } - match(word) { - if (word.length < this.pattern.length) - return null; - let start = word.slice(0, this.pattern.length); - let match = start == this.pattern ? 0 : start.toLowerCase() == this.folded ? -200 /* Penalty.CaseFold */ : null; - if (match == null) - return null; - this.matched = [0, start.length]; - this.score = match + (word.length == this.pattern.length ? 0 : -100 /* Penalty.NotFull */); - return this; - } -} - -const completionConfig = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Facet.define({ - combine(configs) { - return (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.combineConfig)(configs, { - activateOnTyping: true, - activateOnCompletion: () => false, - activateOnTypingDelay: 100, - selectOnOpen: true, - override: null, - closeOnBlur: true, - maxRenderedOptions: 100, - defaultKeymap: true, - tooltipClass: () => "", - optionClass: () => "", - aboveCursor: false, - icons: true, - addToOptions: [], - positionInfo: defaultPositionInfo, - filterStrict: false, - compareCompletions: (a, b) => a.label.localeCompare(b.label), - interactionDelay: 75, - updateSyncTime: 100 - }, { - defaultKeymap: (a, b) => a && b, - closeOnBlur: (a, b) => a && b, - icons: (a, b) => a && b, - tooltipClass: (a, b) => c => joinClass(a(c), b(c)), - optionClass: (a, b) => c => joinClass(a(c), b(c)), - addToOptions: (a, b) => a.concat(b), - filterStrict: (a, b) => a || b, - }); - } -}); -function joinClass(a, b) { - return a ? b ? a + " " + b : a : b; -} -function defaultPositionInfo(view, list, option, info, space, tooltip) { - let rtl = view.textDirection == _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Direction.RTL, left = rtl, narrow = false; - let side = "top", offset, maxWidth; - let spaceLeft = list.left - space.left, spaceRight = space.right - list.right; - let infoWidth = info.right - info.left, infoHeight = info.bottom - info.top; - if (left && spaceLeft < Math.min(infoWidth, spaceRight)) - left = false; - else if (!left && spaceRight < Math.min(infoWidth, spaceLeft)) - left = true; - if (infoWidth <= (left ? spaceLeft : spaceRight)) { - offset = Math.max(space.top, Math.min(option.top, space.bottom - infoHeight)) - list.top; - maxWidth = Math.min(400 /* Info.Width */, left ? spaceLeft : spaceRight); - } - else { - narrow = true; - maxWidth = Math.min(400 /* Info.Width */, (rtl ? list.right : space.right - list.left) - 30 /* Info.Margin */); - let spaceBelow = space.bottom - list.bottom; - if (spaceBelow >= infoHeight || spaceBelow > list.top) { // Below the completion - offset = option.bottom - list.top; - } - else { // Above it - side = "bottom"; - offset = list.bottom - option.top; - } - } - let scaleY = (list.bottom - list.top) / tooltip.offsetHeight; - let scaleX = (list.right - list.left) / tooltip.offsetWidth; - return { - style: `${side}: ${offset / scaleY}px; max-width: ${maxWidth / scaleX}px`, - class: "cm-completionInfo-" + (narrow ? (rtl ? "left-narrow" : "right-narrow") : left ? "left" : "right") - }; -} - -function optionContent(config) { - let content = config.addToOptions.slice(); - if (config.icons) - content.push({ - render(completion) { - let icon = document.createElement("div"); - icon.classList.add("cm-completionIcon"); - if (completion.type) - icon.classList.add(...completion.type.split(/\s+/g).map(cls => "cm-completionIcon-" + cls)); - icon.setAttribute("aria-hidden", "true"); - return icon; - }, - position: 20 - }); - content.push({ - render(completion, _s, _v, match) { - let labelElt = document.createElement("span"); - labelElt.className = "cm-completionLabel"; - let label = completion.displayLabel || completion.label, off = 0; - for (let j = 0; j < match.length;) { - let from = match[j++], to = match[j++]; - if (from > off) - labelElt.appendChild(document.createTextNode(label.slice(off, from))); - let span = labelElt.appendChild(document.createElement("span")); - span.appendChild(document.createTextNode(label.slice(from, to))); - span.className = "cm-completionMatchedText"; - off = to; - } - if (off < label.length) - labelElt.appendChild(document.createTextNode(label.slice(off))); - return labelElt; - }, - position: 50 - }, { - render(completion) { - if (!completion.detail) - return null; - let detailElt = document.createElement("span"); - detailElt.className = "cm-completionDetail"; - detailElt.textContent = completion.detail; - return detailElt; - }, - position: 80 - }); - return content.sort((a, b) => a.position - b.position).map(a => a.render); -} -function rangeAroundSelected(total, selected, max) { - if (total <= max) - return { from: 0, to: total }; - if (selected < 0) - selected = 0; - if (selected <= (total >> 1)) { - let off = Math.floor(selected / max); - return { from: off * max, to: (off + 1) * max }; - } - let off = Math.floor((total - selected) / max); - return { from: total - (off + 1) * max, to: total - off * max }; -} -class CompletionTooltip { - constructor(view, stateField, applyCompletion) { - this.view = view; - this.stateField = stateField; - this.applyCompletion = applyCompletion; - this.info = null; - this.infoDestroy = null; - this.placeInfoReq = { - read: () => this.measureInfo(), - write: (pos) => this.placeInfo(pos), - key: this - }; - this.space = null; - this.currentClass = ""; - let cState = view.state.field(stateField); - let { options, selected } = cState.open; - let config = view.state.facet(completionConfig); - this.optionContent = optionContent(config); - this.optionClass = config.optionClass; - this.tooltipClass = config.tooltipClass; - this.range = rangeAroundSelected(options.length, selected, config.maxRenderedOptions); - this.dom = document.createElement("div"); - this.dom.className = "cm-tooltip-autocomplete"; - this.updateTooltipClass(view.state); - this.dom.addEventListener("mousedown", (e) => { - let { options } = view.state.field(stateField).open; - for (let dom = e.target, match; dom && dom != this.dom; dom = dom.parentNode) { - if (dom.nodeName == "LI" && (match = /-(\d+)$/.exec(dom.id)) && +match[1] < options.length) { - this.applyCompletion(view, options[+match[1]]); - e.preventDefault(); - return; - } - } - }); - this.dom.addEventListener("focusout", (e) => { - let state = view.state.field(this.stateField, false); - if (state && state.tooltip && view.state.facet(completionConfig).closeOnBlur && - e.relatedTarget != view.contentDOM) - view.dispatch({ effects: closeCompletionEffect.of(null) }); - }); - this.showOptions(options, cState.id); - } - mount() { this.updateSel(); } - showOptions(options, id) { - if (this.list) - this.list.remove(); - this.list = this.dom.appendChild(this.createListBox(options, id, this.range)); - this.list.addEventListener("scroll", () => { - if (this.info) - this.view.requestMeasure(this.placeInfoReq); - }); - } - update(update) { - var _a; - let cState = update.state.field(this.stateField); - let prevState = update.startState.field(this.stateField); - this.updateTooltipClass(update.state); - if (cState != prevState) { - let { options, selected, disabled } = cState.open; - if (!prevState.open || prevState.open.options != options) { - this.range = rangeAroundSelected(options.length, selected, update.state.facet(completionConfig).maxRenderedOptions); - this.showOptions(options, cState.id); - } - this.updateSel(); - if (disabled != ((_a = prevState.open) === null || _a === void 0 ? void 0 : _a.disabled)) - this.dom.classList.toggle("cm-tooltip-autocomplete-disabled", !!disabled); - } - } - updateTooltipClass(state) { - let cls = this.tooltipClass(state); - if (cls != this.currentClass) { - for (let c of this.currentClass.split(" ")) - if (c) - this.dom.classList.remove(c); - for (let c of cls.split(" ")) - if (c) - this.dom.classList.add(c); - this.currentClass = cls; - } - } - positioned(space) { - this.space = space; - if (this.info) - this.view.requestMeasure(this.placeInfoReq); - } - updateSel() { - let cState = this.view.state.field(this.stateField), open = cState.open; - if (open.selected > -1 && open.selected < this.range.from || open.selected >= this.range.to) { - this.range = rangeAroundSelected(open.options.length, open.selected, this.view.state.facet(completionConfig).maxRenderedOptions); - this.showOptions(open.options, cState.id); - } - if (this.updateSelectedOption(open.selected)) { - this.destroyInfo(); - let { completion } = open.options[open.selected]; - let { info } = completion; - if (!info) - return; - let infoResult = typeof info === "string" ? document.createTextNode(info) : info(completion); - if (!infoResult) - return; - if ("then" in infoResult) { - infoResult.then(obj => { - if (obj && this.view.state.field(this.stateField, false) == cState) - this.addInfoPane(obj, completion); - }).catch(e => (0,_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.logException)(this.view.state, e, "completion info")); - } - else { - this.addInfoPane(infoResult, completion); - } - } - } - addInfoPane(content, completion) { - this.destroyInfo(); - let wrap = this.info = document.createElement("div"); - wrap.className = "cm-tooltip cm-completionInfo"; - if (content.nodeType != null) { - wrap.appendChild(content); - this.infoDestroy = null; - } - else { - let { dom, destroy } = content; - wrap.appendChild(dom); - this.infoDestroy = destroy || null; - } - this.dom.appendChild(wrap); - this.view.requestMeasure(this.placeInfoReq); - } - updateSelectedOption(selected) { - let set = null; - for (let opt = this.list.firstChild, i = this.range.from; opt; opt = opt.nextSibling, i++) { - if (opt.nodeName != "LI" || !opt.id) { - i--; // A section header - } - else if (i == selected) { - if (!opt.hasAttribute("aria-selected")) { - opt.setAttribute("aria-selected", "true"); - set = opt; - } - } - else { - if (opt.hasAttribute("aria-selected")) - opt.removeAttribute("aria-selected"); - } - } - if (set) - scrollIntoView(this.list, set); - return set; - } - measureInfo() { - let sel = this.dom.querySelector("[aria-selected]"); - if (!sel || !this.info) - return null; - let listRect = this.dom.getBoundingClientRect(); - let infoRect = this.info.getBoundingClientRect(); - let selRect = sel.getBoundingClientRect(); - let space = this.space; - if (!space) { - let docElt = this.dom.ownerDocument.documentElement; - space = { left: 0, top: 0, right: docElt.clientWidth, bottom: docElt.clientHeight }; - } - if (selRect.top > Math.min(space.bottom, listRect.bottom) - 10 || - selRect.bottom < Math.max(space.top, listRect.top) + 10) - return null; - return this.view.state.facet(completionConfig).positionInfo(this.view, listRect, selRect, infoRect, space, this.dom); - } - placeInfo(pos) { - if (this.info) { - if (pos) { - if (pos.style) - this.info.style.cssText = pos.style; - this.info.className = "cm-tooltip cm-completionInfo " + (pos.class || ""); - } - else { - this.info.style.cssText = "top: -1e6px"; - } - } - } - createListBox(options, id, range) { - const ul = document.createElement("ul"); - ul.id = id; - ul.setAttribute("role", "listbox"); - ul.setAttribute("aria-expanded", "true"); - ul.setAttribute("aria-label", this.view.state.phrase("Completions")); - ul.addEventListener("mousedown", e => { - // Prevent focus change when clicking the scrollbar - if (e.target == ul) - e.preventDefault(); - }); - let curSection = null; - for (let i = range.from; i < range.to; i++) { - let { completion, match } = options[i], { section } = completion; - if (section) { - let name = typeof section == "string" ? section : section.name; - if (name != curSection && (i > range.from || range.from == 0)) { - curSection = name; - if (typeof section != "string" && section.header) { - ul.appendChild(section.header(section)); - } - else { - let header = ul.appendChild(document.createElement("completion-section")); - header.textContent = name; - } - } - } - const li = ul.appendChild(document.createElement("li")); - li.id = id + "-" + i; - li.setAttribute("role", "option"); - let cls = this.optionClass(completion); - if (cls) - li.className = cls; - for (let source of this.optionContent) { - let node = source(completion, this.view.state, this.view, match); - if (node) - li.appendChild(node); - } - } - if (range.from) - ul.classList.add("cm-completionListIncompleteTop"); - if (range.to < options.length) - ul.classList.add("cm-completionListIncompleteBottom"); - return ul; - } - destroyInfo() { - if (this.info) { - if (this.infoDestroy) - this.infoDestroy(); - this.info.remove(); - this.info = null; - } - } - destroy() { - this.destroyInfo(); - } -} -function completionTooltip(stateField, applyCompletion) { - return (view) => new CompletionTooltip(view, stateField, applyCompletion); -} -function scrollIntoView(container, element) { - let parent = container.getBoundingClientRect(); - let self = element.getBoundingClientRect(); - let scaleY = parent.height / container.offsetHeight; - if (self.top < parent.top) - container.scrollTop -= (parent.top - self.top) / scaleY; - else if (self.bottom > parent.bottom) - container.scrollTop += (self.bottom - parent.bottom) / scaleY; -} - -// Used to pick a preferred option when two options with the same -// label occur in the result. -function score(option) { - return (option.boost || 0) * 100 + (option.apply ? 10 : 0) + (option.info ? 5 : 0) + - (option.type ? 1 : 0); -} -function sortOptions(active, state) { - let options = []; - let sections = null; - let addOption = (option) => { - options.push(option); - let { section } = option.completion; - if (section) { - if (!sections) - sections = []; - let name = typeof section == "string" ? section : section.name; - if (!sections.some(s => s.name == name)) - sections.push(typeof section == "string" ? { name } : section); - } - }; - let conf = state.facet(completionConfig); - for (let a of active) - if (a.hasResult()) { - let getMatch = a.result.getMatch; - if (a.result.filter === false) { - for (let option of a.result.options) { - addOption(new Option(option, a.source, getMatch ? getMatch(option) : [], 1e9 - options.length)); - } - } - else { - let pattern = state.sliceDoc(a.from, a.to), match; - let matcher = conf.filterStrict ? new StrictMatcher(pattern) : new FuzzyMatcher(pattern); - for (let option of a.result.options) - if (match = matcher.match(option.label)) { - let matched = !option.displayLabel ? match.matched : getMatch ? getMatch(option, match.matched) : []; - addOption(new Option(option, a.source, matched, match.score + (option.boost || 0))); - } - } - } - if (sections) { - let sectionOrder = Object.create(null), pos = 0; - let cmp = (a, b) => { var _a, _b; return ((_a = a.rank) !== null && _a !== void 0 ? _a : 1e9) - ((_b = b.rank) !== null && _b !== void 0 ? _b : 1e9) || (a.name < b.name ? -1 : 1); }; - for (let s of sections.sort(cmp)) { - pos -= 1e5; - sectionOrder[s.name] = pos; - } - for (let option of options) { - let { section } = option.completion; - if (section) - option.score += sectionOrder[typeof section == "string" ? section : section.name]; - } - } - let result = [], prev = null; - let compare = conf.compareCompletions; - for (let opt of options.sort((a, b) => (b.score - a.score) || compare(a.completion, b.completion))) { - let cur = opt.completion; - if (!prev || prev.label != cur.label || prev.detail != cur.detail || - (prev.type != null && cur.type != null && prev.type != cur.type) || - prev.apply != cur.apply || prev.boost != cur.boost) - result.push(opt); - else if (score(opt.completion) > score(prev)) - result[result.length - 1] = opt; - prev = opt.completion; - } - return result; -} -class CompletionDialog { - constructor(options, attrs, tooltip, timestamp, selected, disabled) { - this.options = options; - this.attrs = attrs; - this.tooltip = tooltip; - this.timestamp = timestamp; - this.selected = selected; - this.disabled = disabled; - } - setSelected(selected, id) { - return selected == this.selected || selected >= this.options.length ? this - : new CompletionDialog(this.options, makeAttrs(id, selected), this.tooltip, this.timestamp, selected, this.disabled); - } - static build(active, state, id, prev, conf, didSetActive) { - if (prev && !didSetActive && active.some(s => s.isPending)) - return prev.setDisabled(); - let options = sortOptions(active, state); - if (!options.length) - return prev && active.some(a => a.isPending) ? prev.setDisabled() : null; - let selected = state.facet(completionConfig).selectOnOpen ? 0 : -1; - if (prev && prev.selected != selected && prev.selected != -1) { - let selectedValue = prev.options[prev.selected].completion; - for (let i = 0; i < options.length; i++) - if (options[i].completion == selectedValue) { - selected = i; - break; - } - } - return new CompletionDialog(options, makeAttrs(id, selected), { - pos: active.reduce((a, b) => b.hasResult() ? Math.min(a, b.from) : a, 1e8), - create: createTooltip, - above: conf.aboveCursor, - }, prev ? prev.timestamp : Date.now(), selected, false); - } - map(changes) { - return new CompletionDialog(this.options, this.attrs, Object.assign(Object.assign({}, this.tooltip), { pos: changes.mapPos(this.tooltip.pos) }), this.timestamp, this.selected, this.disabled); - } - setDisabled() { - return new CompletionDialog(this.options, this.attrs, this.tooltip, this.timestamp, this.selected, true); - } -} -class CompletionState { - constructor(active, id, open) { - this.active = active; - this.id = id; - this.open = open; - } - static start() { - return new CompletionState(none, "cm-ac-" + Math.floor(Math.random() * 2e6).toString(36), null); - } - update(tr) { - let { state } = tr, conf = state.facet(completionConfig); - let sources = conf.override || - state.languageDataAt("autocomplete", cur(state)).map(asSource); - let active = sources.map(source => { - let value = this.active.find(s => s.source == source) || - new ActiveSource(source, this.active.some(a => a.state != 0 /* State.Inactive */) ? 1 /* State.Pending */ : 0 /* State.Inactive */); - return value.update(tr, conf); - }); - if (active.length == this.active.length && active.every((a, i) => a == this.active[i])) - active = this.active; - let open = this.open, didSet = tr.effects.some(e => e.is(setActiveEffect)); - if (open && tr.docChanged) - open = open.map(tr.changes); - if (tr.selection || active.some(a => a.hasResult() && tr.changes.touchesRange(a.from, a.to)) || - !sameResults(active, this.active) || didSet) - open = CompletionDialog.build(active, state, this.id, open, conf, didSet); - else if (open && open.disabled && !active.some(a => a.isPending)) - open = null; - if (!open && active.every(a => !a.isPending) && active.some(a => a.hasResult())) - active = active.map(a => a.hasResult() ? new ActiveSource(a.source, 0 /* State.Inactive */) : a); - for (let effect of tr.effects) - if (effect.is(setSelectedEffect)) - open = open && open.setSelected(effect.value, this.id); - return active == this.active && open == this.open ? this : new CompletionState(active, this.id, open); - } - get tooltip() { return this.open ? this.open.tooltip : null; } - get attrs() { return this.open ? this.open.attrs : this.active.length ? baseAttrs : noAttrs; } -} -function sameResults(a, b) { - if (a == b) - return true; - for (let iA = 0, iB = 0;;) { - while (iA < a.length && !a[iA].hasResult()) - iA++; - while (iB < b.length && !b[iB].hasResult()) - iB++; - let endA = iA == a.length, endB = iB == b.length; - if (endA || endB) - return endA == endB; - if (a[iA++].result != b[iB++].result) - return false; - } -} -const baseAttrs = { - "aria-autocomplete": "list" -}; -const noAttrs = {}; -function makeAttrs(id, selected) { - let result = { - "aria-autocomplete": "list", - "aria-haspopup": "listbox", - "aria-controls": id - }; - if (selected > -1) - result["aria-activedescendant"] = id + "-" + selected; - return result; -} -const none = []; -function getUpdateType(tr, conf) { - if (tr.isUserEvent("input.complete")) { - let completion = tr.annotation(pickedCompletion); - if (completion && conf.activateOnCompletion(completion)) - return 4 /* UpdateType.Activate */ | 8 /* UpdateType.Reset */; - } - let typing = tr.isUserEvent("input.type"); - return typing && conf.activateOnTyping ? 4 /* UpdateType.Activate */ | 1 /* UpdateType.Typing */ - : typing ? 1 /* UpdateType.Typing */ - : tr.isUserEvent("delete.backward") ? 2 /* UpdateType.Backspacing */ - : tr.selection ? 8 /* UpdateType.Reset */ - : tr.docChanged ? 16 /* UpdateType.ResetIfTouching */ : 0 /* UpdateType.None */; -} -class ActiveSource { - constructor(source, state, explicit = false) { - this.source = source; - this.state = state; - this.explicit = explicit; - } - hasResult() { return false; } - get isPending() { return this.state == 1 /* State.Pending */; } - update(tr, conf) { - let type = getUpdateType(tr, conf), value = this; - if ((type & 8 /* UpdateType.Reset */) || (type & 16 /* UpdateType.ResetIfTouching */) && this.touches(tr)) - value = new ActiveSource(value.source, 0 /* State.Inactive */); - if ((type & 4 /* UpdateType.Activate */) && value.state == 0 /* State.Inactive */) - value = new ActiveSource(this.source, 1 /* State.Pending */); - value = value.updateFor(tr, type); - for (let effect of tr.effects) { - if (effect.is(startCompletionEffect)) - value = new ActiveSource(value.source, 1 /* State.Pending */, effect.value); - else if (effect.is(closeCompletionEffect)) - value = new ActiveSource(value.source, 0 /* State.Inactive */); - else if (effect.is(setActiveEffect)) - for (let active of effect.value) - if (active.source == value.source) - value = active; - } - return value; - } - updateFor(tr, type) { return this.map(tr.changes); } - map(changes) { return this; } - touches(tr) { - return tr.changes.touchesRange(cur(tr.state)); - } -} -class ActiveResult extends ActiveSource { - constructor(source, explicit, limit, result, from, to) { - super(source, 3 /* State.Result */, explicit); - this.limit = limit; - this.result = result; - this.from = from; - this.to = to; - } - hasResult() { return true; } - updateFor(tr, type) { - var _a; - if (!(type & 3 /* UpdateType.SimpleInteraction */)) - return this.map(tr.changes); - let result = this.result; - if (result.map && !tr.changes.empty) - result = result.map(result, tr.changes); - let from = tr.changes.mapPos(this.from), to = tr.changes.mapPos(this.to, 1); - let pos = cur(tr.state); - if (pos > to || !result || - (type & 2 /* UpdateType.Backspacing */) && (cur(tr.startState) == this.from || pos < this.limit)) - return new ActiveSource(this.source, type & 4 /* UpdateType.Activate */ ? 1 /* State.Pending */ : 0 /* State.Inactive */); - let limit = tr.changes.mapPos(this.limit); - if (checkValid(result.validFor, tr.state, from, to)) - return new ActiveResult(this.source, this.explicit, limit, result, from, to); - if (result.update && - (result = result.update(result, from, to, new CompletionContext(tr.state, pos, false)))) - return new ActiveResult(this.source, this.explicit, limit, result, result.from, (_a = result.to) !== null && _a !== void 0 ? _a : cur(tr.state)); - return new ActiveSource(this.source, 1 /* State.Pending */, this.explicit); - } - map(mapping) { - if (mapping.empty) - return this; - let result = this.result.map ? this.result.map(this.result, mapping) : this.result; - if (!result) - return new ActiveSource(this.source, 0 /* State.Inactive */); - return new ActiveResult(this.source, this.explicit, mapping.mapPos(this.limit), this.result, mapping.mapPos(this.from), mapping.mapPos(this.to, 1)); - } - touches(tr) { - return tr.changes.touchesRange(this.from, this.to); - } -} -function checkValid(validFor, state, from, to) { - if (!validFor) - return false; - let text = state.sliceDoc(from, to); - return typeof validFor == "function" ? validFor(text, from, to, state) : ensureAnchor(validFor, true).test(text); -} -const setActiveEffect = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define({ - map(sources, mapping) { return sources.map(s => s.map(mapping)); } -}); -const setSelectedEffect = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define(); -const completionState = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateField.define({ - create() { return CompletionState.start(); }, - update(value, tr) { return value.update(tr); }, - provide: f => [ - _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.showTooltip.from(f, val => val.tooltip), - _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.contentAttributes.from(f, state => state.attrs) - ] -}); -function applyCompletion(view, option) { - const apply = option.completion.apply || option.completion.label; - let result = view.state.field(completionState).active.find(a => a.source == option.source); - if (!(result instanceof ActiveResult)) - return false; - if (typeof apply == "string") - view.dispatch(Object.assign(Object.assign({}, insertCompletionText(view.state, apply, result.from, result.to)), { annotations: pickedCompletion.of(option.completion) })); - else - apply(view, option.completion, result.from, result.to); - return true; -} -const createTooltip = /*@__PURE__*/completionTooltip(completionState, applyCompletion); - -/** -Returns a command that moves the completion selection forward or -backward by the given amount. -*/ -function moveCompletionSelection(forward, by = "option") { - return (view) => { - let cState = view.state.field(completionState, false); - if (!cState || !cState.open || cState.open.disabled || - Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay) - return false; - let step = 1, tooltip; - if (by == "page" && (tooltip = (0,_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.getTooltip)(view, cState.open.tooltip))) - step = Math.max(2, Math.floor(tooltip.dom.offsetHeight / - tooltip.dom.querySelector("li").offsetHeight) - 1); - let { length } = cState.open.options; - let selected = cState.open.selected > -1 ? cState.open.selected + step * (forward ? 1 : -1) : forward ? 0 : length - 1; - if (selected < 0) - selected = by == "page" ? 0 : length - 1; - else if (selected >= length) - selected = by == "page" ? length - 1 : 0; - view.dispatch({ effects: setSelectedEffect.of(selected) }); - return true; - }; -} -/** -Accept the current completion. -*/ -const acceptCompletion = (view) => { - let cState = view.state.field(completionState, false); - if (view.state.readOnly || !cState || !cState.open || cState.open.selected < 0 || cState.open.disabled || - Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay) - return false; - return applyCompletion(view, cState.open.options[cState.open.selected]); -}; -/** -Explicitly start autocompletion. -*/ -const startCompletion = (view) => { - let cState = view.state.field(completionState, false); - if (!cState) - return false; - view.dispatch({ effects: startCompletionEffect.of(true) }); - return true; -}; -/** -Close the currently active completion. -*/ -const closeCompletion = (view) => { - let cState = view.state.field(completionState, false); - if (!cState || !cState.active.some(a => a.state != 0 /* State.Inactive */)) - return false; - view.dispatch({ effects: closeCompletionEffect.of(null) }); - return true; -}; -class RunningQuery { - constructor(active, context) { - this.active = active; - this.context = context; - this.time = Date.now(); - this.updates = []; - // Note that 'undefined' means 'not done yet', whereas 'null' means - // 'query returned null'. - this.done = undefined; - } -} -const MaxUpdateCount = 50, MinAbortTime = 1000; -const completionPlugin = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.ViewPlugin.fromClass(class { - constructor(view) { - this.view = view; - this.debounceUpdate = -1; - this.running = []; - this.debounceAccept = -1; - this.pendingStart = false; - this.composing = 0 /* CompositionState.None */; - for (let active of view.state.field(completionState).active) - if (active.isPending) - this.startQuery(active); - } - update(update) { - let cState = update.state.field(completionState); - let conf = update.state.facet(completionConfig); - if (!update.selectionSet && !update.docChanged && update.startState.field(completionState) == cState) - return; - let doesReset = update.transactions.some(tr => { - let type = getUpdateType(tr, conf); - return (type & 8 /* UpdateType.Reset */) || (tr.selection || tr.docChanged) && !(type & 3 /* UpdateType.SimpleInteraction */); - }); - for (let i = 0; i < this.running.length; i++) { - let query = this.running[i]; - if (doesReset || - query.context.abortOnDocChange && update.docChanged || - query.updates.length + update.transactions.length > MaxUpdateCount && Date.now() - query.time > MinAbortTime) { - for (let handler of query.context.abortListeners) { - try { - handler(); - } - catch (e) { - (0,_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.logException)(this.view.state, e); - } - } - query.context.abortListeners = null; - this.running.splice(i--, 1); - } - else { - query.updates.push(...update.transactions); - } - } - if (this.debounceUpdate > -1) - clearTimeout(this.debounceUpdate); - if (update.transactions.some(tr => tr.effects.some(e => e.is(startCompletionEffect)))) - this.pendingStart = true; - let delay = this.pendingStart ? 50 : conf.activateOnTypingDelay; - this.debounceUpdate = cState.active.some(a => a.isPending && !this.running.some(q => q.active.source == a.source)) - ? setTimeout(() => this.startUpdate(), delay) : -1; - if (this.composing != 0 /* CompositionState.None */) - for (let tr of update.transactions) { - if (tr.isUserEvent("input.type")) - this.composing = 2 /* CompositionState.Changed */; - else if (this.composing == 2 /* CompositionState.Changed */ && tr.selection) - this.composing = 3 /* CompositionState.ChangedAndMoved */; - } - } - startUpdate() { - this.debounceUpdate = -1; - this.pendingStart = false; - let { state } = this.view, cState = state.field(completionState); - for (let active of cState.active) { - if (active.isPending && !this.running.some(r => r.active.source == active.source)) - this.startQuery(active); - } - if (this.running.length && cState.open && cState.open.disabled) - this.debounceAccept = setTimeout(() => this.accept(), this.view.state.facet(completionConfig).updateSyncTime); - } - startQuery(active) { - let { state } = this.view, pos = cur(state); - let context = new CompletionContext(state, pos, active.explicit, this.view); - let pending = new RunningQuery(active, context); - this.running.push(pending); - Promise.resolve(active.source(context)).then(result => { - if (!pending.context.aborted) { - pending.done = result || null; - this.scheduleAccept(); - } - }, err => { - this.view.dispatch({ effects: closeCompletionEffect.of(null) }); - (0,_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.logException)(this.view.state, err); - }); - } - scheduleAccept() { - if (this.running.every(q => q.done !== undefined)) - this.accept(); - else if (this.debounceAccept < 0) - this.debounceAccept = setTimeout(() => this.accept(), this.view.state.facet(completionConfig).updateSyncTime); - } - // For each finished query in this.running, try to create a result - // or, if appropriate, restart the query. - accept() { - var _a; - if (this.debounceAccept > -1) - clearTimeout(this.debounceAccept); - this.debounceAccept = -1; - let updated = []; - let conf = this.view.state.facet(completionConfig), cState = this.view.state.field(completionState); - for (let i = 0; i < this.running.length; i++) { - let query = this.running[i]; - if (query.done === undefined) - continue; - this.running.splice(i--, 1); - if (query.done) { - let pos = cur(query.updates.length ? query.updates[0].startState : this.view.state); - let limit = Math.min(pos, query.done.from + (query.active.explicit ? 0 : 1)); - let active = new ActiveResult(query.active.source, query.active.explicit, limit, query.done, query.done.from, (_a = query.done.to) !== null && _a !== void 0 ? _a : pos); - // Replay the transactions that happened since the start of - // the request and see if that preserves the result - for (let tr of query.updates) - active = active.update(tr, conf); - if (active.hasResult()) { - updated.push(active); - continue; - } - } - let current = cState.active.find(a => a.source == query.active.source); - if (current && current.isPending) { - if (query.done == null) { - // Explicitly failed. Should clear the pending status if it - // hasn't been re-set in the meantime. - let active = new ActiveSource(query.active.source, 0 /* State.Inactive */); - for (let tr of query.updates) - active = active.update(tr, conf); - if (!active.isPending) - updated.push(active); - } - else { - // Cleared by subsequent transactions. Restart. - this.startQuery(current); - } - } - } - if (updated.length || cState.open && cState.open.disabled) - this.view.dispatch({ effects: setActiveEffect.of(updated) }); - } -}, { - eventHandlers: { - blur(event) { - let state = this.view.state.field(completionState, false); - if (state && state.tooltip && this.view.state.facet(completionConfig).closeOnBlur) { - let dialog = state.open && (0,_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.getTooltip)(this.view, state.open.tooltip); - if (!dialog || !dialog.dom.contains(event.relatedTarget)) - setTimeout(() => this.view.dispatch({ effects: closeCompletionEffect.of(null) }), 10); - } - }, - compositionstart() { - this.composing = 1 /* CompositionState.Started */; - }, - compositionend() { - if (this.composing == 3 /* CompositionState.ChangedAndMoved */) { - // Safari fires compositionend events synchronously, possibly - // from inside an update, so dispatch asynchronously to avoid reentrancy - setTimeout(() => this.view.dispatch({ effects: startCompletionEffect.of(false) }), 20); - } - this.composing = 0 /* CompositionState.None */; - } - } -}); -const windows = typeof navigator == "object" && /*@__PURE__*//Win/.test(navigator.platform); -const commitCharacters = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Prec.highest(/*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.domEventHandlers({ - keydown(event, view) { - let field = view.state.field(completionState, false); - if (!field || !field.open || field.open.disabled || field.open.selected < 0 || - event.key.length > 1 || event.ctrlKey && !(windows && event.altKey) || event.metaKey) - return false; - let option = field.open.options[field.open.selected]; - let result = field.active.find(a => a.source == option.source); - let commitChars = option.completion.commitCharacters || result.result.commitCharacters; - if (commitChars && commitChars.indexOf(event.key) > -1) - applyCompletion(view, option); - return false; - } -})); - -const baseTheme = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.baseTheme({ - ".cm-tooltip.cm-tooltip-autocomplete": { - "& > ul": { - fontFamily: "monospace", - whiteSpace: "nowrap", - overflow: "hidden auto", - maxWidth_fallback: "700px", - maxWidth: "min(700px, 95vw)", - minWidth: "250px", - maxHeight: "10em", - height: "100%", - listStyle: "none", - margin: 0, - padding: 0, - "& > li, & > completion-section": { - padding: "1px 3px", - lineHeight: 1.2 - }, - "& > li": { - overflowX: "hidden", - textOverflow: "ellipsis", - cursor: "pointer" - }, - "& > completion-section": { - display: "list-item", - borderBottom: "1px solid silver", - paddingLeft: "0.5em", - opacity: 0.7 - } - } - }, - "&light .cm-tooltip-autocomplete ul li[aria-selected]": { - background: "#17c", - color: "white", - }, - "&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]": { - background: "#777", - }, - "&dark .cm-tooltip-autocomplete ul li[aria-selected]": { - background: "#347", - color: "white", - }, - "&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]": { - background: "#444", - }, - ".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after": { - content: '"···"', - opacity: 0.5, - display: "block", - textAlign: "center" - }, - ".cm-tooltip.cm-completionInfo": { - position: "absolute", - padding: "3px 9px", - width: "max-content", - maxWidth: `${400 /* Info.Width */}px`, - boxSizing: "border-box", - whiteSpace: "pre-line" - }, - ".cm-completionInfo.cm-completionInfo-left": { right: "100%" }, - ".cm-completionInfo.cm-completionInfo-right": { left: "100%" }, - ".cm-completionInfo.cm-completionInfo-left-narrow": { right: `${30 /* Info.Margin */}px` }, - ".cm-completionInfo.cm-completionInfo-right-narrow": { left: `${30 /* Info.Margin */}px` }, - "&light .cm-snippetField": { backgroundColor: "#00000022" }, - "&dark .cm-snippetField": { backgroundColor: "#ffffff22" }, - ".cm-snippetFieldPosition": { - verticalAlign: "text-top", - width: 0, - height: "1.15em", - display: "inline-block", - margin: "0 -0.7px -.7em", - borderLeft: "1.4px dotted #888" - }, - ".cm-completionMatchedText": { - textDecoration: "underline" - }, - ".cm-completionDetail": { - marginLeft: "0.5em", - fontStyle: "italic" - }, - ".cm-completionIcon": { - fontSize: "90%", - width: ".8em", - display: "inline-block", - textAlign: "center", - paddingRight: ".6em", - opacity: "0.6", - boxSizing: "content-box" - }, - ".cm-completionIcon-function, .cm-completionIcon-method": { - "&:after": { content: "'ƒ'" } - }, - ".cm-completionIcon-class": { - "&:after": { content: "'○'" } - }, - ".cm-completionIcon-interface": { - "&:after": { content: "'◌'" } - }, - ".cm-completionIcon-variable": { - "&:after": { content: "'𝑥'" } - }, - ".cm-completionIcon-constant": { - "&:after": { content: "'𝐶'" } - }, - ".cm-completionIcon-type": { - "&:after": { content: "'𝑡'" } - }, - ".cm-completionIcon-enum": { - "&:after": { content: "'∪'" } - }, - ".cm-completionIcon-property": { - "&:after": { content: "'□'" } - }, - ".cm-completionIcon-keyword": { - "&:after": { content: "'🔑\uFE0E'" } // Disable emoji rendering - }, - ".cm-completionIcon-namespace": { - "&:after": { content: "'▢'" } - }, - ".cm-completionIcon-text": { - "&:after": { content: "'abc'", fontSize: "50%", verticalAlign: "middle" } - } -}); - -class FieldPos { - constructor(field, line, from, to) { - this.field = field; - this.line = line; - this.from = from; - this.to = to; - } -} -class FieldRange { - constructor(field, from, to) { - this.field = field; - this.from = from; - this.to = to; - } - map(changes) { - let from = changes.mapPos(this.from, -1, _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.MapMode.TrackDel); - let to = changes.mapPos(this.to, 1, _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.MapMode.TrackDel); - return from == null || to == null ? null : new FieldRange(this.field, from, to); - } -} -class Snippet { - constructor(lines, fieldPositions) { - this.lines = lines; - this.fieldPositions = fieldPositions; - } - instantiate(state, pos) { - let text = [], lineStart = [pos]; - let lineObj = state.doc.lineAt(pos), baseIndent = /^\s*/.exec(lineObj.text)[0]; - for (let line of this.lines) { - if (text.length) { - let indent = baseIndent, tabs = /^\t*/.exec(line)[0].length; - for (let i = 0; i < tabs; i++) - indent += state.facet(_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.indentUnit); - lineStart.push(pos + indent.length - tabs); - line = indent + line.slice(tabs); - } - text.push(line); - pos += line.length + 1; - } - let ranges = this.fieldPositions.map(pos => new FieldRange(pos.field, lineStart[pos.line] + pos.from, lineStart[pos.line] + pos.to)); - return { text, ranges }; - } - static parse(template) { - let fields = []; - let lines = [], positions = [], m; - for (let line of template.split(/\r\n?|\n/)) { - while (m = /[#$]\{(?:(\d+)(?::([^}]*))?|((?:\\[{}]|[^}])*))\}/.exec(line)) { - let seq = m[1] ? +m[1] : null, rawName = m[2] || m[3] || "", found = -1; - let name = rawName.replace(/\\[{}]/g, m => m[1]); - for (let i = 0; i < fields.length; i++) { - if (seq != null ? fields[i].seq == seq : name ? fields[i].name == name : false) - found = i; - } - if (found < 0) { - let i = 0; - while (i < fields.length && (seq == null || (fields[i].seq != null && fields[i].seq < seq))) - i++; - fields.splice(i, 0, { seq, name }); - found = i; - for (let pos of positions) - if (pos.field >= found) - pos.field++; - } - positions.push(new FieldPos(found, lines.length, m.index, m.index + name.length)); - line = line.slice(0, m.index) + rawName + line.slice(m.index + m[0].length); - } - line = line.replace(/\\([{}])/g, (_, brace, index) => { - for (let pos of positions) - if (pos.line == lines.length && pos.from > index) { - pos.from--; - pos.to--; - } - return brace; - }); - lines.push(line); - } - return new Snippet(lines, positions); - } -} -let fieldMarker = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Decoration.widget({ widget: /*@__PURE__*/new class extends _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.WidgetType { - toDOM() { - let span = document.createElement("span"); - span.className = "cm-snippetFieldPosition"; - return span; - } - ignoreEvent() { return false; } - } }); -let fieldRange = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Decoration.mark({ class: "cm-snippetField" }); -class ActiveSnippet { - constructor(ranges, active) { - this.ranges = ranges; - this.active = active; - this.deco = _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Decoration.set(ranges.map(r => (r.from == r.to ? fieldMarker : fieldRange).range(r.from, r.to))); - } - map(changes) { - let ranges = []; - for (let r of this.ranges) { - let mapped = r.map(changes); - if (!mapped) - return null; - ranges.push(mapped); - } - return new ActiveSnippet(ranges, this.active); - } - selectionInsideField(sel) { - return sel.ranges.every(range => this.ranges.some(r => r.field == this.active && r.from <= range.from && r.to >= range.to)); - } -} -const setActive = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define({ - map(value, changes) { return value && value.map(changes); } -}); -const moveToField = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define(); -const snippetState = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateField.define({ - create() { return null; }, - update(value, tr) { - for (let effect of tr.effects) { - if (effect.is(setActive)) - return effect.value; - if (effect.is(moveToField) && value) - return new ActiveSnippet(value.ranges, effect.value); - } - if (value && tr.docChanged) - value = value.map(tr.changes); - if (value && tr.selection && !value.selectionInsideField(tr.selection)) - value = null; - return value; - }, - provide: f => _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.decorations.from(f, val => val ? val.deco : _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Decoration.none) -}); -function fieldSelection(ranges, field) { - return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create(ranges.filter(r => r.field == field).map(r => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(r.from, r.to))); -} -/** -Convert a snippet template to a function that can -[apply](https://codemirror.net/6/docs/ref/#autocomplete.Completion.apply) it. Snippets are written -using syntax like this: - - "for (let ${index} = 0; ${index} < ${end}; ${index}++) {\n\t${}\n}" - -Each `${}` placeholder (you may also use `#{}`) indicates a field -that the user can fill in. Its name, if any, will be the default -content for the field. - -When the snippet is activated by calling the returned function, -the code is inserted at the given position. Newlines in the -template are indented by the indentation of the start line, plus -one [indent unit](https://codemirror.net/6/docs/ref/#language.indentUnit) per tab character after -the newline. - -On activation, (all instances of) the first field are selected. -The user can move between fields with Tab and Shift-Tab as long as -the fields are active. Moving to the last field or moving the -cursor out of the current field deactivates the fields. - -The order of fields defaults to textual order, but you can add -numbers to placeholders (`${1}` or `${1:defaultText}`) to provide -a custom order. - -To include a literal `{` or `}` in your template, put a backslash -in front of it. This will be removed and the brace will not be -interpreted as indicating a placeholder. -*/ -function snippet(template) { - let snippet = Snippet.parse(template); - return (editor, completion, from, to) => { - let { text, ranges } = snippet.instantiate(editor.state, from); - let { main } = editor.state.selection; - let spec = { - changes: { from, to: to == main.from ? main.to : to, insert: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Text.of(text) }, - scrollIntoView: true, - annotations: completion ? [pickedCompletion.of(completion), _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Transaction.userEvent.of("input.complete")] : undefined - }; - if (ranges.length) - spec.selection = fieldSelection(ranges, 0); - if (ranges.some(r => r.field > 0)) { - let active = new ActiveSnippet(ranges, 0); - let effects = spec.effects = [setActive.of(active)]; - if (editor.state.field(snippetState, false) === undefined) - effects.push(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.appendConfig.of([snippetState, addSnippetKeymap, snippetPointerHandler, baseTheme])); - } - editor.dispatch(editor.state.update(spec)); - }; -} -function moveField(dir) { - return ({ state, dispatch }) => { - let active = state.field(snippetState, false); - if (!active || dir < 0 && active.active == 0) - return false; - let next = active.active + dir, last = dir > 0 && !active.ranges.some(r => r.field == next + dir); - dispatch(state.update({ - selection: fieldSelection(active.ranges, next), - effects: setActive.of(last ? null : new ActiveSnippet(active.ranges, next)), - scrollIntoView: true - })); - return true; - }; -} -/** -A command that clears the active snippet, if any. -*/ -const clearSnippet = ({ state, dispatch }) => { - let active = state.field(snippetState, false); - if (!active) - return false; - dispatch(state.update({ effects: setActive.of(null) })); - return true; -}; -/** -Move to the next snippet field, if available. -*/ -const nextSnippetField = /*@__PURE__*/moveField(1); -/** -Move to the previous snippet field, if available. -*/ -const prevSnippetField = /*@__PURE__*/moveField(-1); -/** -Check if there is an active snippet with a next field for -`nextSnippetField` to move to. -*/ -function hasNextSnippetField(state) { - let active = state.field(snippetState, false); - return !!(active && active.ranges.some(r => r.field == active.active + 1)); -} -/** -Returns true if there is an active snippet and a previous field -for `prevSnippetField` to move to. -*/ -function hasPrevSnippetField(state) { - let active = state.field(snippetState, false); - return !!(active && active.active > 0); -} -const defaultSnippetKeymap = [ - { key: "Tab", run: nextSnippetField, shift: prevSnippetField }, - { key: "Escape", run: clearSnippet } -]; -/** -A facet that can be used to configure the key bindings used by -snippets. The default binds Tab to -[`nextSnippetField`](https://codemirror.net/6/docs/ref/#autocomplete.nextSnippetField), Shift-Tab to -[`prevSnippetField`](https://codemirror.net/6/docs/ref/#autocomplete.prevSnippetField), and Escape -to [`clearSnippet`](https://codemirror.net/6/docs/ref/#autocomplete.clearSnippet). -*/ -const snippetKeymap = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Facet.define({ - combine(maps) { return maps.length ? maps[0] : defaultSnippetKeymap; } -}); -const addSnippetKeymap = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Prec.highest(/*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.keymap.compute([snippetKeymap], state => state.facet(snippetKeymap))); -/** -Create a completion from a snippet. Returns an object with the -properties from `completion`, plus an `apply` function that -applies the snippet. -*/ -function snippetCompletion(template, completion) { - return Object.assign(Object.assign({}, completion), { apply: snippet(template) }); -} -const snippetPointerHandler = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.domEventHandlers({ - mousedown(event, view) { - let active = view.state.field(snippetState, false), pos; - if (!active || (pos = view.posAtCoords({ x: event.clientX, y: event.clientY })) == null) - return false; - let match = active.ranges.find(r => r.from <= pos && r.to >= pos); - if (!match || match.field == active.active) - return false; - view.dispatch({ - selection: fieldSelection(active.ranges, match.field), - effects: setActive.of(active.ranges.some(r => r.field > match.field) - ? new ActiveSnippet(active.ranges, match.field) : null), - scrollIntoView: true - }); - return true; - } -}); - -function wordRE(wordChars) { - let escaped = wordChars.replace(/[\]\-\\]/g, "\\$&"); - try { - return new RegExp(`[\\p{Alphabetic}\\p{Number}_${escaped}]+`, "ug"); - } - catch (_a) { - return new RegExp(`[\w${escaped}]`, "g"); - } -} -function mapRE(re, f) { - return new RegExp(f(re.source), re.unicode ? "u" : ""); -} -const wordCaches = /*@__PURE__*/Object.create(null); -function wordCache(wordChars) { - return wordCaches[wordChars] || (wordCaches[wordChars] = new WeakMap); -} -function storeWords(doc, wordRE, result, seen, ignoreAt) { - for (let lines = doc.iterLines(), pos = 0; !lines.next().done;) { - let { value } = lines, m; - wordRE.lastIndex = 0; - while (m = wordRE.exec(value)) { - if (!seen[m[0]] && pos + m.index != ignoreAt) { - result.push({ type: "text", label: m[0] }); - seen[m[0]] = true; - if (result.length >= 2000 /* C.MaxList */) - return; - } - } - pos += value.length + 1; - } -} -function collectWords(doc, cache, wordRE, to, ignoreAt) { - let big = doc.length >= 1000 /* C.MinCacheLen */; - let cached = big && cache.get(doc); - if (cached) - return cached; - let result = [], seen = Object.create(null); - if (doc.children) { - let pos = 0; - for (let ch of doc.children) { - if (ch.length >= 1000 /* C.MinCacheLen */) { - for (let c of collectWords(ch, cache, wordRE, to - pos, ignoreAt - pos)) { - if (!seen[c.label]) { - seen[c.label] = true; - result.push(c); - } - } - } - else { - storeWords(ch, wordRE, result, seen, ignoreAt - pos); - } - pos += ch.length + 1; - } - } - else { - storeWords(doc, wordRE, result, seen, ignoreAt); - } - if (big && result.length < 2000 /* C.MaxList */) - cache.set(doc, result); - return result; -} -/** -A completion source that will scan the document for words (using a -[character categorizer](https://codemirror.net/6/docs/ref/#state.EditorState.charCategorizer)), and -return those as completions. -*/ -const completeAnyWord = context => { - let wordChars = context.state.languageDataAt("wordChars", context.pos).join(""); - let re = wordRE(wordChars); - let token = context.matchBefore(mapRE(re, s => s + "$")); - if (!token && !context.explicit) - return null; - let from = token ? token.from : context.pos; - let options = collectWords(context.state.doc, wordCache(wordChars), re, 50000 /* C.Range */, from); - return { from, options, validFor: mapRE(re, s => "^" + s) }; -}; - -const defaults = { - brackets: ["(", "[", "{", "'", '"'], - before: ")]}:;>", - stringPrefixes: [] -}; -const closeBracketEffect = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.define({ - map(value, mapping) { - let mapped = mapping.mapPos(value, -1, _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.MapMode.TrackAfter); - return mapped == null ? undefined : mapped; - } -}); -const closedBracket = /*@__PURE__*/new class extends _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.RangeValue { -}; -closedBracket.startSide = 1; -closedBracket.endSide = -1; -const bracketState = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateField.define({ - create() { return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.RangeSet.empty; }, - update(value, tr) { - value = value.map(tr.changes); - if (tr.selection) { - let line = tr.state.doc.lineAt(tr.selection.main.head); - value = value.update({ filter: from => from >= line.from && from <= line.to }); - } - for (let effect of tr.effects) - if (effect.is(closeBracketEffect)) - value = value.update({ add: [closedBracket.range(effect.value, effect.value + 1)] }); - return value; - } -}); -/** -Extension to enable bracket-closing behavior. When a closeable -bracket is typed, its closing bracket is immediately inserted -after the cursor. When closing a bracket directly in front of a -closing bracket inserted by the extension, the cursor moves over -that bracket. -*/ -function closeBrackets() { - return [inputHandler, bracketState]; -} -const definedClosing = "()[]{}<>«»»«[]{}"; -function closing(ch) { - for (let i = 0; i < definedClosing.length; i += 2) - if (definedClosing.charCodeAt(i) == ch) - return definedClosing.charAt(i + 1); - return (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.fromCodePoint)(ch < 128 ? ch : ch + 1); -} -function config(state, pos) { - return state.languageDataAt("closeBrackets", pos)[0] || defaults; -} -const android = typeof navigator == "object" && /*@__PURE__*//Android\b/.test(navigator.userAgent); -const inputHandler = /*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.inputHandler.of((view, from, to, insert) => { - if ((android ? view.composing : view.compositionStarted) || view.state.readOnly) - return false; - let sel = view.state.selection.main; - if (insert.length > 2 || insert.length == 2 && (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(insert, 0)) == 1 || - from != sel.from || to != sel.to) - return false; - let tr = insertBracket(view.state, insert); - if (!tr) - return false; - view.dispatch(tr); - return true; -}); -/** -Command that implements deleting a pair of matching brackets when -the cursor is between them. -*/ -const deleteBracketPair = ({ state, dispatch }) => { - if (state.readOnly) - return false; - let conf = config(state, state.selection.main.head); - let tokens = conf.brackets || defaults.brackets; - let dont = null, changes = state.changeByRange(range => { - if (range.empty) { - let before = prevChar(state.doc, range.head); - for (let token of tokens) { - if (token == before && nextChar(state.doc, range.head) == closing((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(token, 0))) - return { changes: { from: range.head - token.length, to: range.head + token.length }, - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.head - token.length) }; - } - } - return { range: dont = range }; - }); - if (!dont) - dispatch(state.update(changes, { scrollIntoView: true, userEvent: "delete.backward" })); - return !dont; -}; -/** -Close-brackets related key bindings. Binds Backspace to -[`deleteBracketPair`](https://codemirror.net/6/docs/ref/#autocomplete.deleteBracketPair). -*/ -const closeBracketsKeymap = [ - { key: "Backspace", run: deleteBracketPair } -]; -/** -Implements the extension's behavior on text insertion. If the -given string counts as a bracket in the language around the -selection, and replacing the selection with it requires custom -behavior (inserting a closing version or skipping past a -previously-closed bracket), this function returns a transaction -representing that custom behavior. (You only need this if you want -to programmatically insert brackets—the -[`closeBrackets`](https://codemirror.net/6/docs/ref/#autocomplete.closeBrackets) extension will -take care of running this for user input.) -*/ -function insertBracket(state, bracket) { - let conf = config(state, state.selection.main.head); - let tokens = conf.brackets || defaults.brackets; - for (let tok of tokens) { - let closed = closing((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(tok, 0)); - if (bracket == tok) - return closed == tok ? handleSame(state, tok, tokens.indexOf(tok + tok + tok) > -1, conf) - : handleOpen(state, tok, closed, conf.before || defaults.before); - if (bracket == closed && closedBracketAt(state, state.selection.main.from)) - return handleClose(state, tok, closed); - } - return null; -} -function closedBracketAt(state, pos) { - let found = false; - state.field(bracketState).between(0, state.doc.length, from => { - if (from == pos) - found = true; - }); - return found; -} -function nextChar(doc, pos) { - let next = doc.sliceString(pos, pos + 2); - return next.slice(0, (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(next, 0))); -} -function prevChar(doc, pos) { - let prev = doc.sliceString(pos - 2, pos); - return (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointSize)((0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.codePointAt)(prev, 0)) == prev.length ? prev : prev.slice(1); -} -function handleOpen(state, open, close, closeBefore) { - let dont = null, changes = state.changeByRange(range => { - if (!range.empty) - return { changes: [{ insert: open, from: range.from }, { insert: close, from: range.to }], - effects: closeBracketEffect.of(range.to + open.length), - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(range.anchor + open.length, range.head + open.length) }; - let next = nextChar(state.doc, range.head); - if (!next || /\s/.test(next) || closeBefore.indexOf(next) > -1) - return { changes: { insert: open + close, from: range.head }, - effects: closeBracketEffect.of(range.head + open.length), - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.head + open.length) }; - return { range: dont = range }; - }); - return dont ? null : state.update(changes, { - scrollIntoView: true, - userEvent: "input.type" - }); -} -function handleClose(state, _open, close) { - let dont = null, changes = state.changeByRange(range => { - if (range.empty && nextChar(state.doc, range.head) == close) - return { changes: { from: range.head, to: range.head + close.length, insert: close }, - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.head + close.length) }; - return dont = { range }; - }); - return dont ? null : state.update(changes, { - scrollIntoView: true, - userEvent: "input.type" - }); -} -// Handles cases where the open and close token are the same, and -// possibly triple quotes (as in `"""abc"""`-style quoting). -function handleSame(state, token, allowTriple, config) { - let stringPrefixes = config.stringPrefixes || defaults.stringPrefixes; - let dont = null, changes = state.changeByRange(range => { - if (!range.empty) - return { changes: [{ insert: token, from: range.from }, { insert: token, from: range.to }], - effects: closeBracketEffect.of(range.to + token.length), - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(range.anchor + token.length, range.head + token.length) }; - let pos = range.head, next = nextChar(state.doc, pos), start; - if (next == token) { - if (nodeStart(state, pos)) { - return { changes: { insert: token + token, from: pos }, - effects: closeBracketEffect.of(pos + token.length), - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(pos + token.length) }; - } - else if (closedBracketAt(state, pos)) { - let isTriple = allowTriple && state.sliceDoc(pos, pos + token.length * 3) == token + token + token; - let content = isTriple ? token + token + token : token; - return { changes: { from: pos, to: pos + content.length, insert: content }, - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(pos + content.length) }; - } - } - else if (allowTriple && state.sliceDoc(pos - 2 * token.length, pos) == token + token && - (start = canStartStringAt(state, pos - 2 * token.length, stringPrefixes)) > -1 && - nodeStart(state, start)) { - return { changes: { insert: token + token + token + token, from: pos }, - effects: closeBracketEffect.of(pos + token.length), - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(pos + token.length) }; - } - else if (state.charCategorizer(pos)(next) != _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word) { - if (canStartStringAt(state, pos, stringPrefixes) > -1 && !probablyInString(state, pos, token, stringPrefixes)) - return { changes: { insert: token + token, from: pos }, - effects: closeBracketEffect.of(pos + token.length), - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(pos + token.length) }; - } - return { range: dont = range }; - }); - return dont ? null : state.update(changes, { - scrollIntoView: true, - userEvent: "input.type" - }); -} -function nodeStart(state, pos) { - let tree = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.syntaxTree)(state).resolveInner(pos + 1); - return tree.parent && tree.from == pos; -} -function probablyInString(state, pos, quoteToken, prefixes) { - let node = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_0__.syntaxTree)(state).resolveInner(pos, -1); - let maxPrefix = prefixes.reduce((m, p) => Math.max(m, p.length), 0); - for (let i = 0; i < 5; i++) { - let start = state.sliceDoc(node.from, Math.min(node.to, node.from + quoteToken.length + maxPrefix)); - let quotePos = start.indexOf(quoteToken); - if (!quotePos || quotePos > -1 && prefixes.indexOf(start.slice(0, quotePos)) > -1) { - let first = node.firstChild; - while (first && first.from == node.from && first.to - first.from > quoteToken.length + quotePos) { - if (state.sliceDoc(first.to - quoteToken.length, first.to) == quoteToken) - return false; - first = first.firstChild; - } - return true; - } - let parent = node.to == pos && node.parent; - if (!parent) - break; - node = parent; - } - return false; -} -function canStartStringAt(state, pos, prefixes) { - let charCat = state.charCategorizer(pos); - if (charCat(state.sliceDoc(pos - 1, pos)) != _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word) - return pos; - for (let prefix of prefixes) { - let start = pos - prefix.length; - if (state.sliceDoc(start, pos) == prefix && charCat(state.sliceDoc(start - 1, start)) != _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word) - return start; - } - return -1; -} - -/** -Returns an extension that enables autocompletion. -*/ -function autocompletion(config = {}) { - return [ - commitCharacters, - completionState, - completionConfig.of(config), - completionPlugin, - completionKeymapExt, - baseTheme - ]; -} -/** -Basic keybindings for autocompletion. - - - Ctrl-Space (and Alt-\` on macOS): [`startCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.startCompletion) - - Escape: [`closeCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.closeCompletion) - - ArrowDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true)` - - ArrowUp: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(false)` - - PageDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true, "page")` - - PageDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true, "page")` - - Enter: [`acceptCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.acceptCompletion) -*/ -const completionKeymap = [ - { key: "Ctrl-Space", run: startCompletion }, - { mac: "Alt-`", run: startCompletion }, - { key: "Escape", run: closeCompletion }, - { key: "ArrowDown", run: /*@__PURE__*/moveCompletionSelection(true) }, - { key: "ArrowUp", run: /*@__PURE__*/moveCompletionSelection(false) }, - { key: "PageDown", run: /*@__PURE__*/moveCompletionSelection(true, "page") }, - { key: "PageUp", run: /*@__PURE__*/moveCompletionSelection(false, "page") }, - { key: "Enter", run: acceptCompletion } -]; -const completionKeymapExt = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Prec.highest(/*@__PURE__*/_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.keymap.computeN([completionConfig], state => state.facet(completionConfig).defaultKeymap ? [completionKeymap] : [])); -/** -Get the current completion status. When completions are available, -this will return `"active"`. When completions are pending (in the -process of being queried), this returns `"pending"`. Otherwise, it -returns `null`. -*/ -function completionStatus(state) { - let cState = state.field(completionState, false); - return cState && cState.active.some(a => a.isPending) ? "pending" - : cState && cState.active.some(a => a.state != 0 /* State.Inactive */) ? "active" : null; -} -const completionArrayCache = /*@__PURE__*/new WeakMap; -/** -Returns the available completions as an array. -*/ -function currentCompletions(state) { - var _a; - let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open; - if (!open || open.disabled) - return []; - let completions = completionArrayCache.get(open.options); - if (!completions) - completionArrayCache.set(open.options, completions = open.options.map(o => o.completion)); - return completions; -} -/** -Return the currently selected completion, if any. -*/ -function selectedCompletion(state) { - var _a; - let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open; - return open && !open.disabled && open.selected >= 0 ? open.options[open.selected].completion : null; -} -/** -Returns the currently selected position in the active completion -list, or null if no completions are active. -*/ -function selectedCompletionIndex(state) { - var _a; - let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open; - return open && !open.disabled && open.selected >= 0 ? open.selected : null; -} -/** -Create an effect that can be attached to a transaction to change -the currently selected completion. -*/ -function setSelectedCompletion(index) { - return setSelectedEffect.of(index); -} - - - - -/***/ }), - -/***/ "./node_modules/@codemirror/commands/dist/index.js": -/*!*********************************************************!*\ - !*** ./node_modules/@codemirror/commands/dist/index.js ***! - \*********************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ blockComment: () => (/* binding */ blockComment), -/* harmony export */ blockUncomment: () => (/* binding */ blockUncomment), -/* harmony export */ copyLineDown: () => (/* binding */ copyLineDown), -/* harmony export */ copyLineUp: () => (/* binding */ copyLineUp), -/* harmony export */ cursorCharBackward: () => (/* binding */ cursorCharBackward), -/* harmony export */ cursorCharBackwardLogical: () => (/* binding */ cursorCharBackwardLogical), -/* harmony export */ cursorCharForward: () => (/* binding */ cursorCharForward), -/* harmony export */ cursorCharForwardLogical: () => (/* binding */ cursorCharForwardLogical), -/* harmony export */ cursorCharLeft: () => (/* binding */ cursorCharLeft), -/* harmony export */ cursorCharRight: () => (/* binding */ cursorCharRight), -/* harmony export */ cursorDocEnd: () => (/* binding */ cursorDocEnd), -/* harmony export */ cursorDocStart: () => (/* binding */ cursorDocStart), -/* harmony export */ cursorGroupBackward: () => (/* binding */ cursorGroupBackward), -/* harmony export */ cursorGroupForward: () => (/* binding */ cursorGroupForward), -/* harmony export */ cursorGroupForwardWin: () => (/* binding */ cursorGroupForwardWin), -/* harmony export */ cursorGroupLeft: () => (/* binding */ cursorGroupLeft), -/* harmony export */ cursorGroupRight: () => (/* binding */ cursorGroupRight), -/* harmony export */ cursorLineBoundaryBackward: () => (/* binding */ cursorLineBoundaryBackward), -/* harmony export */ cursorLineBoundaryForward: () => (/* binding */ cursorLineBoundaryForward), -/* harmony export */ cursorLineBoundaryLeft: () => (/* binding */ cursorLineBoundaryLeft), -/* harmony export */ cursorLineBoundaryRight: () => (/* binding */ cursorLineBoundaryRight), -/* harmony export */ cursorLineDown: () => (/* binding */ cursorLineDown), -/* harmony export */ cursorLineEnd: () => (/* binding */ cursorLineEnd), -/* harmony export */ cursorLineStart: () => (/* binding */ cursorLineStart), -/* harmony export */ cursorLineUp: () => (/* binding */ cursorLineUp), -/* harmony export */ cursorMatchingBracket: () => (/* binding */ cursorMatchingBracket), -/* harmony export */ cursorPageDown: () => (/* binding */ cursorPageDown), -/* harmony export */ cursorPageUp: () => (/* binding */ cursorPageUp), -/* harmony export */ cursorSubwordBackward: () => (/* binding */ cursorSubwordBackward), -/* harmony export */ cursorSubwordForward: () => (/* binding */ cursorSubwordForward), -/* harmony export */ cursorSyntaxLeft: () => (/* binding */ cursorSyntaxLeft), -/* harmony export */ cursorSyntaxRight: () => (/* binding */ cursorSyntaxRight), -/* harmony export */ defaultKeymap: () => (/* binding */ defaultKeymap), -/* harmony export */ deleteCharBackward: () => (/* binding */ deleteCharBackward), -/* harmony export */ deleteCharBackwardStrict: () => (/* binding */ deleteCharBackwardStrict), -/* harmony export */ deleteCharForward: () => (/* binding */ deleteCharForward), -/* harmony export */ deleteGroupBackward: () => (/* binding */ deleteGroupBackward), -/* harmony export */ deleteGroupForward: () => (/* binding */ deleteGroupForward), -/* harmony export */ deleteLine: () => (/* binding */ deleteLine), -/* harmony export */ deleteLineBoundaryBackward: () => (/* binding */ deleteLineBoundaryBackward), -/* harmony export */ deleteLineBoundaryForward: () => (/* binding */ deleteLineBoundaryForward), -/* harmony export */ deleteToLineEnd: () => (/* binding */ deleteToLineEnd), -/* harmony export */ deleteToLineStart: () => (/* binding */ deleteToLineStart), -/* harmony export */ deleteTrailingWhitespace: () => (/* binding */ deleteTrailingWhitespace), -/* harmony export */ emacsStyleKeymap: () => (/* binding */ emacsStyleKeymap), -/* harmony export */ history: () => (/* binding */ history), -/* harmony export */ historyField: () => (/* binding */ historyField), -/* harmony export */ historyKeymap: () => (/* binding */ historyKeymap), -/* harmony export */ indentLess: () => (/* binding */ indentLess), -/* harmony export */ indentMore: () => (/* binding */ indentMore), -/* harmony export */ indentSelection: () => (/* binding */ indentSelection), -/* harmony export */ indentWithTab: () => (/* binding */ indentWithTab), -/* harmony export */ insertBlankLine: () => (/* binding */ insertBlankLine), -/* harmony export */ insertNewline: () => (/* binding */ insertNewline), -/* harmony export */ insertNewlineAndIndent: () => (/* binding */ insertNewlineAndIndent), -/* harmony export */ insertNewlineKeepIndent: () => (/* binding */ insertNewlineKeepIndent), -/* harmony export */ insertTab: () => (/* binding */ insertTab), -/* harmony export */ invertedEffects: () => (/* binding */ invertedEffects), -/* harmony export */ isolateHistory: () => (/* binding */ isolateHistory), -/* harmony export */ lineComment: () => (/* binding */ lineComment), -/* harmony export */ lineUncomment: () => (/* binding */ lineUncomment), -/* harmony export */ moveLineDown: () => (/* binding */ moveLineDown), -/* harmony export */ moveLineUp: () => (/* binding */ moveLineUp), -/* harmony export */ redo: () => (/* binding */ redo), -/* harmony export */ redoDepth: () => (/* binding */ redoDepth), -/* harmony export */ redoSelection: () => (/* binding */ redoSelection), -/* harmony export */ selectAll: () => (/* binding */ selectAll), -/* harmony export */ selectCharBackward: () => (/* binding */ selectCharBackward), -/* harmony export */ selectCharBackwardLogical: () => (/* binding */ selectCharBackwardLogical), -/* harmony export */ selectCharForward: () => (/* binding */ selectCharForward), -/* harmony export */ selectCharForwardLogical: () => (/* binding */ selectCharForwardLogical), -/* harmony export */ selectCharLeft: () => (/* binding */ selectCharLeft), -/* harmony export */ selectCharRight: () => (/* binding */ selectCharRight), -/* harmony export */ selectDocEnd: () => (/* binding */ selectDocEnd), -/* harmony export */ selectDocStart: () => (/* binding */ selectDocStart), -/* harmony export */ selectGroupBackward: () => (/* binding */ selectGroupBackward), -/* harmony export */ selectGroupForward: () => (/* binding */ selectGroupForward), -/* harmony export */ selectGroupForwardWin: () => (/* binding */ selectGroupForwardWin), -/* harmony export */ selectGroupLeft: () => (/* binding */ selectGroupLeft), -/* harmony export */ selectGroupRight: () => (/* binding */ selectGroupRight), -/* harmony export */ selectLine: () => (/* binding */ selectLine), -/* harmony export */ selectLineBoundaryBackward: () => (/* binding */ selectLineBoundaryBackward), -/* harmony export */ selectLineBoundaryForward: () => (/* binding */ selectLineBoundaryForward), -/* harmony export */ selectLineBoundaryLeft: () => (/* binding */ selectLineBoundaryLeft), -/* harmony export */ selectLineBoundaryRight: () => (/* binding */ selectLineBoundaryRight), -/* harmony export */ selectLineDown: () => (/* binding */ selectLineDown), -/* harmony export */ selectLineEnd: () => (/* binding */ selectLineEnd), -/* harmony export */ selectLineStart: () => (/* binding */ selectLineStart), -/* harmony export */ selectLineUp: () => (/* binding */ selectLineUp), -/* harmony export */ selectMatchingBracket: () => (/* binding */ selectMatchingBracket), -/* harmony export */ selectPageDown: () => (/* binding */ selectPageDown), -/* harmony export */ selectPageUp: () => (/* binding */ selectPageUp), -/* harmony export */ selectParentSyntax: () => (/* binding */ selectParentSyntax), -/* harmony export */ selectSubwordBackward: () => (/* binding */ selectSubwordBackward), -/* harmony export */ selectSubwordForward: () => (/* binding */ selectSubwordForward), -/* harmony export */ selectSyntaxLeft: () => (/* binding */ selectSyntaxLeft), -/* harmony export */ selectSyntaxRight: () => (/* binding */ selectSyntaxRight), -/* harmony export */ simplifySelection: () => (/* binding */ simplifySelection), -/* harmony export */ splitLine: () => (/* binding */ splitLine), -/* harmony export */ standardKeymap: () => (/* binding */ standardKeymap), -/* harmony export */ temporarilySetTabFocusMode: () => (/* binding */ temporarilySetTabFocusMode), -/* harmony export */ toggleBlockComment: () => (/* binding */ toggleBlockComment), -/* harmony export */ toggleBlockCommentByLine: () => (/* binding */ toggleBlockCommentByLine), -/* harmony export */ toggleComment: () => (/* binding */ toggleComment), -/* harmony export */ toggleLineComment: () => (/* binding */ toggleLineComment), -/* harmony export */ toggleTabFocusMode: () => (/* binding */ toggleTabFocusMode), -/* harmony export */ transposeChars: () => (/* binding */ transposeChars), -/* harmony export */ undo: () => (/* binding */ undo), -/* harmony export */ undoDepth: () => (/* binding */ undoDepth), -/* harmony export */ undoSelection: () => (/* binding */ undoSelection) -/* harmony export */ }); -/* harmony import */ var _codemirror_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @codemirror/state */ "./node_modules/@codemirror/state/dist/index.js"); -/* harmony import */ var _codemirror_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @codemirror/view */ "./node_modules/@codemirror/view/dist/index.js"); -/* harmony import */ var _codemirror_language__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @codemirror/language */ "./node_modules/@codemirror/language/dist/index.js"); -/* harmony import */ var _lezer_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lezer/common */ "./node_modules/@lezer/common/dist/index.js"); - - - - - -/** -Comment or uncomment the current selection. Will use line comments -if available, otherwise falling back to block comments. -*/ -const toggleComment = target => { - let { state } = target, line = state.doc.lineAt(state.selection.main.from), config = getConfig(target.state, line.from); - return config.line ? toggleLineComment(target) : config.block ? toggleBlockCommentByLine(target) : false; -}; -function command(f, option) { - return ({ state, dispatch }) => { - if (state.readOnly) - return false; - let tr = f(option, state); - if (!tr) - return false; - dispatch(state.update(tr)); - return true; - }; -} -/** -Comment or uncomment the current selection using line comments. -The line comment syntax is taken from the -[`commentTokens`](https://codemirror.net/6/docs/ref/#commands.CommentTokens) [language -data](https://codemirror.net/6/docs/ref/#state.EditorState.languageDataAt). -*/ -const toggleLineComment = /*@__PURE__*/command(changeLineComment, 0 /* CommentOption.Toggle */); -/** -Comment the current selection using line comments. -*/ -const lineComment = /*@__PURE__*/command(changeLineComment, 1 /* CommentOption.Comment */); -/** -Uncomment the current selection using line comments. -*/ -const lineUncomment = /*@__PURE__*/command(changeLineComment, 2 /* CommentOption.Uncomment */); -/** -Comment or uncomment the current selection using block comments. -The block comment syntax is taken from the -[`commentTokens`](https://codemirror.net/6/docs/ref/#commands.CommentTokens) [language -data](https://codemirror.net/6/docs/ref/#state.EditorState.languageDataAt). -*/ -const toggleBlockComment = /*@__PURE__*/command(changeBlockComment, 0 /* CommentOption.Toggle */); -/** -Comment the current selection using block comments. -*/ -const blockComment = /*@__PURE__*/command(changeBlockComment, 1 /* CommentOption.Comment */); -/** -Uncomment the current selection using block comments. -*/ -const blockUncomment = /*@__PURE__*/command(changeBlockComment, 2 /* CommentOption.Uncomment */); -/** -Comment or uncomment the lines around the current selection using -block comments. -*/ -const toggleBlockCommentByLine = /*@__PURE__*/command((o, s) => changeBlockComment(o, s, selectedLineRanges(s)), 0 /* CommentOption.Toggle */); -function getConfig(state, pos) { - let data = state.languageDataAt("commentTokens", pos, 1); - return data.length ? data[0] : {}; -} -const SearchMargin = 50; -/** -Determines if the given range is block-commented in the given -state. -*/ -function findBlockComment(state, { open, close }, from, to) { - let textBefore = state.sliceDoc(from - SearchMargin, from); - let textAfter = state.sliceDoc(to, to + SearchMargin); - let spaceBefore = /\s*$/.exec(textBefore)[0].length, spaceAfter = /^\s*/.exec(textAfter)[0].length; - let beforeOff = textBefore.length - spaceBefore; - if (textBefore.slice(beforeOff - open.length, beforeOff) == open && - textAfter.slice(spaceAfter, spaceAfter + close.length) == close) { - return { open: { pos: from - spaceBefore, margin: spaceBefore && 1 }, - close: { pos: to + spaceAfter, margin: spaceAfter && 1 } }; - } - let startText, endText; - if (to - from <= 2 * SearchMargin) { - startText = endText = state.sliceDoc(from, to); - } - else { - startText = state.sliceDoc(from, from + SearchMargin); - endText = state.sliceDoc(to - SearchMargin, to); - } - let startSpace = /^\s*/.exec(startText)[0].length, endSpace = /\s*$/.exec(endText)[0].length; - let endOff = endText.length - endSpace - close.length; - if (startText.slice(startSpace, startSpace + open.length) == open && - endText.slice(endOff, endOff + close.length) == close) { - return { open: { pos: from + startSpace + open.length, - margin: /\s/.test(startText.charAt(startSpace + open.length)) ? 1 : 0 }, - close: { pos: to - endSpace - close.length, - margin: /\s/.test(endText.charAt(endOff - 1)) ? 1 : 0 } }; - } - return null; -} -function selectedLineRanges(state) { - let ranges = []; - for (let r of state.selection.ranges) { - let fromLine = state.doc.lineAt(r.from); - let toLine = r.to <= fromLine.to ? fromLine : state.doc.lineAt(r.to); - if (toLine.from > fromLine.from && toLine.from == r.to) - toLine = r.to == fromLine.to + 1 ? fromLine : state.doc.lineAt(r.to - 1); - let last = ranges.length - 1; - if (last >= 0 && ranges[last].to > fromLine.from) - ranges[last].to = toLine.to; - else - ranges.push({ from: fromLine.from + /^\s*/.exec(fromLine.text)[0].length, to: toLine.to }); - } - return ranges; -} -// Performs toggle, comment and uncomment of block comments in -// languages that support them. -function changeBlockComment(option, state, ranges = state.selection.ranges) { - let tokens = ranges.map(r => getConfig(state, r.from).block); - if (!tokens.every(c => c)) - return null; - let comments = ranges.map((r, i) => findBlockComment(state, tokens[i], r.from, r.to)); - if (option != 2 /* CommentOption.Uncomment */ && !comments.every(c => c)) { - return { changes: state.changes(ranges.map((range, i) => { - if (comments[i]) - return []; - return [{ from: range.from, insert: tokens[i].open + " " }, { from: range.to, insert: " " + tokens[i].close }]; - })) }; - } - else if (option != 1 /* CommentOption.Comment */ && comments.some(c => c)) { - let changes = []; - for (let i = 0, comment; i < comments.length; i++) - if (comment = comments[i]) { - let token = tokens[i], { open, close } = comment; - changes.push({ from: open.pos - token.open.length, to: open.pos + open.margin }, { from: close.pos - close.margin, to: close.pos + token.close.length }); - } - return { changes }; - } - return null; -} -// Performs toggle, comment and uncomment of line comments. -function changeLineComment(option, state, ranges = state.selection.ranges) { - let lines = []; - let prevLine = -1; - for (let { from, to } of ranges) { - let startI = lines.length, minIndent = 1e9; - let token = getConfig(state, from).line; - if (!token) - continue; - for (let pos = from; pos <= to;) { - let line = state.doc.lineAt(pos); - if (line.from > prevLine && (from == to || to > line.from)) { - prevLine = line.from; - let indent = /^\s*/.exec(line.text)[0].length; - let empty = indent == line.length; - let comment = line.text.slice(indent, indent + token.length) == token ? indent : -1; - if (indent < line.text.length && indent < minIndent) - minIndent = indent; - lines.push({ line, comment, token, indent, empty, single: false }); - } - pos = line.to + 1; - } - if (minIndent < 1e9) - for (let i = startI; i < lines.length; i++) - if (lines[i].indent < lines[i].line.text.length) - lines[i].indent = minIndent; - if (lines.length == startI + 1) - lines[startI].single = true; - } - if (option != 2 /* CommentOption.Uncomment */ && lines.some(l => l.comment < 0 && (!l.empty || l.single))) { - let changes = []; - for (let { line, token, indent, empty, single } of lines) - if (single || !empty) - changes.push({ from: line.from + indent, insert: token + " " }); - let changeSet = state.changes(changes); - return { changes: changeSet, selection: state.selection.map(changeSet, 1) }; - } - else if (option != 1 /* CommentOption.Comment */ && lines.some(l => l.comment >= 0)) { - let changes = []; - for (let { line, comment, token } of lines) - if (comment >= 0) { - let from = line.from + comment, to = from + token.length; - if (line.text[to - line.from] == " ") - to++; - changes.push({ from, to }); - } - return { changes }; - } - return null; -} - -const fromHistory = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Annotation.define(); -/** -Transaction annotation that will prevent that transaction from -being combined with other transactions in the undo history. Given -`"before"`, it'll prevent merging with previous transactions. With -`"after"`, subsequent transactions won't be combined with this -one. With `"full"`, the transaction is isolated on both sides. -*/ -const isolateHistory = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Annotation.define(); -/** -This facet provides a way to register functions that, given a -transaction, provide a set of effects that the history should -store when inverting the transaction. This can be used to -integrate some kinds of effects in the history, so that they can -be undone (and redone again). -*/ -const invertedEffects = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Facet.define(); -const historyConfig = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Facet.define({ - combine(configs) { - return (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.combineConfig)(configs, { - minDepth: 100, - newGroupDelay: 500, - joinToEvent: (_t, isAdjacent) => isAdjacent, - }, { - minDepth: Math.max, - newGroupDelay: Math.min, - joinToEvent: (a, b) => (tr, adj) => a(tr, adj) || b(tr, adj) - }); - } -}); -const historyField_ = /*@__PURE__*/_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateField.define({ - create() { - return HistoryState.empty; - }, - update(state, tr) { - let config = tr.state.facet(historyConfig); - let fromHist = tr.annotation(fromHistory); - if (fromHist) { - let item = HistEvent.fromTransaction(tr, fromHist.selection), from = fromHist.side; - let other = from == 0 /* BranchName.Done */ ? state.undone : state.done; - if (item) - other = updateBranch(other, other.length, config.minDepth, item); - else - other = addSelection(other, tr.startState.selection); - return new HistoryState(from == 0 /* BranchName.Done */ ? fromHist.rest : other, from == 0 /* BranchName.Done */ ? other : fromHist.rest); - } - let isolate = tr.annotation(isolateHistory); - if (isolate == "full" || isolate == "before") - state = state.isolate(); - if (tr.annotation(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Transaction.addToHistory) === false) - return !tr.changes.empty ? state.addMapping(tr.changes.desc) : state; - let event = HistEvent.fromTransaction(tr); - let time = tr.annotation(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Transaction.time), userEvent = tr.annotation(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Transaction.userEvent); - if (event) - state = state.addChanges(event, time, userEvent, config, tr); - else if (tr.selection) - state = state.addSelection(tr.startState.selection, time, userEvent, config.newGroupDelay); - if (isolate == "full" || isolate == "after") - state = state.isolate(); - return state; - }, - toJSON(value) { - return { done: value.done.map(e => e.toJSON()), undone: value.undone.map(e => e.toJSON()) }; - }, - fromJSON(json) { - return new HistoryState(json.done.map(HistEvent.fromJSON), json.undone.map(HistEvent.fromJSON)); - } -}); -/** -Create a history extension with the given configuration. -*/ -function history(config = {}) { - return [ - historyField_, - historyConfig.of(config), - _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.domEventHandlers({ - beforeinput(e, view) { - let command = e.inputType == "historyUndo" ? undo : e.inputType == "historyRedo" ? redo : null; - if (!command) - return false; - e.preventDefault(); - return command(view); - } - }) - ]; -} -/** -The state field used to store the history data. Should probably -only be used when you want to -[serialize](https://codemirror.net/6/docs/ref/#state.EditorState.toJSON) or -[deserialize](https://codemirror.net/6/docs/ref/#state.EditorState^fromJSON) state objects in a way -that preserves history. -*/ -const historyField = historyField_; -function cmd(side, selection) { - return function ({ state, dispatch }) { - if (!selection && state.readOnly) - return false; - let historyState = state.field(historyField_, false); - if (!historyState) - return false; - let tr = historyState.pop(side, state, selection); - if (!tr) - return false; - dispatch(tr); - return true; - }; -} -/** -Undo a single group of history events. Returns false if no group -was available. -*/ -const undo = /*@__PURE__*/cmd(0 /* BranchName.Done */, false); -/** -Redo a group of history events. Returns false if no group was -available. -*/ -const redo = /*@__PURE__*/cmd(1 /* BranchName.Undone */, false); -/** -Undo a change or selection change. -*/ -const undoSelection = /*@__PURE__*/cmd(0 /* BranchName.Done */, true); -/** -Redo a change or selection change. -*/ -const redoSelection = /*@__PURE__*/cmd(1 /* BranchName.Undone */, true); -function depth(side) { - return function (state) { - let histState = state.field(historyField_, false); - if (!histState) - return 0; - let branch = side == 0 /* BranchName.Done */ ? histState.done : histState.undone; - return branch.length - (branch.length && !branch[0].changes ? 1 : 0); - }; -} -/** -The amount of undoable change events available in a given state. -*/ -const undoDepth = /*@__PURE__*/depth(0 /* BranchName.Done */); -/** -The amount of redoable change events available in a given state. -*/ -const redoDepth = /*@__PURE__*/depth(1 /* BranchName.Undone */); -// History events store groups of changes or effects that need to be -// undone/redone together. -class HistEvent { - constructor( - // The changes in this event. Normal events hold at least one - // change or effect. But it may be necessary to store selection - // events before the first change, in which case a special type of - // instance is created which doesn't hold any changes, with - // changes == startSelection == undefined - changes, - // The effects associated with this event - effects, - // Accumulated mapping (from addToHistory==false) that should be - // applied to events below this one. - mapped, - // The selection before this event - startSelection, - // Stores selection changes after this event, to be used for - // selection undo/redo. - selectionsAfter) { - this.changes = changes; - this.effects = effects; - this.mapped = mapped; - this.startSelection = startSelection; - this.selectionsAfter = selectionsAfter; - } - setSelAfter(after) { - return new HistEvent(this.changes, this.effects, this.mapped, this.startSelection, after); - } - toJSON() { - var _a, _b, _c; - return { - changes: (_a = this.changes) === null || _a === void 0 ? void 0 : _a.toJSON(), - mapped: (_b = this.mapped) === null || _b === void 0 ? void 0 : _b.toJSON(), - startSelection: (_c = this.startSelection) === null || _c === void 0 ? void 0 : _c.toJSON(), - selectionsAfter: this.selectionsAfter.map(s => s.toJSON()) - }; - } - static fromJSON(json) { - return new HistEvent(json.changes && _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.ChangeSet.fromJSON(json.changes), [], json.mapped && _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.ChangeDesc.fromJSON(json.mapped), json.startSelection && _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.fromJSON(json.startSelection), json.selectionsAfter.map(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.fromJSON)); - } - // This does not check `addToHistory` and such, it assumes the - // transaction needs to be converted to an item. Returns null when - // there are no changes or effects in the transaction. - static fromTransaction(tr, selection) { - let effects = none; - for (let invert of tr.startState.facet(invertedEffects)) { - let result = invert(tr); - if (result.length) - effects = effects.concat(result); - } - if (!effects.length && tr.changes.empty) - return null; - return new HistEvent(tr.changes.invert(tr.startState.doc), effects, undefined, selection || tr.startState.selection, none); - } - static selection(selections) { - return new HistEvent(undefined, none, undefined, undefined, selections); - } -} -function updateBranch(branch, to, maxLen, newEvent) { - let start = to + 1 > maxLen + 20 ? to - maxLen - 1 : 0; - let newBranch = branch.slice(start, to); - newBranch.push(newEvent); - return newBranch; -} -function isAdjacent(a, b) { - let ranges = [], isAdjacent = false; - a.iterChangedRanges((f, t) => ranges.push(f, t)); - b.iterChangedRanges((_f, _t, f, t) => { - for (let i = 0; i < ranges.length;) { - let from = ranges[i++], to = ranges[i++]; - if (t >= from && f <= to) - isAdjacent = true; - } - }); - return isAdjacent; -} -function eqSelectionShape(a, b) { - return a.ranges.length == b.ranges.length && - a.ranges.filter((r, i) => r.empty != b.ranges[i].empty).length === 0; -} -function conc(a, b) { - return !a.length ? b : !b.length ? a : a.concat(b); -} -const none = []; -const MaxSelectionsPerEvent = 200; -function addSelection(branch, selection) { - if (!branch.length) { - return [HistEvent.selection([selection])]; - } - else { - let lastEvent = branch[branch.length - 1]; - let sels = lastEvent.selectionsAfter.slice(Math.max(0, lastEvent.selectionsAfter.length - MaxSelectionsPerEvent)); - if (sels.length && sels[sels.length - 1].eq(selection)) - return branch; - sels.push(selection); - return updateBranch(branch, branch.length - 1, 1e9, lastEvent.setSelAfter(sels)); - } -} -// Assumes the top item has one or more selectionAfter values -function popSelection(branch) { - let last = branch[branch.length - 1]; - let newBranch = branch.slice(); - newBranch[branch.length - 1] = last.setSelAfter(last.selectionsAfter.slice(0, last.selectionsAfter.length - 1)); - return newBranch; -} -// Add a mapping to the top event in the given branch. If this maps -// away all the changes and effects in that item, drop it and -// propagate the mapping to the next item. -function addMappingToBranch(branch, mapping) { - if (!branch.length) - return branch; - let length = branch.length, selections = none; - while (length) { - let event = mapEvent(branch[length - 1], mapping, selections); - if (event.changes && !event.changes.empty || event.effects.length) { // Event survived mapping - let result = branch.slice(0, length); - result[length - 1] = event; - return result; - } - else { // Drop this event, since there's no changes or effects left - mapping = event.mapped; - length--; - selections = event.selectionsAfter; - } - } - return selections.length ? [HistEvent.selection(selections)] : none; -} -function mapEvent(event, mapping, extraSelections) { - let selections = conc(event.selectionsAfter.length ? event.selectionsAfter.map(s => s.map(mapping)) : none, extraSelections); - // Change-less events don't store mappings (they are always the last event in a branch) - if (!event.changes) - return HistEvent.selection(selections); - let mappedChanges = event.changes.map(mapping), before = mapping.mapDesc(event.changes, true); - let fullMapping = event.mapped ? event.mapped.composeDesc(before) : before; - return new HistEvent(mappedChanges, _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.mapEffects(event.effects, mapping), fullMapping, event.startSelection.map(before), selections); -} -const joinableUserEvent = /^(input\.type|delete)($|\.)/; -class HistoryState { - constructor(done, undone, prevTime = 0, prevUserEvent = undefined) { - this.done = done; - this.undone = undone; - this.prevTime = prevTime; - this.prevUserEvent = prevUserEvent; - } - isolate() { - return this.prevTime ? new HistoryState(this.done, this.undone) : this; - } - addChanges(event, time, userEvent, config, tr) { - let done = this.done, lastEvent = done[done.length - 1]; - if (lastEvent && lastEvent.changes && !lastEvent.changes.empty && event.changes && - (!userEvent || joinableUserEvent.test(userEvent)) && - ((!lastEvent.selectionsAfter.length && - time - this.prevTime < config.newGroupDelay && - config.joinToEvent(tr, isAdjacent(lastEvent.changes, event.changes))) || - // For compose (but not compose.start) events, always join with previous event - userEvent == "input.type.compose")) { - done = updateBranch(done, done.length - 1, config.minDepth, new HistEvent(event.changes.compose(lastEvent.changes), conc(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.StateEffect.mapEffects(event.effects, lastEvent.changes), lastEvent.effects), lastEvent.mapped, lastEvent.startSelection, none)); - } - else { - done = updateBranch(done, done.length, config.minDepth, event); - } - return new HistoryState(done, none, time, userEvent); - } - addSelection(selection, time, userEvent, newGroupDelay) { - let last = this.done.length ? this.done[this.done.length - 1].selectionsAfter : none; - if (last.length > 0 && - time - this.prevTime < newGroupDelay && - userEvent == this.prevUserEvent && userEvent && /^select($|\.)/.test(userEvent) && - eqSelectionShape(last[last.length - 1], selection)) - return this; - return new HistoryState(addSelection(this.done, selection), this.undone, time, userEvent); - } - addMapping(mapping) { - return new HistoryState(addMappingToBranch(this.done, mapping), addMappingToBranch(this.undone, mapping), this.prevTime, this.prevUserEvent); - } - pop(side, state, onlySelection) { - let branch = side == 0 /* BranchName.Done */ ? this.done : this.undone; - if (branch.length == 0) - return null; - let event = branch[branch.length - 1], selection = event.selectionsAfter[0] || state.selection; - if (onlySelection && event.selectionsAfter.length) { - return state.update({ - selection: event.selectionsAfter[event.selectionsAfter.length - 1], - annotations: fromHistory.of({ side, rest: popSelection(branch), selection }), - userEvent: side == 0 /* BranchName.Done */ ? "select.undo" : "select.redo", - scrollIntoView: true - }); - } - else if (!event.changes) { - return null; - } - else { - let rest = branch.length == 1 ? none : branch.slice(0, branch.length - 1); - if (event.mapped) - rest = addMappingToBranch(rest, event.mapped); - return state.update({ - changes: event.changes, - selection: event.startSelection, - effects: event.effects, - annotations: fromHistory.of({ side, rest, selection }), - filter: false, - userEvent: side == 0 /* BranchName.Done */ ? "undo" : "redo", - scrollIntoView: true - }); - } - } -} -HistoryState.empty = /*@__PURE__*/new HistoryState(none, none); -/** -Default key bindings for the undo history. - -- Mod-z: [`undo`](https://codemirror.net/6/docs/ref/#commands.undo). -- Mod-y (Mod-Shift-z on macOS) + Ctrl-Shift-z on Linux: [`redo`](https://codemirror.net/6/docs/ref/#commands.redo). -- Mod-u: [`undoSelection`](https://codemirror.net/6/docs/ref/#commands.undoSelection). -- Alt-u (Mod-Shift-u on macOS): [`redoSelection`](https://codemirror.net/6/docs/ref/#commands.redoSelection). -*/ -const historyKeymap = [ - { key: "Mod-z", run: undo, preventDefault: true }, - { key: "Mod-y", mac: "Mod-Shift-z", run: redo, preventDefault: true }, - { linux: "Ctrl-Shift-z", run: redo, preventDefault: true }, - { key: "Mod-u", run: undoSelection, preventDefault: true }, - { key: "Alt-u", mac: "Mod-Shift-u", run: redoSelection, preventDefault: true } -]; - -function updateSel(sel, by) { - return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create(sel.ranges.map(by), sel.mainIndex); -} -function setSel(state, selection) { - return state.update({ selection, scrollIntoView: true, userEvent: "select" }); -} -function moveSel({ state, dispatch }, how) { - let selection = updateSel(state.selection, how); - if (selection.eq(state.selection, true)) - return false; - dispatch(setSel(state, selection)); - return true; -} -function rangeEnd(range, forward) { - return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(forward ? range.to : range.from); -} -function cursorByChar(view, forward) { - return moveSel(view, range => range.empty ? view.moveByChar(range, forward) : rangeEnd(range, forward)); -} -function ltrAtCursor(view) { - return view.textDirectionAt(view.state.selection.main.head) == _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.Direction.LTR; -} -/** -Move the selection one character to the left (which is backward in -left-to-right text, forward in right-to-left text). -*/ -const cursorCharLeft = view => cursorByChar(view, !ltrAtCursor(view)); -/** -Move the selection one character to the right. -*/ -const cursorCharRight = view => cursorByChar(view, ltrAtCursor(view)); -/** -Move the selection one character forward. -*/ -const cursorCharForward = view => cursorByChar(view, true); -/** -Move the selection one character backward. -*/ -const cursorCharBackward = view => cursorByChar(view, false); -function byCharLogical(state, range, forward) { - let pos = range.head, line = state.doc.lineAt(pos); - if (pos == (forward ? line.to : line.from)) - pos = forward ? Math.min(state.doc.length, line.to + 1) : Math.max(0, line.from - 1); - else - pos = line.from + (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, pos - line.from, forward); - return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(pos, forward ? -1 : 1); -} -function moveByCharLogical(target, forward) { - return moveSel(target, range => range.empty ? byCharLogical(target.state, range, forward) : rangeEnd(range, forward)); -} -/** -Move the selection one character forward, in logical -(non-text-direction-aware) string index order. -*/ -const cursorCharForwardLogical = target => moveByCharLogical(target, true); -/** -Move the selection one character backward, in logical string index -order. -*/ -const cursorCharBackwardLogical = target => moveByCharLogical(target, false); -function cursorByGroup(view, forward) { - return moveSel(view, range => range.empty ? view.moveByGroup(range, forward) : rangeEnd(range, forward)); -} -/** -Move the selection to the left across one group of word or -non-word (but also non-space) characters. -*/ -const cursorGroupLeft = view => cursorByGroup(view, !ltrAtCursor(view)); -/** -Move the selection one group to the right. -*/ -const cursorGroupRight = view => cursorByGroup(view, ltrAtCursor(view)); -/** -Move the selection one group forward. -*/ -const cursorGroupForward = view => cursorByGroup(view, true); -/** -Move the selection one group backward. -*/ -const cursorGroupBackward = view => cursorByGroup(view, false); -function toGroupStart(view, pos, start) { - let categorize = view.state.charCategorizer(pos); - let cat = categorize(start), initial = cat != _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Space; - return (next) => { - let nextCat = categorize(next); - if (nextCat != _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Space) - return initial && nextCat == cat; - initial = false; - return true; - }; -} -/** -Move the cursor one group forward in the default Windows style, -where it moves to the start of the next group. -*/ -const cursorGroupForwardWin = view => { - return moveSel(view, range => range.empty - ? view.moveByChar(range, true, start => toGroupStart(view, range.head, start)) - : rangeEnd(range, true)); -}; -const segmenter = typeof Intl != "undefined" && Intl.Segmenter ? - /*@__PURE__*/new (Intl.Segmenter)(undefined, { granularity: "word" }) : null; -function moveBySubword(view, range, forward) { - let categorize = view.state.charCategorizer(range.from); - let cat = _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Space, pos = range.from, steps = 0; - let done = false, sawUpper = false, sawLower = false; - let step = (next) => { - if (done) - return false; - pos += forward ? next.length : -next.length; - let nextCat = categorize(next), ahead; - if (nextCat == _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word && next.charCodeAt(0) < 128 && /[\W_]/.test(next)) - nextCat = -1; // Treat word punctuation specially - if (cat == _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Space) - cat = nextCat; - if (cat != nextCat) - return false; - if (cat == _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word) { - if (next.toLowerCase() == next) { - if (!forward && sawUpper) - return false; - sawLower = true; - } - else if (sawLower) { - if (forward) - return false; - done = true; - } - else { - if (sawUpper && forward && categorize(ahead = view.state.sliceDoc(pos, pos + 1)) == _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word && - ahead.toLowerCase() == ahead) - return false; - sawUpper = true; - } - } - steps++; - return true; - }; - let end = view.moveByChar(range, forward, start => { - step(start); - return step; - }); - if (segmenter && cat == _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.CharCategory.Word && end.from == range.from + steps * (forward ? 1 : -1)) { - let from = Math.min(range.head, end.head), to = Math.max(range.head, end.head); - let skipped = view.state.sliceDoc(from, to); - if (skipped.length > 1 && /[\u4E00-\uffff]/.test(skipped)) { - let segments = Array.from(segmenter.segment(skipped)); - if (segments.length > 1) { - if (forward) - return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.head + segments[1].index, -1); - return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(end.head + segments[segments.length - 1].index, 1); - } - } - } - return end; -} -function cursorBySubword(view, forward) { - return moveSel(view, range => range.empty ? moveBySubword(view, range, forward) : rangeEnd(range, forward)); -} -/** -Move the selection one group or camel-case subword forward. -*/ -const cursorSubwordForward = view => cursorBySubword(view, true); -/** -Move the selection one group or camel-case subword backward. -*/ -const cursorSubwordBackward = view => cursorBySubword(view, false); -function interestingNode(state, node, bracketProp) { - if (node.type.prop(bracketProp)) - return true; - let len = node.to - node.from; - return len && (len > 2 || /[^\s,.;:]/.test(state.sliceDoc(node.from, node.to))) || node.firstChild; -} -function moveBySyntax(state, start, forward) { - let pos = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.syntaxTree)(state).resolveInner(start.head); - let bracketProp = forward ? _lezer_common__WEBPACK_IMPORTED_MODULE_0__.NodeProp.closedBy : _lezer_common__WEBPACK_IMPORTED_MODULE_0__.NodeProp.openedBy; - // Scan forward through child nodes to see if there's an interesting - // node ahead. - for (let at = start.head;;) { - let next = forward ? pos.childAfter(at) : pos.childBefore(at); - if (!next) - break; - if (interestingNode(state, next, bracketProp)) - pos = next; - else - at = forward ? next.to : next.from; - } - let bracket = pos.type.prop(bracketProp), match, newPos; - if (bracket && (match = forward ? (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, pos.from, 1) : (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, pos.to, -1)) && match.matched) - newPos = forward ? match.end.to : match.end.from; - else - newPos = forward ? pos.to : pos.from; - return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(newPos, forward ? -1 : 1); -} -/** -Move the cursor over the next syntactic element to the left. -*/ -const cursorSyntaxLeft = view => moveSel(view, range => moveBySyntax(view.state, range, !ltrAtCursor(view))); -/** -Move the cursor over the next syntactic element to the right. -*/ -const cursorSyntaxRight = view => moveSel(view, range => moveBySyntax(view.state, range, ltrAtCursor(view))); -function cursorByLine(view, forward) { - return moveSel(view, range => { - if (!range.empty) - return rangeEnd(range, forward); - let moved = view.moveVertically(range, forward); - return moved.head != range.head ? moved : view.moveToLineBoundary(range, forward); - }); -} -/** -Move the selection one line up. -*/ -const cursorLineUp = view => cursorByLine(view, false); -/** -Move the selection one line down. -*/ -const cursorLineDown = view => cursorByLine(view, true); -function pageInfo(view) { - let selfScroll = view.scrollDOM.clientHeight < view.scrollDOM.scrollHeight - 2; - let marginTop = 0, marginBottom = 0, height; - if (selfScroll) { - for (let source of view.state.facet(_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.scrollMargins)) { - let margins = source(view); - if (margins === null || margins === void 0 ? void 0 : margins.top) - marginTop = Math.max(margins === null || margins === void 0 ? void 0 : margins.top, marginTop); - if (margins === null || margins === void 0 ? void 0 : margins.bottom) - marginBottom = Math.max(margins === null || margins === void 0 ? void 0 : margins.bottom, marginBottom); - } - height = view.scrollDOM.clientHeight - marginTop - marginBottom; - } - else { - height = (view.dom.ownerDocument.defaultView || window).innerHeight; - } - return { marginTop, marginBottom, selfScroll, - height: Math.max(view.defaultLineHeight, height - 5) }; -} -function cursorByPage(view, forward) { - let page = pageInfo(view); - let { state } = view, selection = updateSel(state.selection, range => { - return range.empty ? view.moveVertically(range, forward, page.height) - : rangeEnd(range, forward); - }); - if (selection.eq(state.selection)) - return false; - let effect; - if (page.selfScroll) { - let startPos = view.coordsAtPos(state.selection.main.head); - let scrollRect = view.scrollDOM.getBoundingClientRect(); - let scrollTop = scrollRect.top + page.marginTop, scrollBottom = scrollRect.bottom - page.marginBottom; - if (startPos && startPos.top > scrollTop && startPos.bottom < scrollBottom) - effect = _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.scrollIntoView(selection.main.head, { y: "start", yMargin: startPos.top - scrollTop }); - } - view.dispatch(setSel(state, selection), { effects: effect }); - return true; -} -/** -Move the selection one page up. -*/ -const cursorPageUp = view => cursorByPage(view, false); -/** -Move the selection one page down. -*/ -const cursorPageDown = view => cursorByPage(view, true); -function moveByLineBoundary(view, start, forward) { - let line = view.lineBlockAt(start.head), moved = view.moveToLineBoundary(start, forward); - if (moved.head == start.head && moved.head != (forward ? line.to : line.from)) - moved = view.moveToLineBoundary(start, forward, false); - if (!forward && moved.head == line.from && line.length) { - let space = /^\s*/.exec(view.state.sliceDoc(line.from, Math.min(line.from + 100, line.to)))[0].length; - if (space && start.head != line.from + space) - moved = _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(line.from + space); - } - return moved; -} -/** -Move the selection to the next line wrap point, or to the end of -the line if there isn't one left on this line. -*/ -const cursorLineBoundaryForward = view => moveSel(view, range => moveByLineBoundary(view, range, true)); -/** -Move the selection to previous line wrap point, or failing that to -the start of the line. If the line is indented, and the cursor -isn't already at the end of the indentation, this will move to the -end of the indentation instead of the start of the line. -*/ -const cursorLineBoundaryBackward = view => moveSel(view, range => moveByLineBoundary(view, range, false)); -/** -Move the selection one line wrap point to the left. -*/ -const cursorLineBoundaryLeft = view => moveSel(view, range => moveByLineBoundary(view, range, !ltrAtCursor(view))); -/** -Move the selection one line wrap point to the right. -*/ -const cursorLineBoundaryRight = view => moveSel(view, range => moveByLineBoundary(view, range, ltrAtCursor(view))); -/** -Move the selection to the start of the line. -*/ -const cursorLineStart = view => moveSel(view, range => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(view.lineBlockAt(range.head).from, 1)); -/** -Move the selection to the end of the line. -*/ -const cursorLineEnd = view => moveSel(view, range => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(view.lineBlockAt(range.head).to, -1)); -function toMatchingBracket(state, dispatch, extend) { - let found = false, selection = updateSel(state.selection, range => { - let matching = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, range.head, -1) - || (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, range.head, 1) - || (range.head > 0 && (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, range.head - 1, 1)) - || (range.head < state.doc.length && (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.matchBrackets)(state, range.head + 1, -1)); - if (!matching || !matching.end) - return range; - found = true; - let head = matching.start.from == range.head ? matching.end.to : matching.end.from; - return extend ? _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(range.anchor, head) : _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(head); - }); - if (!found) - return false; - dispatch(setSel(state, selection)); - return true; -} -/** -Move the selection to the bracket matching the one it is currently -on, if any. -*/ -const cursorMatchingBracket = ({ state, dispatch }) => toMatchingBracket(state, dispatch, false); -/** -Extend the selection to the bracket matching the one the selection -head is currently on, if any. -*/ -const selectMatchingBracket = ({ state, dispatch }) => toMatchingBracket(state, dispatch, true); -function extendSel(target, how) { - let selection = updateSel(target.state.selection, range => { - let head = how(range); - return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(range.anchor, head.head, head.goalColumn, head.bidiLevel || undefined); - }); - if (selection.eq(target.state.selection)) - return false; - target.dispatch(setSel(target.state, selection)); - return true; -} -function selectByChar(view, forward) { - return extendSel(view, range => view.moveByChar(range, forward)); -} -/** -Move the selection head one character to the left, while leaving -the anchor in place. -*/ -const selectCharLeft = view => selectByChar(view, !ltrAtCursor(view)); -/** -Move the selection head one character to the right. -*/ -const selectCharRight = view => selectByChar(view, ltrAtCursor(view)); -/** -Move the selection head one character forward. -*/ -const selectCharForward = view => selectByChar(view, true); -/** -Move the selection head one character backward. -*/ -const selectCharBackward = view => selectByChar(view, false); -/** -Move the selection head one character forward by logical -(non-direction aware) string index order. -*/ -const selectCharForwardLogical = target => extendSel(target, range => byCharLogical(target.state, range, true)); -/** -Move the selection head one character backward by logical string -index order. -*/ -const selectCharBackwardLogical = target => extendSel(target, range => byCharLogical(target.state, range, false)); -function selectByGroup(view, forward) { - return extendSel(view, range => view.moveByGroup(range, forward)); -} -/** -Move the selection head one [group](https://codemirror.net/6/docs/ref/#commands.cursorGroupLeft) to -the left. -*/ -const selectGroupLeft = view => selectByGroup(view, !ltrAtCursor(view)); -/** -Move the selection head one group to the right. -*/ -const selectGroupRight = view => selectByGroup(view, ltrAtCursor(view)); -/** -Move the selection head one group forward. -*/ -const selectGroupForward = view => selectByGroup(view, true); -/** -Move the selection head one group backward. -*/ -const selectGroupBackward = view => selectByGroup(view, false); -/** -Move the selection head one group forward in the default Windows -style, skipping to the start of the next group. -*/ -const selectGroupForwardWin = view => { - return extendSel(view, range => view.moveByChar(range, true, start => toGroupStart(view, range.head, start))); -}; -function selectBySubword(view, forward) { - return extendSel(view, range => moveBySubword(view, range, forward)); -} -/** -Move the selection head one group or camel-case subword forward. -*/ -const selectSubwordForward = view => selectBySubword(view, true); -/** -Move the selection head one group or subword backward. -*/ -const selectSubwordBackward = view => selectBySubword(view, false); -/** -Move the selection head over the next syntactic element to the left. -*/ -const selectSyntaxLeft = view => extendSel(view, range => moveBySyntax(view.state, range, !ltrAtCursor(view))); -/** -Move the selection head over the next syntactic element to the right. -*/ -const selectSyntaxRight = view => extendSel(view, range => moveBySyntax(view.state, range, ltrAtCursor(view))); -function selectByLine(view, forward) { - return extendSel(view, range => view.moveVertically(range, forward)); -} -/** -Move the selection head one line up. -*/ -const selectLineUp = view => selectByLine(view, false); -/** -Move the selection head one line down. -*/ -const selectLineDown = view => selectByLine(view, true); -function selectByPage(view, forward) { - return extendSel(view, range => view.moveVertically(range, forward, pageInfo(view).height)); -} -/** -Move the selection head one page up. -*/ -const selectPageUp = view => selectByPage(view, false); -/** -Move the selection head one page down. -*/ -const selectPageDown = view => selectByPage(view, true); -/** -Move the selection head to the next line boundary. -*/ -const selectLineBoundaryForward = view => extendSel(view, range => moveByLineBoundary(view, range, true)); -/** -Move the selection head to the previous line boundary. -*/ -const selectLineBoundaryBackward = view => extendSel(view, range => moveByLineBoundary(view, range, false)); -/** -Move the selection head one line boundary to the left. -*/ -const selectLineBoundaryLeft = view => extendSel(view, range => moveByLineBoundary(view, range, !ltrAtCursor(view))); -/** -Move the selection head one line boundary to the right. -*/ -const selectLineBoundaryRight = view => extendSel(view, range => moveByLineBoundary(view, range, ltrAtCursor(view))); -/** -Move the selection head to the start of the line. -*/ -const selectLineStart = view => extendSel(view, range => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(view.lineBlockAt(range.head).from)); -/** -Move the selection head to the end of the line. -*/ -const selectLineEnd = view => extendSel(view, range => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(view.lineBlockAt(range.head).to)); -/** -Move the selection to the start of the document. -*/ -const cursorDocStart = ({ state, dispatch }) => { - dispatch(setSel(state, { anchor: 0 })); - return true; -}; -/** -Move the selection to the end of the document. -*/ -const cursorDocEnd = ({ state, dispatch }) => { - dispatch(setSel(state, { anchor: state.doc.length })); - return true; -}; -/** -Move the selection head to the start of the document. -*/ -const selectDocStart = ({ state, dispatch }) => { - dispatch(setSel(state, { anchor: state.selection.main.anchor, head: 0 })); - return true; -}; -/** -Move the selection head to the end of the document. -*/ -const selectDocEnd = ({ state, dispatch }) => { - dispatch(setSel(state, { anchor: state.selection.main.anchor, head: state.doc.length })); - return true; -}; -/** -Select the entire document. -*/ -const selectAll = ({ state, dispatch }) => { - dispatch(state.update({ selection: { anchor: 0, head: state.doc.length }, userEvent: "select" })); - return true; -}; -/** -Expand the selection to cover entire lines. -*/ -const selectLine = ({ state, dispatch }) => { - let ranges = selectedLineBlocks(state).map(({ from, to }) => _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(from, Math.min(to + 1, state.doc.length))); - dispatch(state.update({ selection: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create(ranges), userEvent: "select" })); - return true; -}; -/** -Select the next syntactic construct that is larger than the -selection. Note that this will only work insofar as the language -[provider](https://codemirror.net/6/docs/ref/#language.language) you use builds up a full -syntax tree. -*/ -const selectParentSyntax = ({ state, dispatch }) => { - let selection = updateSel(state.selection, range => { - let tree = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.syntaxTree)(state), stack = tree.resolveStack(range.from, 1); - if (range.empty) { - let stackBefore = tree.resolveStack(range.from, -1); - if (stackBefore.node.from >= stack.node.from && stackBefore.node.to <= stack.node.to) - stack = stackBefore; - } - for (let cur = stack; cur; cur = cur.next) { - let { node } = cur; - if (((node.from < range.from && node.to >= range.to) || - (node.to > range.to && node.from <= range.from)) && - cur.next) - return _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(node.to, node.from); - } - return range; - }); - if (selection.eq(state.selection)) - return false; - dispatch(setSel(state, selection)); - return true; -}; -/** -Simplify the current selection. When multiple ranges are selected, -reduce it to its main range. Otherwise, if the selection is -non-empty, convert it to a cursor selection. -*/ -const simplifySelection = ({ state, dispatch }) => { - let cur = state.selection, selection = null; - if (cur.ranges.length > 1) - selection = _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create([cur.main]); - else if (!cur.main.empty) - selection = _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create([_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(cur.main.head)]); - if (!selection) - return false; - dispatch(setSel(state, selection)); - return true; -}; -function deleteBy(target, by) { - if (target.state.readOnly) - return false; - let event = "delete.selection", { state } = target; - let changes = state.changeByRange(range => { - let { from, to } = range; - if (from == to) { - let towards = by(range); - if (towards < from) { - event = "delete.backward"; - towards = skipAtomic(target, towards, false); - } - else if (towards > from) { - event = "delete.forward"; - towards = skipAtomic(target, towards, true); - } - from = Math.min(from, towards); - to = Math.max(to, towards); - } - else { - from = skipAtomic(target, from, false); - to = skipAtomic(target, to, true); - } - return from == to ? { range } : { changes: { from, to }, range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(from, from < range.head ? -1 : 1) }; - }); - if (changes.changes.empty) - return false; - target.dispatch(state.update(changes, { - scrollIntoView: true, - userEvent: event, - effects: event == "delete.selection" ? _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.announce.of(state.phrase("Selection deleted")) : undefined - })); - return true; -} -function skipAtomic(target, pos, forward) { - if (target instanceof _codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView) - for (let ranges of target.state.facet(_codemirror_view__WEBPACK_IMPORTED_MODULE_2__.EditorView.atomicRanges).map(f => f(target))) - ranges.between(pos, pos, (from, to) => { - if (from < pos && to > pos) - pos = forward ? to : from; - }); - return pos; -} -const deleteByChar = (target, forward, byIndentUnit) => deleteBy(target, range => { - let pos = range.from, { state } = target, line = state.doc.lineAt(pos), before, targetPos; - if (byIndentUnit && !forward && pos > line.from && pos < line.from + 200 && - !/[^ \t]/.test(before = line.text.slice(0, pos - line.from))) { - if (before[before.length - 1] == "\t") - return pos - 1; - let col = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.countColumn)(before, state.tabSize), drop = col % (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.getIndentUnit)(state) || (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.getIndentUnit)(state); - for (let i = 0; i < drop && before[before.length - 1 - i] == " "; i++) - pos--; - targetPos = pos; - } - else { - targetPos = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, pos - line.from, forward, forward) + line.from; - if (targetPos == pos && line.number != (forward ? state.doc.lines : 1)) - targetPos += forward ? 1 : -1; - else if (!forward && /[\ufe00-\ufe0f]/.test(line.text.slice(targetPos - line.from, pos - line.from))) - targetPos = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, targetPos - line.from, false, false) + line.from; - } - return targetPos; -}); -/** -Delete the selection, or, for cursor selections, the character or -indentation unit before the cursor. -*/ -const deleteCharBackward = view => deleteByChar(view, false, true); -/** -Delete the selection or the character before the cursor. Does not -implement any extended behavior like deleting whole indentation -units in one go. -*/ -const deleteCharBackwardStrict = view => deleteByChar(view, false, false); -/** -Delete the selection or the character after the cursor. -*/ -const deleteCharForward = view => deleteByChar(view, true, false); -const deleteByGroup = (target, forward) => deleteBy(target, range => { - let pos = range.head, { state } = target, line = state.doc.lineAt(pos); - let categorize = state.charCategorizer(pos); - for (let cat = null;;) { - if (pos == (forward ? line.to : line.from)) { - if (pos == range.head && line.number != (forward ? state.doc.lines : 1)) - pos += forward ? 1 : -1; - break; - } - let next = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, pos - line.from, forward) + line.from; - let nextChar = line.text.slice(Math.min(pos, next) - line.from, Math.max(pos, next) - line.from); - let nextCat = categorize(nextChar); - if (cat != null && nextCat != cat) - break; - if (nextChar != " " || pos != range.head) - cat = nextCat; - pos = next; - } - return pos; -}); -/** -Delete the selection or backward until the end of the next -[group](https://codemirror.net/6/docs/ref/#view.EditorView.moveByGroup), only skipping groups of -whitespace when they consist of a single space. -*/ -const deleteGroupBackward = target => deleteByGroup(target, false); -/** -Delete the selection or forward until the end of the next group. -*/ -const deleteGroupForward = target => deleteByGroup(target, true); -/** -Delete the selection, or, if it is a cursor selection, delete to -the end of the line. If the cursor is directly at the end of the -line, delete the line break after it. -*/ -const deleteToLineEnd = view => deleteBy(view, range => { - let lineEnd = view.lineBlockAt(range.head).to; - return range.head < lineEnd ? lineEnd : Math.min(view.state.doc.length, range.head + 1); -}); -/** -Delete the selection, or, if it is a cursor selection, delete to -the start of the line. If the cursor is directly at the start of the -line, delete the line break before it. -*/ -const deleteToLineStart = view => deleteBy(view, range => { - let lineStart = view.lineBlockAt(range.head).from; - return range.head > lineStart ? lineStart : Math.max(0, range.head - 1); -}); -/** -Delete the selection, or, if it is a cursor selection, delete to -the start of the line or the next line wrap before the cursor. -*/ -const deleteLineBoundaryBackward = view => deleteBy(view, range => { - let lineStart = view.moveToLineBoundary(range, false).head; - return range.head > lineStart ? lineStart : Math.max(0, range.head - 1); -}); -/** -Delete the selection, or, if it is a cursor selection, delete to -the end of the line or the next line wrap after the cursor. -*/ -const deleteLineBoundaryForward = view => deleteBy(view, range => { - let lineStart = view.moveToLineBoundary(range, true).head; - return range.head < lineStart ? lineStart : Math.min(view.state.doc.length, range.head + 1); -}); -/** -Delete all whitespace directly before a line end from the -document. -*/ -const deleteTrailingWhitespace = ({ state, dispatch }) => { - if (state.readOnly) - return false; - let changes = []; - for (let pos = 0, prev = "", iter = state.doc.iter();;) { - iter.next(); - if (iter.lineBreak || iter.done) { - let trailing = prev.search(/\s+$/); - if (trailing > -1) - changes.push({ from: pos - (prev.length - trailing), to: pos }); - if (iter.done) - break; - prev = ""; - } - else { - prev = iter.value; - } - pos += iter.value.length; - } - if (!changes.length) - return false; - dispatch(state.update({ changes, userEvent: "delete" })); - return true; -}; -/** -Replace each selection range with a line break, leaving the cursor -on the line before the break. -*/ -const splitLine = ({ state, dispatch }) => { - if (state.readOnly) - return false; - let changes = state.changeByRange(range => { - return { changes: { from: range.from, to: range.to, insert: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Text.of(["", ""]) }, - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.from) }; - }); - dispatch(state.update(changes, { scrollIntoView: true, userEvent: "input" })); - return true; -}; -/** -Flip the characters before and after the cursor(s). -*/ -const transposeChars = ({ state, dispatch }) => { - if (state.readOnly) - return false; - let changes = state.changeByRange(range => { - if (!range.empty || range.from == 0 || range.from == state.doc.length) - return { range }; - let pos = range.from, line = state.doc.lineAt(pos); - let from = pos == line.from ? pos - 1 : (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, pos - line.from, false) + line.from; - let to = pos == line.to ? pos + 1 : (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.findClusterBreak)(line.text, pos - line.from, true) + line.from; - return { changes: { from, to, insert: state.doc.slice(pos, to).append(state.doc.slice(from, pos)) }, - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(to) }; - }); - if (changes.changes.empty) - return false; - dispatch(state.update(changes, { scrollIntoView: true, userEvent: "move.character" })); - return true; -}; -function selectedLineBlocks(state) { - let blocks = [], upto = -1; - for (let range of state.selection.ranges) { - let startLine = state.doc.lineAt(range.from), endLine = state.doc.lineAt(range.to); - if (!range.empty && range.to == endLine.from) - endLine = state.doc.lineAt(range.to - 1); - if (upto >= startLine.number) { - let prev = blocks[blocks.length - 1]; - prev.to = endLine.to; - prev.ranges.push(range); - } - else { - blocks.push({ from: startLine.from, to: endLine.to, ranges: [range] }); - } - upto = endLine.number + 1; - } - return blocks; -} -function moveLine(state, dispatch, forward) { - if (state.readOnly) - return false; - let changes = [], ranges = []; - for (let block of selectedLineBlocks(state)) { - if (forward ? block.to == state.doc.length : block.from == 0) - continue; - let nextLine = state.doc.lineAt(forward ? block.to + 1 : block.from - 1); - let size = nextLine.length + 1; - if (forward) { - changes.push({ from: block.to, to: nextLine.to }, { from: block.from, insert: nextLine.text + state.lineBreak }); - for (let r of block.ranges) - ranges.push(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(Math.min(state.doc.length, r.anchor + size), Math.min(state.doc.length, r.head + size))); - } - else { - changes.push({ from: nextLine.from, to: block.from }, { from: block.to, insert: state.lineBreak + nextLine.text }); - for (let r of block.ranges) - ranges.push(_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(r.anchor - size, r.head - size)); - } - } - if (!changes.length) - return false; - dispatch(state.update({ - changes, - scrollIntoView: true, - selection: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.create(ranges, state.selection.mainIndex), - userEvent: "move.line" - })); - return true; -} -/** -Move the selected lines up one line. -*/ -const moveLineUp = ({ state, dispatch }) => moveLine(state, dispatch, false); -/** -Move the selected lines down one line. -*/ -const moveLineDown = ({ state, dispatch }) => moveLine(state, dispatch, true); -function copyLine(state, dispatch, forward) { - if (state.readOnly) - return false; - let changes = []; - for (let block of selectedLineBlocks(state)) { - if (forward) - changes.push({ from: block.from, insert: state.doc.slice(block.from, block.to) + state.lineBreak }); - else - changes.push({ from: block.to, insert: state.lineBreak + state.doc.slice(block.from, block.to) }); - } - dispatch(state.update({ changes, scrollIntoView: true, userEvent: "input.copyline" })); - return true; -} -/** -Create a copy of the selected lines. Keep the selection in the top copy. -*/ -const copyLineUp = ({ state, dispatch }) => copyLine(state, dispatch, false); -/** -Create a copy of the selected lines. Keep the selection in the bottom copy. -*/ -const copyLineDown = ({ state, dispatch }) => copyLine(state, dispatch, true); -/** -Delete selected lines. -*/ -const deleteLine = view => { - if (view.state.readOnly) - return false; - let { state } = view, changes = state.changes(selectedLineBlocks(state).map(({ from, to }) => { - if (from > 0) - from--; - else if (to < state.doc.length) - to++; - return { from, to }; - })); - let selection = updateSel(state.selection, range => { - let dist = undefined; - if (view.lineWrapping) { - let block = view.lineBlockAt(range.head), pos = view.coordsAtPos(range.head, range.assoc || 1); - if (pos) - dist = (block.bottom + view.documentTop) - pos.bottom + view.defaultLineHeight / 2; - } - return view.moveVertically(range, true, dist); - }).map(changes); - view.dispatch({ changes, selection, scrollIntoView: true, userEvent: "delete.line" }); - return true; -}; -/** -Replace the selection with a newline. -*/ -const insertNewline = ({ state, dispatch }) => { - dispatch(state.update(state.replaceSelection(state.lineBreak), { scrollIntoView: true, userEvent: "input" })); - return true; -}; -/** -Replace the selection with a newline and the same amount of -indentation as the line above. -*/ -const insertNewlineKeepIndent = ({ state, dispatch }) => { - dispatch(state.update(state.changeByRange(range => { - let indent = /^\s*/.exec(state.doc.lineAt(range.from).text)[0]; - return { - changes: { from: range.from, to: range.to, insert: state.lineBreak + indent }, - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(range.from + indent.length + 1) - }; - }), { scrollIntoView: true, userEvent: "input" })); - return true; -}; -function isBetweenBrackets(state, pos) { - if (/\(\)|\[\]|\{\}/.test(state.sliceDoc(pos - 1, pos + 1))) - return { from: pos, to: pos }; - let context = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.syntaxTree)(state).resolveInner(pos); - let before = context.childBefore(pos), after = context.childAfter(pos), closedBy; - if (before && after && before.to <= pos && after.from >= pos && - (closedBy = before.type.prop(_lezer_common__WEBPACK_IMPORTED_MODULE_0__.NodeProp.closedBy)) && closedBy.indexOf(after.name) > -1 && - state.doc.lineAt(before.to).from == state.doc.lineAt(after.from).from && - !/\S/.test(state.sliceDoc(before.to, after.from))) - return { from: before.to, to: after.from }; - return null; -} -/** -Replace the selection with a newline and indent the newly created -line(s). If the current line consists only of whitespace, this -will also delete that whitespace. When the cursor is between -matching brackets, an additional newline will be inserted after -the cursor. -*/ -const insertNewlineAndIndent = /*@__PURE__*/newlineAndIndent(false); -/** -Create a blank, indented line below the current line. -*/ -const insertBlankLine = /*@__PURE__*/newlineAndIndent(true); -function newlineAndIndent(atEof) { - return ({ state, dispatch }) => { - if (state.readOnly) - return false; - let changes = state.changeByRange(range => { - let { from, to } = range, line = state.doc.lineAt(from); - let explode = !atEof && from == to && isBetweenBrackets(state, from); - if (atEof) - from = to = (to <= line.to ? line : state.doc.lineAt(to)).to; - let cx = new _codemirror_language__WEBPACK_IMPORTED_MODULE_3__.IndentContext(state, { simulateBreak: from, simulateDoubleBreak: !!explode }); - let indent = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.getIndentation)(cx, from); - if (indent == null) - indent = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.countColumn)(/^\s*/.exec(state.doc.lineAt(from).text)[0], state.tabSize); - while (to < line.to && /\s/.test(line.text[to - line.from])) - to++; - if (explode) - ({ from, to } = explode); - else if (from > line.from && from < line.from + 100 && !/\S/.test(line.text.slice(0, from))) - from = line.from; - let insert = ["", (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.indentString)(state, indent)]; - if (explode) - insert.push((0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.indentString)(state, cx.lineIndent(line.from, -1))); - return { changes: { from, to, insert: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.Text.of(insert) }, - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.cursor(from + 1 + insert[1].length) }; - }); - dispatch(state.update(changes, { scrollIntoView: true, userEvent: "input" })); - return true; - }; -} -function changeBySelectedLine(state, f) { - let atLine = -1; - return state.changeByRange(range => { - let changes = []; - for (let pos = range.from; pos <= range.to;) { - let line = state.doc.lineAt(pos); - if (line.number > atLine && (range.empty || range.to > line.from)) { - f(line, changes, range); - atLine = line.number; - } - pos = line.to + 1; - } - let changeSet = state.changes(changes); - return { changes, - range: _codemirror_state__WEBPACK_IMPORTED_MODULE_1__.EditorSelection.range(changeSet.mapPos(range.anchor, 1), changeSet.mapPos(range.head, 1)) }; - }); -} -/** -Auto-indent the selected lines. This uses the [indentation service -facet](https://codemirror.net/6/docs/ref/#language.indentService) as source for auto-indent -information. -*/ -const indentSelection = ({ state, dispatch }) => { - if (state.readOnly) - return false; - let updated = Object.create(null); - let context = new _codemirror_language__WEBPACK_IMPORTED_MODULE_3__.IndentContext(state, { overrideIndentation: start => { - let found = updated[start]; - return found == null ? -1 : found; - } }); - let changes = changeBySelectedLine(state, (line, changes, range) => { - let indent = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.getIndentation)(context, line.from); - if (indent == null) - return; - if (!/\S/.test(line.text)) - indent = 0; - let cur = /^\s*/.exec(line.text)[0]; - let norm = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.indentString)(state, indent); - if (cur != norm || range.from < line.from + cur.length) { - updated[line.from] = indent; - changes.push({ from: line.from, to: line.from + cur.length, insert: norm }); - } - }); - if (!changes.changes.empty) - dispatch(state.update(changes, { userEvent: "indent" })); - return true; -}; -/** -Add a [unit](https://codemirror.net/6/docs/ref/#language.indentUnit) of indentation to all selected -lines. -*/ -const indentMore = ({ state, dispatch }) => { - if (state.readOnly) - return false; - dispatch(state.update(changeBySelectedLine(state, (line, changes) => { - changes.push({ from: line.from, insert: state.facet(_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.indentUnit) }); - }), { userEvent: "input.indent" })); - return true; -}; -/** -Remove a [unit](https://codemirror.net/6/docs/ref/#language.indentUnit) of indentation from all -selected lines. -*/ -const indentLess = ({ state, dispatch }) => { - if (state.readOnly) - return false; - dispatch(state.update(changeBySelectedLine(state, (line, changes) => { - let space = /^\s*/.exec(line.text)[0]; - if (!space) - return; - let col = (0,_codemirror_state__WEBPACK_IMPORTED_MODULE_1__.countColumn)(space, state.tabSize), keep = 0; - let insert = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.indentString)(state, Math.max(0, col - (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_3__.getIndentUnit)(state))); - while (keep < space.length && keep < insert.length && space.charCodeAt(keep) == insert.charCodeAt(keep)) - keep++; - changes.push({ from: line.from + keep, to: line.from + space.length, insert: insert.slice(keep) }); - }), { userEvent: "delete.dedent" })); - return true; -}; -/** -Enables or disables -[tab-focus mode](https://codemirror.net/6/docs/ref/#view.EditorView.setTabFocusMode). While on, this -prevents the editor's key bindings from capturing Tab or -Shift-Tab, making it possible for the user to move focus out of -the editor with the keyboard. -*/ -const toggleTabFocusMode = view => { - view.setTabFocusMode(); - return true; -}; -/** -Temporarily enables [tab-focus -mode](https://codemirror.net/6/docs/ref/#view.EditorView.setTabFocusMode) for two seconds or until -another key is pressed. -*/ -const temporarilySetTabFocusMode = view => { - view.setTabFocusMode(2000); - return true; -}; -/** -Insert a tab character at the cursor or, if something is selected, -use [`indentMore`](https://codemirror.net/6/docs/ref/#commands.indentMore) to indent the entire -selection. -*/ -const insertTab = ({ state, dispatch }) => { - if (state.selection.ranges.some(r => !r.empty)) - return indentMore({ state, dispatch }); - dispatch(state.update(state.replaceSelection("\t"), { scrollIntoView: true, userEvent: "input" })); - return true; -}; -/** -Array of key bindings containing the Emacs-style bindings that are -available on macOS by default. - - - Ctrl-b: [`cursorCharLeft`](https://codemirror.net/6/docs/ref/#commands.cursorCharLeft) ([`selectCharLeft`](https://codemirror.net/6/docs/ref/#commands.selectCharLeft) with Shift) - - Ctrl-f: [`cursorCharRight`](https://codemirror.net/6/docs/ref/#commands.cursorCharRight) ([`selectCharRight`](https://codemirror.net/6/docs/ref/#commands.selectCharRight) with Shift) - - Ctrl-p: [`cursorLineUp`](https://codemirror.net/6/docs/ref/#commands.cursorLineUp) ([`selectLineUp`](https://codemirror.net/6/docs/ref/#commands.selectLineUp) with Shift) - - Ctrl-n: [`cursorLineDown`](https://codemirror.net/6/docs/ref/#commands.cursorLineDown) ([`selectLineDown`](https://codemirror.net/6/docs/ref/#commands.selectLineDown) with Shift) - - Ctrl-a: [`cursorLineStart`](https://codemirror.net/6/docs/ref/#commands.cursorLineStart) ([`selectLineStart`](https://codemirror.net/6/docs/ref/#commands.selectLineStart) with Shift) - - Ctrl-e: [`cursorLineEnd`](https://codemirror.net/6/docs/ref/#commands.cursorLineEnd) ([`selectLineEnd`](https://codemirror.net/6/docs/ref/#commands.selectLineEnd) with Shift) - - Ctrl-d: [`deleteCharForward`](https://codemirror.net/6/docs/ref/#commands.deleteCharForward) - - Ctrl-h: [`deleteCharBackward`](https://codemirror.net/6/docs/ref/#commands.deleteCharBackward) - - Ctrl-k: [`deleteToLineEnd`](https://codemirror.net/6/docs/ref/#commands.deleteToLineEnd) - - Ctrl-Alt-h: [`deleteGroupBackward`](https://codemirror.net/6/docs/ref/#commands.deleteGroupBackward) - - Ctrl-o: [`splitLine`](https://codemirror.net/6/docs/ref/#commands.splitLine) - - Ctrl-t: [`transposeChars`](https://codemirror.net/6/docs/ref/#commands.transposeChars) - - Ctrl-v: [`cursorPageDown`](https://codemirror.net/6/docs/ref/#commands.cursorPageDown) - - Alt-v: [`cursorPageUp`](https://codemirror.net/6/docs/ref/#commands.cursorPageUp) -*/ -const emacsStyleKeymap = [ - { key: "Ctrl-b", run: cursorCharLeft, shift: selectCharLeft, preventDefault: true }, - { key: "Ctrl-f", run: cursorCharRight, shift: selectCharRight }, - { key: "Ctrl-p", run: cursorLineUp, shift: selectLineUp }, - { key: "Ctrl-n", run: cursorLineDown, shift: selectLineDown }, - { key: "Ctrl-a", run: cursorLineStart, shift: selectLineStart }, - { key: "Ctrl-e", run: cursorLineEnd, shift: selectLineEnd }, - { key: "Ctrl-d", run: deleteCharForward }, - { key: "Ctrl-h", run: deleteCharBackward }, - { key: "Ctrl-k", run: deleteToLineEnd }, - { key: "Ctrl-Alt-h", run: deleteGroupBackward }, - { key: "Ctrl-o", run: splitLine }, - { key: "Ctrl-t", run: transposeChars }, - { key: "Ctrl-v", run: cursorPageDown }, -]; -/** -An array of key bindings closely sticking to platform-standard or -widely used bindings. (This includes the bindings from -[`emacsStyleKeymap`](https://codemirror.net/6/docs/ref/#commands.emacsStyleKeymap), with their `key` -property changed to `mac`.) - - - ArrowLeft: [`cursorCharLeft`](https://codemirror.net/6/docs/ref/#commands.cursorCharLeft) ([`selectCharLeft`](https://codemirror.net/6/docs/ref/#commands.selectCharLeft) with Shift) - - ArrowRight: [`cursorCharRight`](https://codemirror.net/6/docs/ref/#commands.cursorCharRight) ([`selectCharRight`](https://codemirror.net/6/docs/ref/#commands.selectCharRight) with Shift) - - Ctrl-ArrowLeft (Alt-ArrowLeft on macOS): [`cursorGroupLeft`](https://codemirror.net/6/docs/ref/#commands.cursorGroupLeft) ([`selectGroupLeft`](https://codemirror.net/6/docs/ref/#commands.selectGroupLeft) with Shift) - - Ctrl-ArrowRight (Alt-ArrowRight on macOS): [`cursorGroupRight`](https://codemirror.net/6/docs/ref/#commands.cursorGroupRight) ([`selectGroupRight`](https://codemirror.net/6/docs/ref/#commands.selectGroupRight) with Shift) - - Cmd-ArrowLeft (on macOS): [`cursorLineStart`](https://codemirror.net/6/docs/ref/#commands.cursorLineStart) ([`selectLineStart`](https://codemirror.net/6/docs/ref/#commands.selectLineStart) with Shift) - - Cmd-ArrowRight (on macOS): [`cursorLineEnd`](https://codemirror.net/6/docs/ref/#commands.cursorLineEnd) ([`selectLineEnd`](https://codemirror.net/6/docs/ref/#commands.selectLineEnd) with Shift) - - ArrowUp: [`cursorLineUp`](https://codemirror.net/6/docs/ref/#commands.cursorLineUp) ([`selectLineUp`](https://codemirror.net/6/docs/ref/#commands.selectLineUp) with Shift) - - ArrowDown: [`cursorLineDown`](https://codemirror.net/6/docs/ref/#commands.cursorLineDown) ([`selectLineDown`](https://codemirror.net/6/docs/ref/#commands.selectLineDown) with Shift) - - Cmd-ArrowUp (on macOS): [`cursorDocStart`](https://codemirror.net/6/docs/ref/#commands.cursorDocStart) ([`selectDocStart`](https://codemirror.net/6/docs/ref/#commands.selectDocStart) with Shift) - - Cmd-ArrowDown (on macOS): [`cursorDocEnd`](https://codemirror.net/6/docs/ref/#commands.cursorDocEnd) ([`selectDocEnd`](https://codemirror.net/6/docs/ref/#commands.selectDocEnd) with Shift) - - Ctrl-ArrowUp (on macOS): [`cursorPageUp`](https://codemirror.net/6/docs/ref/#commands.cursorPageUp) ([`selectPageUp`](https://codemirror.net/6/docs/ref/#commands.selectPageUp) with Shift) - - Ctrl-ArrowDown (on macOS): [`cursorPageDown`](https://codemirror.net/6/docs/ref/#commands.cursorPageDown) ([`selectPageDown`](https://codemirror.net/6/docs/ref/#commands.selectPageDown) with Shift) - - PageUp: [`cursorPageUp`](https://codemirror.net/6/docs/ref/#commands.cursorPageUp) ([`selectPageUp`](https://codemirror.net/6/docs/ref/#commands.selectPageUp) with Shift) - - PageDown: [`cursorPageDown`](https://codemirror.net/6/docs/ref/#commands.cursorPageDown) ([`selectPageDown`](https://codemirror.net/6/docs/ref/#commands.selectPageDown) with Shift) - - Home: [`cursorLineBoundaryBackward`](https://codemirror.net/6/docs/ref/#commands.cursorLineBoundaryBackward) ([`selectLineBoundaryBackward`](https://codemirror.net/6/docs/ref/#commands.selectLineBoundaryBackward) with Shift) - - End: [`cursorLineBoundaryForward`](https://codemirror.net/6/docs/ref/#commands.cursorLineBoundaryForward) ([`selectLineBoundaryForward`](https://codemirror.net/6/docs/ref/#commands.selectLineBoundaryForward) with Shift) - - Ctrl-Home (Cmd-Home on macOS): [`cursorDocStart`](https://codemirror.net/6/docs/ref/#commands.cursorDocStart) ([`selectDocStart`](https://codemirror.net/6/docs/ref/#commands.selectDocStart) with Shift) - - Ctrl-End (Cmd-Home on macOS): [`cursorDocEnd`](https://codemirror.net/6/docs/ref/#commands.cursorDocEnd) ([`selectDocEnd`](https://codemirror.net/6/docs/ref/#commands.selectDocEnd) with Shift) - - Enter and Shift-Enter: [`insertNewlineAndIndent`](https://codemirror.net/6/docs/ref/#commands.insertNewlineAndIndent) - - Ctrl-a (Cmd-a on macOS): [`selectAll`](https://codemirror.net/6/docs/ref/#commands.selectAll) - - Backspace: [`deleteCharBackward`](https://codemirror.net/6/docs/ref/#commands.deleteCharBackward) - - Delete: [`deleteCharForward`](https://codemirror.net/6/docs/ref/#commands.deleteCharForward) - - Ctrl-Backspace (Alt-Backspace on macOS): [`deleteGroupBackward`](https://codemirror.net/6/docs/ref/#commands.deleteGroupBackward) - - Ctrl-Delete (Alt-Delete on macOS): [`deleteGroupForward`](https://codemirror.net/6/docs/ref/#commands.deleteGroupForward) - - Cmd-Backspace (macOS): [`deleteLineBoundaryBackward`](https://codemirror.net/6/docs/ref/#commands.deleteLineBoundaryBackward). - - Cmd-Delete (macOS): [`deleteLineBoundaryForward`](https://codemirror.net/6/docs/ref/#commands.deleteLineBoundaryForward). -*/ -const standardKeymap = /*@__PURE__*/[ - { key: "ArrowLeft", run: cursorCharLeft, shift: selectCharLeft, preventDefault: true }, - { key: "Mod-ArrowLeft", mac: "Alt-ArrowLeft", run: cursorGroupLeft, shift: selectGroupLeft, preventDefault: true }, - { mac: "Cmd-ArrowLeft", run: cursorLineBoundaryLeft, shift: selectLineBoundaryLeft, preventDefault: true }, - { key: "ArrowRight", run: cursorCharRight, shift: selectCharRight, preventDefault: true }, - { key: "Mod-ArrowRight", mac: "Alt-ArrowRight", run: cursorGroupRight, shift: selectGroupRight, preventDefault: true }, - { mac: "Cmd-ArrowRight", run: cursorLineBoundaryRight, shift: selectLineBoundaryRight, preventDefault: true }, - { key: "ArrowUp", run: cursorLineUp, shift: selectLineUp, preventDefault: true }, - { mac: "Cmd-ArrowUp", run: cursorDocStart, shift: selectDocStart }, - { mac: "Ctrl-ArrowUp", run: cursorPageUp, shift: selectPageUp }, - { key: "ArrowDown", run: cursorLineDown, shift: selectLineDown, preventDefault: true }, - { mac: "Cmd-ArrowDown", run: cursorDocEnd, shift: selectDocEnd }, - { mac: "Ctrl-ArrowDown", run: cursorPageDown, shift: selectPageDown }, - { key: "PageUp", run: cursorPageUp, shift: selectPageUp }, - { key: "PageDown", run: cursorPageDown, shift: selectPageDown }, - { key: "Home", run: cursorLineBoundaryBackward, shift: selectLineBoundaryBackward, preventDefault: true }, - { key: "Mod-Home", run: cursorDocStart, shift: selectDocStart }, - { key: "End", run: cursorLineBoundaryForward, shift: selectLineBoundaryForward, preventDefault: true }, - { key: "Mod-End", run: cursorDocEnd, shift: selectDocEnd }, - { key: "Enter", run: insertNewlineAndIndent, shift: insertNewlineAndIndent }, - { key: "Mod-a", run: selectAll }, - { key: "Backspace", run: deleteCharBackward, shift: deleteCharBackward }, - { key: "Delete", run: deleteCharForward }, - { key: "Mod-Backspace", mac: "Alt-Backspace", run: deleteGroupBackward }, - { key: "Mod-Delete", mac: "Alt-Delete", run: deleteGroupForward }, - { mac: "Mod-Backspace", run: deleteLineBoundaryBackward }, - { mac: "Mod-Delete", run: deleteLineBoundaryForward } -].concat(/*@__PURE__*/emacsStyleKeymap.map(b => ({ mac: b.key, run: b.run, shift: b.shift }))); -/** -The default keymap. Includes all bindings from -[`standardKeymap`](https://codemirror.net/6/docs/ref/#commands.standardKeymap) plus the following: - -- Alt-ArrowLeft (Ctrl-ArrowLeft on macOS): [`cursorSyntaxLeft`](https://codemirror.net/6/docs/ref/#commands.cursorSyntaxLeft) ([`selectSyntaxLeft`](https://codemirror.net/6/docs/ref/#commands.selectSyntaxLeft) with Shift) -- Alt-ArrowRight (Ctrl-ArrowRight on macOS): [`cursorSyntaxRight`](https://codemirror.net/6/docs/ref/#commands.cursorSyntaxRight) ([`selectSyntaxRight`](https://codemirror.net/6/docs/ref/#commands.selectSyntaxRight) with Shift) -- Alt-ArrowUp: [`moveLineUp`](https://codemirror.net/6/docs/ref/#commands.moveLineUp) -- Alt-ArrowDown: [`moveLineDown`](https://codemirror.net/6/docs/ref/#commands.moveLineDown) -- Shift-Alt-ArrowUp: [`copyLineUp`](https://codemirror.net/6/docs/ref/#commands.copyLineUp) -- Shift-Alt-ArrowDown: [`copyLineDown`](https://codemirror.net/6/docs/ref/#commands.copyLineDown) -- Escape: [`simplifySelection`](https://codemirror.net/6/docs/ref/#commands.simplifySelection) -- Ctrl-Enter (Cmd-Enter on macOS): [`insertBlankLine`](https://codemirror.net/6/docs/ref/#commands.insertBlankLine) -- Alt-l (Ctrl-l on macOS): [`selectLine`](https://codemirror.net/6/docs/ref/#commands.selectLine) -- Ctrl-i (Cmd-i on macOS): [`selectParentSyntax`](https://codemirror.net/6/docs/ref/#commands.selectParentSyntax) -- Ctrl-[ (Cmd-[ on macOS): [`indentLess`](https://codemirror.net/6/docs/ref/#commands.indentLess) -- Ctrl-] (Cmd-] on macOS): [`indentMore`](https://codemirror.net/6/docs/ref/#commands.indentMore) -- Ctrl-Alt-\\ (Cmd-Alt-\\ on macOS): [`indentSelection`](https://codemirror.net/6/docs/ref/#commands.indentSelection) -- Shift-Ctrl-k (Shift-Cmd-k on macOS): [`deleteLine`](https://codemirror.net/6/docs/ref/#commands.deleteLine) -- Shift-Ctrl-\\ (Shift-Cmd-\\ on macOS): [`cursorMatchingBracket`](https://codemirror.net/6/docs/ref/#commands.cursorMatchingBracket) -- Ctrl-/ (Cmd-/ on macOS): [`toggleComment`](https://codemirror.net/6/docs/ref/#commands.toggleComment). -- Shift-Alt-a: [`toggleBlockComment`](https://codemirror.net/6/docs/ref/#commands.toggleBlockComment). -- Ctrl-m (Alt-Shift-m on macOS): [`toggleTabFocusMode`](https://codemirror.net/6/docs/ref/#commands.toggleTabFocusMode). -*/ -const defaultKeymap = /*@__PURE__*/[ - { key: "Alt-ArrowLeft", mac: "Ctrl-ArrowLeft", run: cursorSyntaxLeft, shift: selectSyntaxLeft }, - { key: "Alt-ArrowRight", mac: "Ctrl-ArrowRight", run: cursorSyntaxRight, shift: selectSyntaxRight }, - { key: "Alt-ArrowUp", run: moveLineUp }, - { key: "Shift-Alt-ArrowUp", run: copyLineUp }, - { key: "Alt-ArrowDown", run: moveLineDown }, - { key: "Shift-Alt-ArrowDown", run: copyLineDown }, - { key: "Escape", run: simplifySelection }, - { key: "Mod-Enter", run: insertBlankLine }, - { key: "Alt-l", mac: "Ctrl-l", run: selectLine }, - { key: "Mod-i", run: selectParentSyntax, preventDefault: true }, - { key: "Mod-[", run: indentLess }, - { key: "Mod-]", run: indentMore }, - { key: "Mod-Alt-\\", run: indentSelection }, - { key: "Shift-Mod-k", run: deleteLine }, - { key: "Shift-Mod-\\", run: cursorMatchingBracket }, - { key: "Mod-/", run: toggleComment }, - { key: "Alt-A", run: toggleBlockComment }, - { key: "Ctrl-m", mac: "Shift-Alt-m", run: toggleTabFocusMode }, -].concat(standardKeymap); -/** -A binding that binds Tab to [`indentMore`](https://codemirror.net/6/docs/ref/#commands.indentMore) and -Shift-Tab to [`indentLess`](https://codemirror.net/6/docs/ref/#commands.indentLess). -Please see the [Tab example](../../examples/tab/) before using -this. -*/ -const indentWithTab = { key: "Tab", run: indentMore, shift: indentLess }; - - - - -/***/ }), - -/***/ "./node_modules/@codemirror/lang-css/dist/index.js": -/*!*********************************************************!*\ - !*** ./node_modules/@codemirror/lang-css/dist/index.js ***! - \*********************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ css: () => (/* binding */ css), -/* harmony export */ cssCompletionSource: () => (/* binding */ cssCompletionSource), -/* harmony export */ cssLanguage: () => (/* binding */ cssLanguage), -/* harmony export */ defineCSSCompletionSource: () => (/* binding */ defineCSSCompletionSource) -/* harmony export */ }); -/* harmony import */ var _lezer_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lezer/css */ "./node_modules/@lezer/css/dist/index.js"); -/* harmony import */ var _codemirror_language__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @codemirror/language */ "./node_modules/@codemirror/language/dist/index.js"); -/* harmony import */ var _lezer_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lezer/common */ "./node_modules/@lezer/common/dist/index.js"); - - - - -let _properties = null; -function properties() { - if (!_properties && typeof document == "object" && document.body) { - let { style } = document.body, names = [], seen = new Set; - for (let prop in style) - if (prop != "cssText" && prop != "cssFloat") { - if (typeof style[prop] == "string") { - if (/[A-Z]/.test(prop)) - prop = prop.replace(/[A-Z]/g, ch => "-" + ch.toLowerCase()); - if (!seen.has(prop)) { - names.push(prop); - seen.add(prop); - } - } - } - _properties = names.sort().map(name => ({ type: "property", label: name, apply: name + ": " })); - } - return _properties || []; -} -const pseudoClasses = /*@__PURE__*/[ - "active", "after", "any-link", "autofill", "backdrop", "before", - "checked", "cue", "default", "defined", "disabled", "empty", - "enabled", "file-selector-button", "first", "first-child", - "first-letter", "first-line", "first-of-type", "focus", - "focus-visible", "focus-within", "fullscreen", "has", "host", - "host-context", "hover", "in-range", "indeterminate", "invalid", - "is", "lang", "last-child", "last-of-type", "left", "link", "marker", - "modal", "not", "nth-child", "nth-last-child", "nth-last-of-type", - "nth-of-type", "only-child", "only-of-type", "optional", "out-of-range", - "part", "placeholder", "placeholder-shown", "read-only", "read-write", - "required", "right", "root", "scope", "selection", "slotted", "target", - "target-text", "valid", "visited", "where" -].map(name => ({ type: "class", label: name })); -const values = /*@__PURE__*/[ - "above", "absolute", "activeborder", "additive", "activecaption", "after-white-space", - "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", "always", - "antialiased", "appworkspace", "asterisks", "attr", "auto", "auto-flow", "avoid", "avoid-column", - "avoid-page", "avoid-region", "axis-pan", "background", "backwards", "baseline", "below", - "bidi-override", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", - "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", - "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "capitalize", - "caps-lock-indicator", "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", - "cjk-decimal", "clear", "clip", "close-quote", "col-resize", "collapse", "color", "color-burn", - "color-dodge", "column", "column-reverse", "compact", "condensed", "contain", "content", - "contents", "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", - "crop", "cross", "crosshair", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal", - "decimal-leading-zero", "default", "default-button", "dense", "destination-atop", "destination-in", - "destination-out", "destination-over", "difference", "disc", "discard", "disclosure-closed", - "disclosure-open", "document", "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", - "ease", "ease-in", "ease-in-out", "ease-out", "element", "ellipse", "ellipsis", "embed", "end", - "ethiopic-abegede-gez", "ethiopic-halehame-aa-er", "ethiopic-halehame-gez", "ew-resize", "exclusion", - "expanded", "extends", "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fill-box", - "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", "forwards", "from", - "geometricPrecision", "graytext", "grid", "groove", "hand", "hard-light", "help", "hidden", "hide", - "higher", "highlight", "highlighttext", "horizontal", "hsl", "hsla", "hue", "icon", "ignore", - "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", - "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-flex", "inline-grid", - "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "justify", "keep-all", - "landscape", "large", "larger", "left", "level", "lighter", "lighten", "line-through", "linear", - "linear-gradient", "lines", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", - "lower-hexadecimal", "lower-latin", "lower-norwegian", "lowercase", "ltr", "luminosity", "manipulation", - "match", "matrix", "matrix3d", "medium", "menu", "menutext", "message-box", "middle", "min-intrinsic", - "mix", "monospace", "move", "multiple", "multiple_mask_images", "multiply", "n-resize", "narrower", - "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none", - "normal", "not-allowed", "nowrap", "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", - "oblique", "opacity", "open-quote", "optimizeLegibility", "optimizeSpeed", "outset", "outside", - "outside-shape", "overlay", "overline", "padding", "padding-box", "painted", "page", "paused", - "perspective", "pinch-zoom", "plus-darker", "plus-lighter", "pointer", "polygon", "portrait", - "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", "radial-gradient", "radio", - "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region", "relative", "repeat", - "repeating-linear-gradient", "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", - "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", "rotateZ", "round", - "row", "row-resize", "row-reverse", "rtl", "run-in", "running", "s-resize", "sans-serif", "saturation", - "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen", "scroll", "scrollbar", "scroll-position", - "se-resize", "self-start", "self-end", "semi-condensed", "semi-expanded", "separate", "serif", "show", - "single", "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", - "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", "small", "small-caps", - "small-caption", "smaller", "soft-light", "solid", "source-atop", "source-in", "source-out", - "source-over", "space", "space-around", "space-between", "space-evenly", "spell-out", "square", "start", - "static", "status-bar", "stretch", "stroke", "stroke-box", "sub", "subpixel-antialiased", "svg_masks", - "super", "sw-resize", "symbolic", "symbols", "system-ui", "table", "table-caption", "table-cell", - "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", - "table-row-group", "text", "text-bottom", "text-top", "textarea", "textfield", "thick", "thin", - "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "to", "top", - "transform", "translate", "translate3d", "translateX", "translateY", "translateZ", "transparent", - "ultra-condensed", "ultra-expanded", "underline", "unidirectional-pan", "unset", "up", "upper-latin", - "uppercase", "url", "var", "vertical", "vertical-text", "view-box", "visible", "visibleFill", - "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", "window", "windowframe", - "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", "xx-large", "xx-small" -].map(name => ({ type: "keyword", label: name })).concat(/*@__PURE__*/[ - "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", - "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", - "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", - "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", - "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", - "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", - "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", - "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", - "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", - "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", - "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", - "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", - "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", - "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", - "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", - "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", - "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", - "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", - "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", - "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", - "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", - "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", - "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", - "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", - "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", - "whitesmoke", "yellow", "yellowgreen" -].map(name => ({ type: "constant", label: name }))); -const tags = /*@__PURE__*/[ - "a", "abbr", "address", "article", "aside", "b", "bdi", "bdo", "blockquote", "body", - "br", "button", "canvas", "caption", "cite", "code", "col", "colgroup", "dd", "del", - "details", "dfn", "dialog", "div", "dl", "dt", "em", "figcaption", "figure", "footer", - "form", "header", "hgroup", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "html", "i", "iframe", - "img", "input", "ins", "kbd", "label", "legend", "li", "main", "meter", "nav", "ol", "output", - "p", "pre", "ruby", "section", "select", "small", "source", "span", "strong", "sub", "summary", - "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "tr", "u", "ul" -].map(name => ({ type: "type", label: name })); -const atRules = /*@__PURE__*/[ - "@charset", "@color-profile", "@container", "@counter-style", "@font-face", "@font-feature-values", - "@font-palette-values", "@import", "@keyframes", "@layer", "@media", "@namespace", "@page", - "@position-try", "@property", "@scope", "@starting-style", "@supports", "@view-transition" -].map(label => ({ type: "keyword", label })); -const identifier = /^(\w[\w-]*|-\w[\w-]*|)$/, variable = /^-(-[\w-]*)?$/; -function isVarArg(node, doc) { - var _a; - if (node.name == "(" || node.type.isError) - node = node.parent || node; - if (node.name != "ArgList") - return false; - let callee = (_a = node.parent) === null || _a === void 0 ? void 0 : _a.firstChild; - if ((callee === null || callee === void 0 ? void 0 : callee.name) != "Callee") - return false; - return doc.sliceString(callee.from, callee.to) == "var"; -} -const VariablesByNode = /*@__PURE__*/new _lezer_common__WEBPACK_IMPORTED_MODULE_1__.NodeWeakMap(); -const declSelector = ["Declaration"]; -function astTop(node) { - for (let cur = node;;) { - if (cur.type.isTop) - return cur; - if (!(cur = cur.parent)) - return node; - } -} -function variableNames(doc, node, isVariable) { - if (node.to - node.from > 4096) { - let known = VariablesByNode.get(node); - if (known) - return known; - let result = [], seen = new Set, cursor = node.cursor(_lezer_common__WEBPACK_IMPORTED_MODULE_1__.IterMode.IncludeAnonymous); - if (cursor.firstChild()) - do { - for (let option of variableNames(doc, cursor.node, isVariable)) - if (!seen.has(option.label)) { - seen.add(option.label); - result.push(option); - } - } while (cursor.nextSibling()); - VariablesByNode.set(node, result); - return result; - } - else { - let result = [], seen = new Set; - node.cursor().iterate(node => { - var _a; - if (isVariable(node) && node.matchContext(declSelector) && ((_a = node.node.nextSibling) === null || _a === void 0 ? void 0 : _a.name) == ":") { - let name = doc.sliceString(node.from, node.to); - if (!seen.has(name)) { - seen.add(name); - result.push({ label: name, type: "variable" }); - } - } - }); - return result; - } -} -/** -Create a completion source for a CSS dialect, providing a -predicate for determining what kind of syntax node can act as a -completable variable. This is used by language modes like Sass and -Less to reuse this package's completion logic. -*/ -const defineCSSCompletionSource = (isVariable) => context => { - let { state, pos } = context, node = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_2__.syntaxTree)(state).resolveInner(pos, -1); - let isDash = node.type.isError && node.from == node.to - 1 && state.doc.sliceString(node.from, node.to) == "-"; - if (node.name == "PropertyName" || - (isDash || node.name == "TagName") && /^(Block|Styles)$/.test(node.resolve(node.to).name)) - return { from: node.from, options: properties(), validFor: identifier }; - if (node.name == "ValueName") - return { from: node.from, options: values, validFor: identifier }; - if (node.name == "PseudoClassName") - return { from: node.from, options: pseudoClasses, validFor: identifier }; - if (isVariable(node) || (context.explicit || isDash) && isVarArg(node, state.doc)) - return { from: isVariable(node) || isDash ? node.from : pos, - options: variableNames(state.doc, astTop(node), isVariable), - validFor: variable }; - if (node.name == "TagName") { - for (let { parent } = node; parent; parent = parent.parent) - if (parent.name == "Block") - return { from: node.from, options: properties(), validFor: identifier }; - return { from: node.from, options: tags, validFor: identifier }; - } - if (node.name == "AtKeyword") - return { from: node.from, options: atRules, validFor: identifier }; - if (!context.explicit) - return null; - let above = node.resolve(pos), before = above.childBefore(pos); - if (before && before.name == ":" && above.name == "PseudoClassSelector") - return { from: pos, options: pseudoClasses, validFor: identifier }; - if (before && before.name == ":" && above.name == "Declaration" || above.name == "ArgList") - return { from: pos, options: values, validFor: identifier }; - if (above.name == "Block" || above.name == "Styles") - return { from: pos, options: properties(), validFor: identifier }; - return null; -}; -/** -CSS property, variable, and value keyword completion source. -*/ -const cssCompletionSource = /*@__PURE__*/defineCSSCompletionSource(n => n.name == "VariableName"); - -/** -A language provider based on the [Lezer CSS -parser](https://github.com/lezer-parser/css), extended with -highlighting and indentation information. -*/ -const cssLanguage = /*@__PURE__*/_codemirror_language__WEBPACK_IMPORTED_MODULE_2__.LRLanguage.define({ - name: "css", - parser: /*@__PURE__*/_lezer_css__WEBPACK_IMPORTED_MODULE_0__.parser.configure({ - props: [ - /*@__PURE__*/_codemirror_language__WEBPACK_IMPORTED_MODULE_2__.indentNodeProp.add({ - Declaration: /*@__PURE__*/(0,_codemirror_language__WEBPACK_IMPORTED_MODULE_2__.continuedIndent)() - }), - /*@__PURE__*/_codemirror_language__WEBPACK_IMPORTED_MODULE_2__.foldNodeProp.add({ - "Block KeyframeList": _codemirror_language__WEBPACK_IMPORTED_MODULE_2__.foldInside - }) - ] - }), - languageData: { - commentTokens: { block: { open: "/*", close: "*/" } }, - indentOnInput: /^\s*\}$/, - wordChars: "-" - } -}); -/** -Language support for CSS. -*/ -function css() { - return new _codemirror_language__WEBPACK_IMPORTED_MODULE_2__.LanguageSupport(cssLanguage, cssLanguage.data.of({ autocomplete: cssCompletionSource })); -} - - - - -/***/ }), - -/***/ "./node_modules/@codemirror/lang-html/dist/index.js": -/*!**********************************************************!*\ - !*** ./node_modules/@codemirror/lang-html/dist/index.js ***! - \**********************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ autoCloseTags: () => (/* binding */ autoCloseTags), -/* harmony export */ html: () => (/* binding */ html), -/* harmony export */ htmlCompletionSource: () => (/* binding */ htmlCompletionSource), -/* harmony export */ htmlCompletionSourceWith: () => (/* binding */ htmlCompletionSourceWith), -/* harmony export */ htmlLanguage: () => (/* binding */ htmlLanguage), -/* harmony export */ htmlPlain: () => (/* binding */ htmlPlain) -/* harmony export */ }); -/* harmony import */ var _lezer_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lezer/html */ "./node_modules/@lezer/html/dist/index.js"); -/* harmony import */ var _codemirror_lang_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @codemirror/lang-css */ "./node_modules/@codemirror/lang-css/dist/index.js"); -/* harmony import */ var _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @codemirror/lang-javascript */ "./node_modules/@codemirror/lang-javascript/dist/index.js"); -/* harmony import */ var _codemirror_view__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @codemirror/view */ "./node_modules/@codemirror/view/dist/index.js"); -/* harmony import */ var _codemirror_state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @codemirror/state */ "./node_modules/@codemirror/state/dist/index.js"); -/* harmony import */ var _codemirror_language__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @codemirror/language */ "./node_modules/@codemirror/language/dist/index.js"); - - - - - - - -const Targets = ["_blank", "_self", "_top", "_parent"]; -const Charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"]; -const Methods = ["get", "post", "put", "delete"]; -const Encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"]; -const Bool = ["true", "false"]; -const S = {}; // Empty tag spec -const Tags = { - a: { - attrs: { - href: null, ping: null, type: null, - media: null, - target: Targets, - hreflang: null - } - }, - abbr: S, - address: S, - area: { - attrs: { - alt: null, coords: null, href: null, target: null, ping: null, - media: null, hreflang: null, type: null, - shape: ["default", "rect", "circle", "poly"] - } - }, - article: S, - aside: S, - audio: { - attrs: { - src: null, mediagroup: null, - crossorigin: ["anonymous", "use-credentials"], - preload: ["none", "metadata", "auto"], - autoplay: ["autoplay"], - loop: ["loop"], - controls: ["controls"] - } - }, - b: S, - base: { attrs: { href: null, target: Targets } }, - bdi: S, - bdo: S, - blockquote: { attrs: { cite: null } }, - body: S, - br: S, - button: { - attrs: { - form: null, formaction: null, name: null, value: null, - autofocus: ["autofocus"], - disabled: ["autofocus"], - formenctype: Encs, - formmethod: Methods, - formnovalidate: ["novalidate"], - formtarget: Targets, - type: ["submit", "reset", "button"] - } - }, - canvas: { attrs: { width: null, height: null } }, - caption: S, - center: S, - cite: S, - code: S, - col: { attrs: { span: null } }, - colgroup: { attrs: { span: null } }, - command: { - attrs: { - type: ["command", "checkbox", "radio"], - label: null, icon: null, radiogroup: null, command: null, title: null, - disabled: ["disabled"], - checked: ["checked"] - } - }, - data: { attrs: { value: null } }, - datagrid: { attrs: { disabled: ["disabled"], multiple: ["multiple"] } }, - datalist: { attrs: { data: null } }, - dd: S, - del: { attrs: { cite: null, datetime: null } }, - details: { attrs: { open: ["open"] } }, - dfn: S, - div: S, - dl: S, - dt: S, - em: S, - embed: { attrs: { src: null, type: null, width: null, height: null } }, - eventsource: { attrs: { src: null } }, - fieldset: { attrs: { disabled: ["disabled"], form: null, name: null } }, - figcaption: S, - figure: S, - footer: S, - form: { - attrs: { - action: null, name: null, - "accept-charset": Charsets, - autocomplete: ["on", "off"], - enctype: Encs, - method: Methods, - novalidate: ["novalidate"], - target: Targets - } - }, - h1: S, h2: S, h3: S, h4: S, h5: S, h6: S, - head: { - children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"] - }, - header: S, - hgroup: S, - hr: S, - html: { - attrs: { manifest: null } - }, - i: S, - iframe: { - attrs: { - src: null, srcdoc: null, name: null, width: null, height: null, - sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"], - seamless: ["seamless"] - } - }, - img: { - attrs: { - alt: null, src: null, ismap: null, usemap: null, width: null, height: null, - crossorigin: ["anonymous", "use-credentials"] - } - }, - input: { - attrs: { - alt: null, dirname: null, form: null, formaction: null, - height: null, list: null, max: null, maxlength: null, min: null, - name: null, pattern: null, placeholder: null, size: null, src: null, - step: null, value: null, width: null, - accept: ["audio/*", "video/*", "image/*"], - autocomplete: ["on", "off"], - autofocus: ["autofocus"], - checked: ["checked"], - disabled: ["disabled"], - formenctype: Encs, - formmethod: Methods, - formnovalidate: ["novalidate"], - formtarget: Targets, - multiple: ["multiple"], - readonly: ["readonly"], - required: ["required"], - type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month", - "week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio", - "file", "submit", "image", "reset", "button"] - } - }, - ins: { attrs: { cite: null, datetime: null } }, - kbd: S, - keygen: { - attrs: { - challenge: null, form: null, name: null, - autofocus: ["autofocus"], - disabled: ["disabled"], - keytype: ["RSA"] - } - }, - label: { attrs: { for: null, form: null } }, - legend: S, - li: { attrs: { value: null } }, - link: { - attrs: { - href: null, type: null, - hreflang: null, - media: null, - sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"] - } - }, - map: { attrs: { name: null } }, - mark: S, - menu: { attrs: { label: null, type: ["list", "context", "toolbar"] } }, - meta: { - attrs: { - content: null, - charset: Charsets, - name: ["viewport", "application-name", "author", "description", "generator", "keywords"], - "http-equiv": ["content-language", "content-type", "default-style", "refresh"] - } - }, - meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } }, - nav: S, - noscript: S, - object: { - attrs: { - data: null, type: null, name: null, usemap: null, form: null, width: null, height: null, - typemustmatch: ["typemustmatch"] - } - }, - ol: { attrs: { reversed: ["reversed"], start: null, type: ["1", "a", "A", "i", "I"] }, - children: ["li", "script", "template", "ul", "ol"] }, - optgroup: { attrs: { disabled: ["disabled"], label: null } }, - option: { attrs: { disabled: ["disabled"], label: null, selected: ["selected"], value: null } }, - output: { attrs: { for: null, form: null, name: null } }, - p: S, - param: { attrs: { name: null, value: null } }, - pre: S, - progress: { attrs: { value: null, max: null } }, - q: { attrs: { cite: null } }, - rp: S, - rt: S, - ruby: S, - samp: S, - script: { - attrs: { - type: ["text/javascript"], - src: null, - async: ["async"], - defer: ["defer"], - charset: Charsets - } - }, - section: S, - select: { - attrs: { - form: null, name: null, size: null, - autofocus: ["autofocus"], - disabled: ["disabled"], - multiple: ["multiple"] - } - }, - slot: { attrs: { name: null } }, - small: S, - source: { attrs: { src: null, type: null, media: null } }, - span: S, - strong: S, - style: { - attrs: { - type: ["text/css"], - media: null, - scoped: null - } - }, - sub: S, - summary: S, - sup: S, - table: S, - tbody: S, - td: { attrs: { colspan: null, rowspan: null, headers: null } }, - template: S, - textarea: { - attrs: { - dirname: null, form: null, maxlength: null, name: null, placeholder: null, - rows: null, cols: null, - autofocus: ["autofocus"], - disabled: ["disabled"], - readonly: ["readonly"], - required: ["required"], - wrap: ["soft", "hard"] - } - }, - tfoot: S, - th: { attrs: { colspan: null, rowspan: null, headers: null, scope: ["row", "col", "rowgroup", "colgroup"] } }, - thead: S, - time: { attrs: { datetime: null } }, - title: S, - tr: S, - track: { - attrs: { - src: null, label: null, default: null, - kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"], - srclang: null - } - }, - ul: { children: ["li", "script", "template", "ul", "ol"] }, - var: S, - video: { - attrs: { - src: null, poster: null, width: null, height: null, - crossorigin: ["anonymous", "use-credentials"], - preload: ["auto", "metadata", "none"], - autoplay: ["autoplay"], - mediagroup: ["movie"], - muted: ["muted"], - controls: ["controls"] - } - }, - wbr: S -}; -const GlobalAttrs = { - accesskey: null, - class: null, - contenteditable: Bool, - contextmenu: null, - dir: ["ltr", "rtl", "auto"], - draggable: ["true", "false", "auto"], - dropzone: ["copy", "move", "link", "string:", "file:"], - hidden: ["hidden"], - id: null, - inert: ["inert"], - itemid: null, - itemprop: null, - itemref: null, - itemscope: ["itemscope"], - itemtype: null, - lang: ["ar", "bn", "de", "en-GB", "en-US", "es", "fr", "hi", "id", "ja", "pa", "pt", "ru", "tr", "zh"], - spellcheck: Bool, - autocorrect: Bool, - autocapitalize: Bool, - style: null, - tabindex: null, - title: null, - translate: ["yes", "no"], - rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"], - role: /*@__PURE__*/"alert application article banner button cell checkbox complementary contentinfo dialog document feed figure form grid gridcell heading img list listbox listitem main navigation region row rowgroup search switch tab table tabpanel textbox timer".split(" "), - "aria-activedescendant": null, - "aria-atomic": Bool, - "aria-autocomplete": ["inline", "list", "both", "none"], - "aria-busy": Bool, - "aria-checked": ["true", "false", "mixed", "undefined"], - "aria-controls": null, - "aria-describedby": null, - "aria-disabled": Bool, - "aria-dropeffect": null, - "aria-expanded": ["true", "false", "undefined"], - "aria-flowto": null, - "aria-grabbed": ["true", "false", "undefined"], - "aria-haspopup": Bool, - "aria-hidden": Bool, - "aria-invalid": ["true", "false", "grammar", "spelling"], - "aria-label": null, - "aria-labelledby": null, - "aria-level": null, - "aria-live": ["off", "polite", "assertive"], - "aria-multiline": Bool, - "aria-multiselectable": Bool, - "aria-owns": null, - "aria-posinset": null, - "aria-pressed": ["true", "false", "mixed", "undefined"], - "aria-readonly": Bool, - "aria-relevant": null, - "aria-required": Bool, - "aria-selected": ["true", "false", "undefined"], - "aria-setsize": null, - "aria-sort": ["ascending", "descending", "none", "other"], - "aria-valuemax": null, - "aria-valuemin": null, - "aria-valuenow": null, - "aria-valuetext": null -}; -const eventAttributes = /*@__PURE__*/("beforeunload copy cut dragstart dragover dragleave dragenter dragend " + - "drag paste focus blur change click load mousedown mouseenter mouseleave " + - "mouseup keydown keyup resize scroll unload").split(" ").map(n => "on" + n); -for (let a of eventAttributes) - GlobalAttrs[a] = null; -class Schema { - constructor(extraTags, extraAttrs) { - this.tags = Object.assign(Object.assign({}, Tags), extraTags); - this.globalAttrs = Object.assign(Object.assign({}, GlobalAttrs), extraAttrs); - this.allTags = Object.keys(this.tags); - this.globalAttrNames = Object.keys(this.globalAttrs); - } -} -Schema.default = /*@__PURE__*/new Schema; -function elementName(doc, tree, max = doc.length) { - if (!tree) - return ""; - let tag = tree.firstChild; - let name = tag && tag.getChild("TagName"); - return name ? doc.sliceString(name.from, Math.min(name.to, max)) : ""; -} -function findParentElement(tree, skip = false) { - for (; tree; tree = tree.parent) - if (tree.name == "Element") { - if (skip) - skip = false; - else - return tree; - } - return null; -} -function allowedChildren(doc, tree, schema) { - let parentInfo = schema.tags[elementName(doc, findParentElement(tree))]; - return (parentInfo === null || parentInfo === void 0 ? void 0 : parentInfo.children) || schema.allTags; -} -function openTags(doc, tree) { - let open = []; - for (let parent = findParentElement(tree); parent && !parent.type.isTop; parent = findParentElement(parent.parent)) { - let tagName = elementName(doc, parent); - if (tagName && parent.lastChild.name == "CloseTag") - break; - if (tagName && open.indexOf(tagName) < 0 && (tree.name == "EndTag" || tree.from >= parent.firstChild.to)) - open.push(tagName); - } - return open; -} -const identifier = /^[:\-\.\w\u00b7-\uffff]*$/; -function completeTag(state, schema, tree, from, to) { - let end = /\s*>/.test(state.sliceDoc(to, to + 5)) ? "" : ">"; - let parent = findParentElement(tree, true); - return { from, to, - options: allowedChildren(state.doc, parent, schema).map(tagName => ({ label: tagName, type: "type" })).concat(openTags(state.doc, tree).map((tag, i) => ({ label: "/" + tag, apply: "/" + tag + end, - type: "type", boost: 99 - i }))), - validFor: /^\/?[:\-\.\w\u00b7-\uffff]*$/ }; -} -function completeCloseTag(state, tree, from, to) { - let end = /\s*>/.test(state.sliceDoc(to, to + 5)) ? "" : ">"; - return { from, to, - options: openTags(state.doc, tree).map((tag, i) => ({ label: tag, apply: tag + end, type: "type", boost: 99 - i })), - validFor: identifier }; -} -function completeStartTag(state, schema, tree, pos) { - let options = [], level = 0; - for (let tagName of allowedChildren(state.doc, tree, schema)) - options.push({ label: "<" + tagName, type: "type" }); - for (let open of openTags(state.doc, tree)) - options.push({ label: "", type: "type", boost: 99 - level++ }); - return { from: pos, to: pos, options, validFor: /^<\/?[:\-\.\w\u00b7-\uffff]*$/ }; -} -function completeAttrName(state, schema, tree, from, to) { - let elt = findParentElement(tree), info = elt ? schema.tags[elementName(state.doc, elt)] : null; - let localAttrs = info && info.attrs ? Object.keys(info.attrs) : []; - let names = info && info.globalAttrs === false ? localAttrs - : localAttrs.length ? localAttrs.concat(schema.globalAttrNames) : schema.globalAttrNames; - return { from, to, - options: names.map(attrName => ({ label: attrName, type: "property" })), - validFor: identifier }; -} -function completeAttrValue(state, schema, tree, from, to) { - var _a; - let nameNode = (_a = tree.parent) === null || _a === void 0 ? void 0 : _a.getChild("AttributeName"); - let options = [], token = undefined; - if (nameNode) { - let attrName = state.sliceDoc(nameNode.from, nameNode.to); - let attrs = schema.globalAttrs[attrName]; - if (!attrs) { - let elt = findParentElement(tree), info = elt ? schema.tags[elementName(state.doc, elt)] : null; - attrs = (info === null || info === void 0 ? void 0 : info.attrs) && info.attrs[attrName]; - } - if (attrs) { - let base = state.sliceDoc(from, to).toLowerCase(), quoteStart = '"', quoteEnd = '"'; - if (/^['"]/.test(base)) { - token = base[0] == '"' ? /^[^"]*$/ : /^[^']*$/; - quoteStart = ""; - quoteEnd = state.sliceDoc(to, to + 1) == base[0] ? "" : base[0]; - base = base.slice(1); - from++; - } - else { - token = /^[^\s<>='"]*$/; - } - for (let value of attrs) - options.push({ label: value, apply: quoteStart + value + quoteEnd, type: "constant" }); - } - } - return { from, to, options, validFor: token }; -} -function htmlCompletionFor(schema, context) { - let { state, pos } = context, tree = (0,_codemirror_language__WEBPACK_IMPORTED_MODULE_1__.syntaxTree)(state).resolveInner(pos, -1), around = tree.resolve(pos); - for (let scan = pos, before; around == tree && (before = tree.childBefore(scan));) { - let last = before.lastChild; - if (!last || !last.type.isError || last.from < last.to) - break; - around = tree = before; - scan = last.from; - } - if (tree.name == "TagName") { - return tree.parent && /CloseTag$/.test(tree.parent.name) ? completeCloseTag(state, tree, tree.from, pos) - : completeTag(state, schema, tree, tree.from, pos); - } - else if (tree.name == "StartTag") { - return completeTag(state, schema, tree, pos, pos); - } - else if (tree.name == "StartCloseTag" || tree.name == "IncompleteCloseTag") { - return completeCloseTag(state, tree, pos, pos); - } - else if (tree.name == "OpenTag" || tree.name == "SelfClosingTag" || tree.name == "AttributeName") { - return completeAttrName(state, schema, tree, tree.name == "AttributeName" ? tree.from : pos, pos); - } - else if (tree.name == "Is" || tree.name == "AttributeValue" || tree.name == "UnquotedAttributeValue") { - return completeAttrValue(state, schema, tree, tree.name == "Is" ? pos : tree.from, pos); - } - else if (context.explicit && (around.name == "Element" || around.name == "Text" || around.name == "Document")) { - return completeStartTag(state, schema, tree, pos); - } - else { - return null; - } -} -/** -HTML tag completion. Opens and closes tags and attributes in a -context-aware way. -*/ -function htmlCompletionSource(context) { - return htmlCompletionFor(Schema.default, context); -} -/** -Create a completion source for HTML extended with additional tags -or attributes. -*/ -function htmlCompletionSourceWith(config) { - let { extraTags, extraGlobalAttributes: extraAttrs } = config; - let schema = extraAttrs || extraTags ? new Schema(extraTags, extraAttrs) : Schema.default; - return (context) => htmlCompletionFor(schema, context); -} - -const jsonParser = /*@__PURE__*/_codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.javascriptLanguage.parser.configure({ top: "SingleExpression" }); -const defaultNesting = [ - { tag: "script", - attrs: attrs => attrs.type == "text/typescript" || attrs.lang == "ts", - parser: _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.typescriptLanguage.parser }, - { tag: "script", - attrs: attrs => attrs.type == "text/babel" || attrs.type == "text/jsx", - parser: _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.jsxLanguage.parser }, - { tag: "script", - attrs: attrs => attrs.type == "text/typescript-jsx", - parser: _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.tsxLanguage.parser }, - { tag: "script", - attrs(attrs) { - return /^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(attrs.type); - }, - parser: jsonParser }, - { tag: "script", - attrs(attrs) { - return !attrs.type || /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(attrs.type); - }, - parser: _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.javascriptLanguage.parser }, - { tag: "style", - attrs(attrs) { - return (!attrs.lang || attrs.lang == "css") && (!attrs.type || /^(text\/)?(x-)?(stylesheet|css)$/i.test(attrs.type)); - }, - parser: _codemirror_lang_css__WEBPACK_IMPORTED_MODULE_3__.cssLanguage.parser } -]; -const defaultAttrs = /*@__PURE__*/[ - { name: "style", - parser: /*@__PURE__*/_codemirror_lang_css__WEBPACK_IMPORTED_MODULE_3__.cssLanguage.parser.configure({ top: "Styles" }) } -].concat(/*@__PURE__*/eventAttributes.map(name => ({ name, parser: _codemirror_lang_javascript__WEBPACK_IMPORTED_MODULE_2__.javascriptLanguage.parser }))); -/** -A language provider based on the [Lezer HTML -parser](https://github.com/lezer-parser/html), extended with the -JavaScript and CSS parsers to parse the content of ` - + + diff --git a/sw.js b/sw.js index fa1bb8e..d49ae5e 100644 --- a/sw.js +++ b/sw.js @@ -1,2 +1,2 @@ -if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,t)=>{const r=e||("document"in self?document.currentScript.src:"")||location.href;if(s[r])return;let o={};const l=e=>n(e,r),c={module:{uri:r},exports:o,require:l};s[r]=Promise.all(i.map(e=>c[e]||l(e))).then(e=>(t(...e),o))}}define(["./workbox-3bd99cbd"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"assets/index-D-qNE1dZ.js",revision:null},{url:"assets/index-D7CYcCYQ.css",revision:null},{url:"index.html",revision:"956d65f3d3ac783624b21123de9aff46"},{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"manifest.webmanifest",revision:"f326d8704eaf8980771d6606af60bb15"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"))),e.registerRoute(/.*\.(js|css|html)$/,new e.NetworkFirst({cacheName:"app-shell",plugins:[]}),"GET"),e.registerRoute(/.*\.(png|ico|json)$/,new e.CacheFirst({cacheName:"assets",plugins:[]}),"GET")}); +if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,t)=>{const r=e||("document"in self?document.currentScript.src:"")||location.href;if(s[r])return;let o={};const l=e=>n(e,r),c={module:{uri:r},exports:o,require:l};s[r]=Promise.all(i.map(e=>c[e]||l(e))).then(e=>(t(...e),o))}}define(["./workbox-3bd99cbd"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"assets/index-Cf-RCOeo.js",revision:null},{url:"assets/index-D2o6aUx6.css",revision:null},{url:"index.html",revision:"6f7c82c00748c6f74a33ba3b04f0f20f"},{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"manifest.webmanifest",revision:"f326d8704eaf8980771d6606af60bb15"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"))),e.registerRoute(/.*\.(js|css|html)$/,new e.NetworkFirst({cacheName:"app-shell",plugins:[]}),"GET"),e.registerRoute(/.*\.(png|ico|json)$/,new e.CacheFirst({cacheName:"assets",plugins:[]}),"GET")}); //# sourceMappingURL=sw.js.map diff --git a/sw.js.map b/sw.js.map index da9c2a5..54d480a 100644 --- a/sw.js.map +++ b/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","sources":["../../../tmp/d3a950a70072b8b07327d208a0205994/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/workspace/HTMLReader/Build/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/workspace/HTMLReader/Build/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/workspace/HTMLReader/Build/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/workspace/HTMLReader/Build/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/workspace/HTMLReader/Build/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/workspace/HTMLReader/Build/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from '/workspace/HTMLReader/Build/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from '/workspace/HTMLReader/Build/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"assets/index-D-qNE1dZ.js\",\n \"revision\": null\n },\n {\n \"url\": \"assets/index-D7CYcCYQ.css\",\n \"revision\": null\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"956d65f3d3ac783624b21123de9aff46\"\n },\n {\n \"url\": \"registerSW.js\",\n \"revision\": \"402b66900e731ca748771b6fc5e7a068\"\n },\n {\n \"url\": \"manifest.webmanifest\",\n \"revision\": \"f326d8704eaf8980771d6606af60bb15\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();\nworkbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"index.html\")));\n\n\nworkbox_routing_registerRoute(/.*\\.(js|css|html)$/, new workbox_strategies_NetworkFirst({ \"cacheName\":\"app-shell\", plugins: [] }), 'GET');\nworkbox_routing_registerRoute(/.*\\.(png|ico|json)$/, new workbox_strategies_CacheFirst({ \"cacheName\":\"assets\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","workbox_precaching_cleanupOutdatedCaches","workbox","registerRoute","workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","cacheName","plugins","workbox_strategies_CacheFirst"],"mappings":"inBA0BAA,KAAKC,cAELC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,2BACPC,SAAY,MAEd,CACED,IAAO,4BACPC,SAAY,MAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,gBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,qCAEb,CAAE,GACLC,EAAAA,wBAC6BC,EAAAC,cAAC,IAAIC,EAAAA,gBAAgCC,EAAAA,wBAA2C,gBAG7GC,EAAAA,cAA8B,qBAAsB,IAAIC,eAAgC,CAAEC,UAAY,YAAaC,QAAS,KAAO,OACnIH,EAAAA,cAA8B,sBAAuB,IAAII,aAA8B,CAAEF,UAAY,SAAUC,QAAS,KAAO"} \ No newline at end of file +{"version":3,"file":"sw.js","sources":["../../../tmp/323c022307128536462ccf814346456f/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/workspace/HTMLReader/Build/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/workspace/HTMLReader/Build/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/workspace/HTMLReader/Build/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/workspace/HTMLReader/Build/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/workspace/HTMLReader/Build/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/workspace/HTMLReader/Build/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from '/workspace/HTMLReader/Build/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from '/workspace/HTMLReader/Build/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"assets/index-Cf-RCOeo.js\",\n \"revision\": null\n },\n {\n \"url\": \"assets/index-D2o6aUx6.css\",\n \"revision\": null\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"6f7c82c00748c6f74a33ba3b04f0f20f\"\n },\n {\n \"url\": \"registerSW.js\",\n \"revision\": \"402b66900e731ca748771b6fc5e7a068\"\n },\n {\n \"url\": \"manifest.webmanifest\",\n \"revision\": \"f326d8704eaf8980771d6606af60bb15\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();\nworkbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"index.html\")));\n\n\nworkbox_routing_registerRoute(/.*\\.(js|css|html)$/, new workbox_strategies_NetworkFirst({ \"cacheName\":\"app-shell\", plugins: [] }), 'GET');\nworkbox_routing_registerRoute(/.*\\.(png|ico|json)$/, new workbox_strategies_CacheFirst({ \"cacheName\":\"assets\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","workbox_precaching_cleanupOutdatedCaches","workbox","registerRoute","workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","cacheName","plugins","workbox_strategies_CacheFirst"],"mappings":"inBA0BAA,KAAKC,cAELC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,2BACPC,SAAY,MAEd,CACED,IAAO,4BACPC,SAAY,MAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,gBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,qCAEb,CAAE,GACLC,EAAAA,wBAC6BC,EAAAC,cAAC,IAAIC,EAAAA,gBAAgCC,EAAAA,wBAA2C,gBAG7GC,EAAAA,cAA8B,qBAAsB,IAAIC,eAAgC,CAAEC,UAAY,YAAaC,QAAS,KAAO,OACnIH,EAAAA,cAA8B,sBAAuB,IAAII,aAA8B,CAAEF,UAAY,SAAUC,QAAS,KAAO"} \ No newline at end of file diff --git a/workbox-3bd99cbd.js b/workbox-3bd99cbd.js index 12e57a7..e5b251d 100644 --- a/workbox-3bd99cbd.js +++ b/workbox-3bd99cbd.js @@ -1,70 +1,2 @@ -define(["exports"],function(t){"use strict";try{self["workbox:core:7.2.0"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:7.2.0"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class r{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class i extends r{constructor(t,e,s){super(({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)},e,s)}}class o{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)})}addCacheListener(){self.addEventListener("message",t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map(e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})}));t.waitUntil(s),t.ports&&t.ports[0]&&s.then(()=>t.ports[0].postMessage(!0))}})}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:r,route:i}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let o=i&&i.handler;const a=t.method;if(!o&&this.i.has(a)&&(o=this.i.get(a)),!o)return;let c;try{c=o.handle({url:s,request:t,event:e,params:r})}catch(t){c=Promise.reject(t)}const h=i&&i.catchHandler;return c instanceof Promise&&(this.o||h)&&(c=c.catch(async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:r})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n})),c}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const r=this.t.get(s.method)||[];for(const i of r){let r;const o=i.match({url:t,sameOrigin:e,request:s,event:n});if(o)return r=o,(Array.isArray(r)&&0===r.length||o.constructor===Object&&0===Object.keys(o).length||"boolean"==typeof o)&&(r=void 0),{route:i,params:r}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let a;const c=()=>(a||(a=new o,a.addFetchListener(),a.addCacheListener()),a);/** - * Create and register a route from a variety of route descriptors. - * - * Accepts a string URL, RegExp, function, or an existing Route instance: - * - string: creates a Route that matches requests whose URL exactly equals the provided URL. - * - RegExp: creates a RegExp-based Route that matches captured groups. - * - function: uses the function as the Route match callback. - * - Route instance: registers the instance directly. - * - * @param {string|RegExp|function|r} t - Route descriptor: a URL string, RegExp, match function, or Route instance. - * @param {*} e - Handler for the route (a value accepted by the Route constructor / descriptor). - * @param {string} [n] - Optional HTTP method for the route (e.g., "GET"); if omitted the Route's default is used. - * @returns {r} The registered Route instance. - * @throws {s} If `t` is not a supported route type an `unsupported-route-type` Workbox error is thrown. - */ -function h(t,e,n){let o;if("string"==typeof t){const s=new URL(t,location.href);o=new r(({url:t})=>t.href===s.href,e,n)}else if(t instanceof RegExp)o=new i(t,e,n);else if("function"==typeof t)o=new r(t,e,n);else{if(!(t instanceof r))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});o=t}return c().registerRoute(o),o}try{self["workbox:strategies:7.2.0"]&&_()}catch(t){}const u={cacheWillUpdate:async({response:t})=>200===t.status||0===t.status?t:null},l={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},f=t=>[l.prefix,t,l.suffix].filter(t=>t&&t.length>0).join("-"),w=t=>t||f(l.precache),d=t=>t||f(l.runtime);/** - * Return the input URL as a string with the given query parameter names removed. - * @param {string|URL} t - The input URL (string or URL). - * @param {Iterable} e - Iterable of query parameter names to delete. - * @return {string} The resulting URL href with the specified query parameters removed. - */ -function p(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class y{constructor(){this.promise=new Promise((t,e)=>{this.resolve=t,this.reject=e})}}const g=new Set;/** - * Normalize an input to a Request object. - * - * If given a URL string, returns a new Request constructed from that URL. - * If given a Request, returns it unchanged. - * - * @param {string|Request} t - A URL string or an existing Request. - * @return {Request} A Request instance. - */ -function m(t){return"string"==typeof t?new Request(t):t}class R{constructor(t,e){this.h={},Object.assign(this,e),this.event=e.event,this.u=t,this.l=new y,this.p=[],this.m=[...t.plugins],this.R=new Map;for(const t of this.m)this.R.set(t,{});this.event.waitUntil(this.l.promise)}async fetch(t){const{event:e}=this;let n=m(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const r=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const i=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.u.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:i,response:t});return t}catch(t){throw r&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:r.clone(),request:i.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=m(t);let s;const{cacheName:n,matchOptions:r}=this.u,i=await this.getCacheKey(e,"read"),o=Object.assign(Object.assign({},r),{cacheName:n});s=await caches.match(i,o);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:r,cachedResponse:s,request:i,event:this.event})||void 0;return s}async cachePut(t,e){const n=m(t);var r;await(r=0,new Promise(t=>setTimeout(t,r)));const i=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(o=i.url,new URL(String(o),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var o;const a=await this.v(e);if(!a)return!1;const{cacheName:c,matchOptions:h}=this.u,u=await self.caches.open(c),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const r=p(e.url,s);if(e.url===r)return t.match(e,n);const i=Object.assign(Object.assign({},n),{ignoreSearch:!0}),o=await t.keys(e,i);for(const e of o)if(r===p(e.url,s))return t.match(e,n)}(u,i.clone(),["__WB_REVISION__"],h):null;try{await u.put(i,l?a.clone():a)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await async function(){for(const t of g)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:c,oldResponse:f,newResponse:a.clone(),request:i,event:this.event});return!0}async getCacheKey(t,e){const s=`${t.url} | ${e}`;if(!this.h[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=m(await t({mode:e,request:n,event:this.event,params:this.params}));this.h[s]=n}return this.h[s]}hasCallback(t){for(const e of this.u.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.u.plugins)if("function"==typeof e[t]){const s=this.R.get(e),n=n=>{const r=Object.assign(Object.assign({},n),{state:s});return e[t](r)};yield n}}waitUntil(t){return this.p.push(t),t}async doneWaiting(){let t;for(;t=this.p.shift();)await t}destroy(){this.l.resolve(null)}async v(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class v{constructor(t={}){this.cacheName=d(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,r=new R(this,{event:e,request:s,params:n}),i=this.q(r,s,e);return[i,this.U(i,r,s,e)]}async q(t,e,n){let r;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(r=await this.L(e,t),!r||"error"===r.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const i of t.iterateCallbacks("handlerDidError"))if(r=await i({error:s,event:n,request:e}),r)break;if(!r)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))r=await s({event:n,request:e,response:r});return r}async U(t,e,s,n){let r,i;try{r=await t}catch(i){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:r}),await e.doneWaiting()}catch(t){t instanceof Error&&(i=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:r,error:i}),e.destroy(),i)throw i}}/** - * Calls the provided factory to obtain a promise, registers it with the event via waitUntil, and returns it. - * @param {ExtendableEvent} event - Event object with a waitUntil(promise) method. - * @param {function(): Promise} promiseFactory - Function that returns the promise to be awaited. - * @return {Promise} The promise produced by the factory. - */ -function q(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:7.2.0"]&&_()}catch(t){}/** - * Normalizes a precache entry into a {cacheKey, url} pair. - * - * Accepts either a URL string or an object with a `url` property and an optional - * `revision` string. If `revision` is provided the `cacheKey` is the URL with - * a `__WB_REVISION__` query parameter set to that revision; otherwise the - * `cacheKey` is the URL itself. The `url` returned is always the resolved - * absolute URL without the injected revision query parameter. - * - * @param {string|Object} entry - A URL string or an entry object {url, revision?}. - * @return {{cacheKey: string, url: string}} Resolved absolute `cacheKey` and `url`. - * @throws {Error} Throws a Workbox error "add-to-cache-list-unexpected-type" when - * `entry` is falsy or an object missing a `url` property. - */ -function U(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const r=new URL(n,location.href),i=new URL(n,location.href);return r.searchParams.set("__WB_REVISION__",e),{cacheKey:r.href,url:i.href}}class L{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class b{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this._.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this._=t}}let E,x;/** - * Create a same-origin copy of a Response, optionally allowing modification of response init. - * - * If the input Response is from a different origin than the service worker (self.location.origin), - * this function throws a `s` error with name "cross-origin-copy-response". - * - * The function attempts to reuse the original response body stream when the platform supports - * constructing a new Response from an existing Response body; otherwise it falls back to reading - * the body as a Blob. The optional `initTransformer` can adjust headers/status/statusText used - * for the created copy. - * - * @param {Response} t - The response to copy. Must be same-origin (t.url === self.location.origin). - * @param {(init: {headers: Headers, status: number, statusText: string}) => {headers: Headers, status: number, statusText: string}|void} [e] - * Optional transformer called with a mutable-ish init object; return value (if any) is used - * as the response init for the copied Response. - * @returns {Promise} A promise that resolves to the new Response copy. - * @throws {s} If the response's origin differs from self.location.origin (error name "cross-origin-copy-response"). - */ -async function C(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const r=t.clone(),i={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},o=e?e(i):i,a=function(){if(void 0===E){const t=new Response("");if("body"in t)try{new Response(t.body),E=!0}catch(t){E=!1}E=!1}return E}()?r.body:await r.blob();return new Response(a,o)}class O extends v{constructor(t={}){t.cacheName=w(t.cacheName),super(t),this.C=!1!==t.fallbackToNetwork,this.plugins.push(O.copyRedirectedCacheableResponsesPlugin)}async L(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.O(t,e):await this.N(t,e))}async N(t,e){let n;const r=e.params||{};if(!this.C)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=r.integrity,i=t.integrity,o=!i||i===s;n=await e.fetch(new Request(t,{integrity:"no-cors"!==t.mode?i||s:void 0})),s&&o&&"no-cors"!==t.mode&&(this.P(),await e.cachePut(t,n.clone()))}return n}async O(t,e){this.P();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}P(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==O.copyRedirectedCacheableResponsesPlugin&&(n===O.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(O.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}O.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},O.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await C(t):t};class N{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.T=new Map,this.W=new Map,this.k=new Map,this.u=new O({cacheName:w(t),plugins:[...e,new b({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.u}precache(t){this.addToCacheList(t),this.K||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.K=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:r}=U(n),i="string"!=typeof n&&n.revision?"reload":"default";if(this.T.has(r)&&this.T.get(r)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.T.get(r),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.k.has(t)&&this.k.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:r});this.k.set(t,n.integrity)}if(this.T.set(r,t),this.W.set(r,i),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return q(t,async()=>{const e=new L;this.strategy.plugins.push(e);for(const[e,s]of this.T){const n=this.k.get(s),r=this.W.get(e),i=new Request(e,{integrity:n,cache:r,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:i,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}})}activate(t){return q(t,async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.T.values()),n=[];for(const r of e)s.has(r.url)||(await t.delete(r),n.push(r.url));return{deletedURLs:n}})}getURLsToCacheKeys(){return this.T}getCachedURLs(){return[...this.T.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.T.get(e.href)}getIntegrityForCacheKey(t){return this.k.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}const P=()=>(x||(x=new N),x);class T extends r{constructor(t,e){super(({request:s})=>{const n=t.getURLsToCacheKeys();for(const r of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:r}={}){const i=new URL(t,location.href);i.hash="",yield i.href;const o=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some(t=>t.test(s))&&t.searchParams.delete(s);return t}(i,e);if(yield o.href,s&&o.pathname.endsWith("/")){const t=new URL(o.href);t.pathname+=s,yield t.href}if(n){const t=new URL(o.href);t.pathname+=".html",yield t.href}if(r){const t=r({url:i});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(r);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}},t.strategy)}}t.CacheFirst=class extends v{async L(t,e){let n,r=await e.cacheMatch(t);if(!r)try{r=await e.fetchAndCachePut(t)}catch(t){t instanceof Error&&(n=t)}if(!r)throw new s("no-response",{url:t.url,error:n});return r}},t.NavigationRoute=class extends r{constructor(t,{allowlist:e=[/./],denylist:s=[]}={}){super(t=>this.j(t),t),this.M=e,this.S=s}j({url:t,request:e}){if(e&&"navigate"!==e.mode)return!1;const s=t.pathname+t.search;for(const t of this.S)if(t.test(s))return!1;return!!this.M.some(t=>t.test(s))}},t.NetworkFirst=class extends v{constructor(t={}){super(t),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(u),this.D=t.networkTimeoutSeconds||0}async L(t,e){const n=[],r=[];let i;if(this.D){const{id:s,promise:o}=this.I({request:t,logs:n,handler:e});i=s,r.push(o)}const o=this.F({timeoutId:i,request:t,logs:n,handler:e});r.push(o);const a=await e.waitUntil((async()=>await e.waitUntil(Promise.race(r))||await o)());if(!a)throw new s("no-response",{url:t.url});return a}I({request:t,logs:e,handler:s}){let n;return{promise:new Promise(e=>{n=setTimeout(async()=>{e(await s.cacheMatch(t))},1e3*this.D)}),id:n}}async F({timeoutId:t,request:e,logs:s,handler:n}){let r,i;try{i=await n.fetchAndCachePut(e)}catch(t){t instanceof Error&&(r=t)}return t&&clearTimeout(t),!r&&i||(i=await n.cacheMatch(e)),i}},t.cleanupOutdatedCaches=function(){self.addEventListener("activate",t=>{const e=w();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter(s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t);return await Promise.all(s.map(t=>self.caches.delete(t))),s})(e).then(t=>{}))})},t.clientsClaim=function(){self.addEventListener("activate",()=>self.clients.claim())},t.createHandlerBoundToURL=function(t){return P().createHandlerBoundToURL(t)},t.precacheAndRoute=function(t,e){!function(t){P().precache(t)}(t),function(t){const e=P();h(new T(e,t))}(e)},t.registerRoute=h}); +define(["exports"],function(t){"use strict";try{self["workbox:core:7.2.0"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:7.2.0"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class r{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class i extends r{constructor(t,e,s){super(({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)},e,s)}}class o{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)})}addCacheListener(){self.addEventListener("message",t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map(e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})}));t.waitUntil(s),t.ports&&t.ports[0]&&s.then(()=>t.ports[0].postMessage(!0))}})}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:r,route:i}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let o=i&&i.handler;const a=t.method;if(!o&&this.i.has(a)&&(o=this.i.get(a)),!o)return;let c;try{c=o.handle({url:s,request:t,event:e,params:r})}catch(t){c=Promise.reject(t)}const h=i&&i.catchHandler;return c instanceof Promise&&(this.o||h)&&(c=c.catch(async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:r})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n})),c}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const r=this.t.get(s.method)||[];for(const i of r){let r;const o=i.match({url:t,sameOrigin:e,request:s,event:n});if(o)return r=o,(Array.isArray(r)&&0===r.length||o.constructor===Object&&0===Object.keys(o).length||"boolean"==typeof o)&&(r=void 0),{route:i,params:r}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let a;const c=()=>(a||(a=new o,a.addFetchListener(),a.addCacheListener()),a);function h(t,e,n){let o;if("string"==typeof t){const s=new URL(t,location.href);o=new r(({url:t})=>t.href===s.href,e,n)}else if(t instanceof RegExp)o=new i(t,e,n);else if("function"==typeof t)o=new r(t,e,n);else{if(!(t instanceof r))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});o=t}return c().registerRoute(o),o}try{self["workbox:strategies:7.2.0"]&&_()}catch(t){}const u={cacheWillUpdate:async({response:t})=>200===t.status||0===t.status?t:null},l={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},f=t=>[l.prefix,t,l.suffix].filter(t=>t&&t.length>0).join("-"),w=t=>t||f(l.precache),d=t=>t||f(l.runtime);function p(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class y{constructor(){this.promise=new Promise((t,e)=>{this.resolve=t,this.reject=e})}}const g=new Set;function m(t){return"string"==typeof t?new Request(t):t}class R{constructor(t,e){this.h={},Object.assign(this,e),this.event=e.event,this.u=t,this.l=new y,this.p=[],this.m=[...t.plugins],this.R=new Map;for(const t of this.m)this.R.set(t,{});this.event.waitUntil(this.l.promise)}async fetch(t){const{event:e}=this;let n=m(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const r=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const i=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.u.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:i,response:t});return t}catch(t){throw r&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:r.clone(),request:i.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=m(t);let s;const{cacheName:n,matchOptions:r}=this.u,i=await this.getCacheKey(e,"read"),o=Object.assign(Object.assign({},r),{cacheName:n});s=await caches.match(i,o);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:r,cachedResponse:s,request:i,event:this.event})||void 0;return s}async cachePut(t,e){const n=m(t);var r;await(r=0,new Promise(t=>setTimeout(t,r)));const i=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(o=i.url,new URL(String(o),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var o;const a=await this.v(e);if(!a)return!1;const{cacheName:c,matchOptions:h}=this.u,u=await self.caches.open(c),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const r=p(e.url,s);if(e.url===r)return t.match(e,n);const i=Object.assign(Object.assign({},n),{ignoreSearch:!0}),o=await t.keys(e,i);for(const e of o)if(r===p(e.url,s))return t.match(e,n)}(u,i.clone(),["__WB_REVISION__"],h):null;try{await u.put(i,l?a.clone():a)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await async function(){for(const t of g)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:c,oldResponse:f,newResponse:a.clone(),request:i,event:this.event});return!0}async getCacheKey(t,e){const s=`${t.url} | ${e}`;if(!this.h[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=m(await t({mode:e,request:n,event:this.event,params:this.params}));this.h[s]=n}return this.h[s]}hasCallback(t){for(const e of this.u.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.u.plugins)if("function"==typeof e[t]){const s=this.R.get(e),n=n=>{const r=Object.assign(Object.assign({},n),{state:s});return e[t](r)};yield n}}waitUntil(t){return this.p.push(t),t}async doneWaiting(){let t;for(;t=this.p.shift();)await t}destroy(){this.l.resolve(null)}async v(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class v{constructor(t={}){this.cacheName=d(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,r=new R(this,{event:e,request:s,params:n}),i=this.q(r,s,e);return[i,this.U(i,r,s,e)]}async q(t,e,n){let r;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(r=await this.L(e,t),!r||"error"===r.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const i of t.iterateCallbacks("handlerDidError"))if(r=await i({error:s,event:n,request:e}),r)break;if(!r)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))r=await s({event:n,request:e,response:r});return r}async U(t,e,s,n){let r,i;try{r=await t}catch(i){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:r}),await e.doneWaiting()}catch(t){t instanceof Error&&(i=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:r,error:i}),e.destroy(),i)throw i}}function q(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:7.2.0"]&&_()}catch(t){}function U(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const r=new URL(n,location.href),i=new URL(n,location.href);return r.searchParams.set("__WB_REVISION__",e),{cacheKey:r.href,url:i.href}}class L{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class b{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this._.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this._=t}}let E,x;async function C(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const r=t.clone(),i={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},o=e?e(i):i,a=function(){if(void 0===E){const t=new Response("");if("body"in t)try{new Response(t.body),E=!0}catch(t){E=!1}E=!1}return E}()?r.body:await r.blob();return new Response(a,o)}class O extends v{constructor(t={}){t.cacheName=w(t.cacheName),super(t),this.C=!1!==t.fallbackToNetwork,this.plugins.push(O.copyRedirectedCacheableResponsesPlugin)}async L(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.O(t,e):await this.N(t,e))}async N(t,e){let n;const r=e.params||{};if(!this.C)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=r.integrity,i=t.integrity,o=!i||i===s;n=await e.fetch(new Request(t,{integrity:"no-cors"!==t.mode?i||s:void 0})),s&&o&&"no-cors"!==t.mode&&(this.P(),await e.cachePut(t,n.clone()))}return n}async O(t,e){this.P();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}P(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==O.copyRedirectedCacheableResponsesPlugin&&(n===O.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(O.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}O.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},O.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await C(t):t};class N{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.T=new Map,this.W=new Map,this.k=new Map,this.u=new O({cacheName:w(t),plugins:[...e,new b({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.u}precache(t){this.addToCacheList(t),this.K||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.K=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:r}=U(n),i="string"!=typeof n&&n.revision?"reload":"default";if(this.T.has(r)&&this.T.get(r)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.T.get(r),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.k.has(t)&&this.k.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:r});this.k.set(t,n.integrity)}if(this.T.set(r,t),this.W.set(r,i),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return q(t,async()=>{const e=new L;this.strategy.plugins.push(e);for(const[e,s]of this.T){const n=this.k.get(s),r=this.W.get(e),i=new Request(e,{integrity:n,cache:r,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:i,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}})}activate(t){return q(t,async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.T.values()),n=[];for(const r of e)s.has(r.url)||(await t.delete(r),n.push(r.url));return{deletedURLs:n}})}getURLsToCacheKeys(){return this.T}getCachedURLs(){return[...this.T.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.T.get(e.href)}getIntegrityForCacheKey(t){return this.k.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}const P=()=>(x||(x=new N),x);class T extends r{constructor(t,e){super(({request:s})=>{const n=t.getURLsToCacheKeys();for(const r of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:r}={}){const i=new URL(t,location.href);i.hash="",yield i.href;const o=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some(t=>t.test(s))&&t.searchParams.delete(s);return t}(i,e);if(yield o.href,s&&o.pathname.endsWith("/")){const t=new URL(o.href);t.pathname+=s,yield t.href}if(n){const t=new URL(o.href);t.pathname+=".html",yield t.href}if(r){const t=r({url:i});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(r);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}},t.strategy)}}t.CacheFirst=class extends v{async L(t,e){let n,r=await e.cacheMatch(t);if(!r)try{r=await e.fetchAndCachePut(t)}catch(t){t instanceof Error&&(n=t)}if(!r)throw new s("no-response",{url:t.url,error:n});return r}},t.NavigationRoute=class extends r{constructor(t,{allowlist:e=[/./],denylist:s=[]}={}){super(t=>this.j(t),t),this.M=e,this.S=s}j({url:t,request:e}){if(e&&"navigate"!==e.mode)return!1;const s=t.pathname+t.search;for(const t of this.S)if(t.test(s))return!1;return!!this.M.some(t=>t.test(s))}},t.NetworkFirst=class extends v{constructor(t={}){super(t),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(u),this.D=t.networkTimeoutSeconds||0}async L(t,e){const n=[],r=[];let i;if(this.D){const{id:s,promise:o}=this.I({request:t,logs:n,handler:e});i=s,r.push(o)}const o=this.F({timeoutId:i,request:t,logs:n,handler:e});r.push(o);const a=await e.waitUntil((async()=>await e.waitUntil(Promise.race(r))||await o)());if(!a)throw new s("no-response",{url:t.url});return a}I({request:t,logs:e,handler:s}){let n;return{promise:new Promise(e=>{n=setTimeout(async()=>{e(await s.cacheMatch(t))},1e3*this.D)}),id:n}}async F({timeoutId:t,request:e,logs:s,handler:n}){let r,i;try{i=await n.fetchAndCachePut(e)}catch(t){t instanceof Error&&(r=t)}return t&&clearTimeout(t),!r&&i||(i=await n.cacheMatch(e)),i}},t.cleanupOutdatedCaches=function(){self.addEventListener("activate",t=>{const e=w();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter(s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t);return await Promise.all(s.map(t=>self.caches.delete(t))),s})(e).then(t=>{}))})},t.clientsClaim=function(){self.addEventListener("activate",()=>self.clients.claim())},t.createHandlerBoundToURL=function(t){return P().createHandlerBoundToURL(t)},t.precacheAndRoute=function(t,e){!function(t){P().precache(t)}(t),function(t){const e=P();h(new T(e,t))}(e)},t.registerRoute=h}); //# sourceMappingURL=workbox-3bd99cbd.js.map