diff --git a/.github/workflows/single-file.yml b/.github/workflows/single-file.yml new file mode 100644 index 0000000..0032993 --- /dev/null +++ b/.github/workflows/single-file.yml @@ -0,0 +1,46 @@ +name: Create single file build + +on: + push: + branches: ["**"] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: "single-file-build" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + cache-dependency-path: "Build/package-lock.json" + + - name: Install dependencies + working-directory: Build + run: npm ci + + - name: Build + working-directory: Build + run: npm run build:single + + - name: Rename for distribution + working-directory: Build/dist + run: mv index.html HTMLRunner.html + + - name: Upload Build Artifact + uses: actions/upload-artifact@v4 + with: + name: HTMLRunner-Standalone + path: Build/dist/HTMLRunner.html + if-no-files-found: error diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index f1d3dcb..6418d8b 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -1,45 +1,43 @@ -# .github/workflows/static.yml -name: Deploy static content to Pages +# Simple workflow for deploying static content to GitHub Pages +name: Deploy browser build to GitHub Pages on: push: branches: ["main"] workflow_dispatch: +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: - contents: read - pages: write - id-token: write + contents: write +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: group: "pages" - cancel-in-progress: true + cancel-in-progress: false jobs: deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - - name: Checkout repository + - name: Checkout uses: actions/checkout@v4 - - name: Setup Node.js + - name: Use Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: "20" - - name: Run build script - run: | - chmod +x Build/Buildscripts/build.sh - ./Build/Buildscripts/build.sh + - name: Install dependencies + working-directory: Build + run: npm i - - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v3 - with: - path: 'Build/dist' + - name: Build + working-directory: Build + run: npm run build - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + - name: Deploy browser build to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: Build/dist diff --git a/Build/Buildscripts/build-all.sh b/Build/Buildscripts/build-all.sh deleted file mode 100755 index 7ac046f..0000000 --- a/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/Buildscripts/build-inline.sh b/Build/Buildscripts/build-inline.sh deleted file mode 100755 index 0b06d26..0000000 --- a/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/Buildscripts/build.sh b/Build/Buildscripts/build.sh deleted file mode 100755 index 15690e0..0000000 --- a/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/dev-dist/registerSW.js b/Build/dev-dist/registerSW.js new file mode 100644 index 0000000..fdeaac1 --- /dev/null +++ b/Build/dev-dist/registerSW.js @@ -0,0 +1 @@ +if('serviceWorker' in navigator) navigator.serviceWorker.register('/dev-sw.js?dev-sw', { scope: '/', type: 'module' }) \ No newline at end of file diff --git a/Build/eslint.config.mts b/Build/eslint.config.mts new file mode 100644 index 0000000..069f123 --- /dev/null +++ b/Build/eslint.config.mts @@ -0,0 +1,13 @@ +import js from "@eslint/js"; +import globals from "globals"; +import tseslint from "typescript-eslint"; +import markdown from "@eslint/markdown"; +import css from "@eslint/css"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + { files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], plugins: { js }, extends: ["js/recommended"], languageOptions: { globals: globals.browser } }, + tseslint.configs.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/index.html b/Build/index.html new file mode 100644 index 0000000..2d8c598 --- /dev/null +++ b/Build/index.html @@ -0,0 +1,135 @@ + + + + + + HTMLRunner + + + +
+
+
+
+
+ + + + + + + +
+
+
+
+
+
+ +
+
+
+
+
+
Preview
+
Console
+
Terminal
+
+
+ + +
+
+
+
+
+
+
+ Ln 1, Col 1 + + UTF-8 + +
+ + + diff --git a/Build/package-lock.json b/Build/package-lock.json index 5a266c0..a67527f 100644 --- a/Build/package-lock.json +++ b/Build/package-lock.json @@ -1,59 +1,155 @@ { "name": "htmlrunner", - "version": "1.1.0", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "htmlrunner", - "version": "1.1.0", - "license": "ISC", + "version": "2.0.0", + "license": "MIT", "dependencies": { "@babel/core": "^7.29.0", "@babel/parser": "^7.29.3", "@babel/runtime": "^7.29.2", + "@biomejs/js-api": "^4.0.0", + "@biomejs/wasm-web": "^2.4.15", + "@codemirror/autocomplete": "^6.20.2", "@codemirror/commands": "^6.10.3", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-html": "^6.4.11", "@codemirror/lang-javascript": "^6.2.5", + "@codemirror/lang-markdown": "^6.5.0", "@codemirror/lint": "^6.9.6", "@codemirror/state": "^6.6.0", - "@codemirror/view": "^6.42.1", + "@codemirror/view": "^6.43.0", + "@fortawesome/fontawesome-free": "^7.2.0", + "@nisoku/sairin": "^0.1.2", "@prettier/plugin-xml": "^3.4.2", - "@types/codemirror": "^5.60.17", + "@replit/codemirror-indentation-markers": "^6.5.3", "@uiw/codemirror-theme-bbedit": "^4.25.9", "@uiw/codemirror-theme-monokai": "^4.25.9", + "almostnode": "^0.2.14", + "buffer": "^6.0.3", "codemirror": "^6.0.2", - "copy-webpack-plugin": "^14.0.0", - "eslint": "^10.3.0", + "comlink": "^4.4.2", + "esbuild-wasm": "^0.28.0", "eslint-linter-browserify": "^10.3.0", "file-saver": "^2.0.5", - "fontawesome": "^5.6.3", "jszip": "^3.10.1", + "marked": "^18.0.10", "prettier": "^3.8.3", - "prettier-plugin-css-order": "^2.2.0", - "split.js": "^1.6.5" + "split.js": "^1.6.5", + "wasm-git": "^0.0.17", + "xterm": "^5.3.0", + "xterm-addon-fit": "^0.8.0" }, "devDependencies": { + "@eslint/css": "^1.2.0", + "@eslint/js": "^10.0.1", + "@eslint/json": "^1.2.0", + "@eslint/markdown": "^8.0.1", "@types/file-saver": "^2.0.7", - "@types/prettier": "^3.0.0", - "@types/split.js": "^1.6.0", - "copy-webpack-plugin": "^14.0.0", + "@types/prettier": "^2.7.3", + "@types/split.js": "^1.4.0", + "cross-env": "^10.1.0", + "globals": "^17.6.0", "htmlhint": "^1.9.2", - "ts-loader": "^9.5.7", + "sharp": "^0.34.4", "typescript": "^6.0.3", - "webpack": "^5.106.2", - "webpack-cli": "^7.0.2", - "webpack-dev-server": "^5.2.4" + "typescript-eslint": "^8.59.4", + "vite": "^8.0.12", + "vite-plugin-singlefile": "^2.3.0" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "3.0.177", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.177.tgz", + "integrity": "sha512-U579dA3K2UcezpzJHjyw6UhctFtzFRKOSIrAgxr77teluPGP7vj8aLJpZvEEPf+JbUqbvsHRKKYZzip/+NQ89A==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.15", + "@ai-sdk/provider-utils": "4.0.46", + "@vercel/oidc": "3.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "3.0.99", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.99.tgz", + "integrity": "sha512-0Y6E5bvR+3eugt5rq2iy39EAAFi4nijXf1kdvcfoMm4erEGMe/6egIpvdvv5ePBU2YsnsxFuLRmMJ76Kv/babQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.15", + "@ai-sdk/provider-utils": "4.0.46" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.15.tgz", + "integrity": "sha512-XeZW1CcDF2GMbH4wejW6xBRI2QCOgnkVYUnxoeDadB1mf85riL2bMUeDoh+6gJ/r4mjNfzUPW8OjLjvwTP0u1Q==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "4.0.46", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.46.tgz", + "integrity": "sha512-tEtld97plCFiYevsJuOkGkeuhQndeMWFBVrJS4AjnbD5AqrNSXRCe0p+BZ3Cju/sxDeeZ9ym3q9YUV8fASA7aQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.15", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.8", + "undici": "^6.28.0" + }, + "engines": { + "node": ">=18.17" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "3.0.264", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.264.tgz", + "integrity": "sha512-LmIYL5jKxfqlv9ssLULbt1USYnS0gB4pKFikusdBOKol6NF8qTrldfaw2jILMleV9Tlyh6n6z7vlwe64ZHvKyQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "4.0.46", + "ai": "6.0.261", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1" } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -62,29 +158,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -100,46 +196,14 @@ "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.29.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz", - "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -149,13 +213,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -164,46 +228,37 @@ "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -213,52 +268,52 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -277,77 +332,92 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { - "node": ">=6.0" + "node": ">=6.9.0" + } + }, + "node_modules/@biomejs/js-api": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/js-api/-/js-api-4.0.0.tgz", + "integrity": "sha512-EOArR/6drRzM1/hwOIz1pZw90FL31Ud4Y7hEHGWVtMNmAwS9SrwZ8hMENGlLVXCeGW/kL46p8kX7eO6x9Nmezg==", + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "@biomejs/wasm-bundler": "^2.3.0", + "@biomejs/wasm-nodejs": "^2.3.0", + "@biomejs/wasm-web": "^2.3.0" }, "peerDependenciesMeta": { - "supports-color": { + "@biomejs/wasm-bundler": { + "optional": true + }, + "@biomejs/wasm-nodejs": { + "optional": true + }, + "@biomejs/wasm-web": { "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/@biomejs/wasm-web": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@biomejs/wasm-web/-/wasm-web-2.4.15.tgz", + "integrity": "sha512-BObH/ErWb9l3t7jWtM0pl0UtyRzuyKTAYMW9AjmVAF2qJvxNoFmHm90lpLcF+YUhKny3PECdBtUnt77sx25TPw==", + "license": "MIT OR Apache-2.0" }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "node_modules/@borewit/text-codec": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz", + "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==", "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, "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==", + "version": "6.20.2", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.2.tgz", + "integrity": "sha512-G5FPkgIiLjOgZMjqVjvuKQ1rGPtHogLldJr33eFJdVLtmwY+giGrlv/ewljLz6b9BSQLkjxuwBc6g6omDM+YxQ==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -413,15 +483,30 @@ "@lezer/javascript": "^1.0.0" } }, + "node_modules/@codemirror/lang-markdown": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", + "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.7.1", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.3.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/markdown": "^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==", + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", + "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", - "@lezer/common": "^1.1.0", + "@lezer/common": "^1.5.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" @@ -439,13 +524,13 @@ } }, "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==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.0.tgz", + "integrity": "sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", + "@codemirror/view": "^6.37.0", "crelt": "^1.0.5" } }, @@ -459,9 +544,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.42.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.42.1.tgz", - "integrity": "sha512-ToN3oFc0nsxNUYVF5P0ztLgbC4UPPjPtA9aKYhkOKQaZASpOUo6ISXyQLP66ctVwlDc+j6Jv0uK5IFALkiXztg==", + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.0.tgz", + "integrity": "sha512-V7ZCLQO3Jus9hzh2jVCCPW3mO4IBMr43O37PqSUYautJSnnJF41YlgLw21x0fLJTYvJ+Vkm6Gp+qKGH9pltgXA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.6.0", @@ -470,20 +555,29 @@ "w3c-keyname": "^2.2.4" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-1.0.0.tgz", - "integrity": "sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ==", + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=14.17.0" + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -502,6 +596,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -514,6 +609,7 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -523,7 +619,9 @@ "version": "0.23.5", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", @@ -533,48 +631,148 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/config-array/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/css": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@eslint/css/-/css-1.2.0.tgz", + "integrity": "sha512-aVASadH1EVw+6A+JuzRmV+v2MIsoVolj/k6/jqAXlP6bB0LYrTwH9DI4RO1Z/vvM3BZxMyqsB9QGnnOm78z9iQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "@eslint/css-tree": "^4.0.2", + "@eslint/plugin-kit": "^0.7.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/css-tree": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-4.0.3.tgz", + "integrity": "sha512-lMgQJ5zg4YwsGPWtKS7Rc5Z4xqc2B9iOTtmDvhjMRa8GJ8/9zoKRtz26D7gCtWquy0J7oyeOJBwRP5M8slM/4w==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "mdn-data": "2.28.0", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=6.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" }, "peerDependenciesMeta": { - "supports-color": { + "eslint": { "optional": true } } }, - "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==", - "license": "MIT" + "node_modules/@eslint/json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@eslint/json/-/json-1.2.0.tgz", + "integrity": "sha512-CEFEyNgvzu8zn5QwVYDg3FaG+ZKUeUsNYitFpMYJAqoAlnw68EQgNbUfheSmexZr4n0wZPrAkPLuvsLaXO6wRw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "@humanwhocodes/momoa": "^3.3.10", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } }, - "node_modules/@eslint/config-helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", - "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", + "node_modules/@eslint/json/node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.2.1" + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "node_modules/@eslint/markdown": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-8.0.1.tgz", + "integrity": "sha512-WWKmld/EyNdEB8GMq7JMPX1SDWgyJAM1uhtCi5ySrqYQM4HQjmg11EX/q3ZpnpRXHfdccFtli3NBvvGaYjWyQw==", + "dev": true, + "license": "MIT", + "workspaces": [ + "examples/*" + ], + "dependencies": { + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "github-slugger": "^2.0.0", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.1.0", + "mdast-util-math": "^3.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "micromark-extension-gfm": "^3.0.0", + "micromark-extension-math": "^3.1.0", + "micromark-util-normalize-identifier": "^2.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/markdown/node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@types/json-schema": "^7.0.15" + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -584,7 +782,9 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" } @@ -593,6 +793,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/core": "^1.2.1", @@ -602,42 +803,63 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz", + "integrity": "sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } + }, "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==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "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==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.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==", + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "peer": true, "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=12.22" }, @@ -646,10 +868,23 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@humanwhocodes/momoa": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.3.10.tgz", + "integrity": "sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18.18" }, @@ -658,639 +893,1633 @@ "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/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, - "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", + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "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/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "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/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "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==", + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], "dev": true, "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "url": "https://opencollective.com/libvips" }, - "peerDependencies": { - "tslib": "2" + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" } }, - "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==", + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], "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" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "url": "https://opencollective.com/libvips" }, - "peerDependencies": { - "tslib": "2" + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" } }, - "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==", + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "url": "https://opencollective.com/libvips" }, - "peerDependencies": { - "tslib": "2" + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, - "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==", + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } }, - "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/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } }, - "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/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, - "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/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, - "node_modules/@lezer/html": { - "version": "1.3.12", - "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.12.tgz", - "integrity": "sha512-RJ7eRWdaJe3bsiiLLHjCFT1JMk8m1YP9kaUbvu2rMLEoOnke9mcTVDyfOslsln0LtujdWespjJ39w6zo+RsQYw==", - "license": "MIT", + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "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/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jitl/quickjs-ffi-types": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-ffi-types/-/quickjs-ffi-types-0.32.0.tgz", + "integrity": "sha512-v9T+GQpmk43VDJ7d72sf0Nexhk+ArvtUihW27dy7lqAl0zBObFKtSBBIm5RBjwIhE8VwsPPm9PNuvPvNqLWUEg==", + "license": "MIT" + }, + "node_modules/@jitl/quickjs-wasmfile-debug-asyncify": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-debug-asyncify/-/quickjs-wasmfile-debug-asyncify-0.32.0.tgz", + "integrity": "sha512-EX8zbXwGqCgAE764M+qvkHtyXDi/FUoMBea0JnES7vCM3P7a2+EOZOjGv85wtZ2sJhI1oJ+nekmqpOODFDY+hw==", + "license": "MIT", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.32.0" + } + }, + "node_modules/@jitl/quickjs-wasmfile-debug-sync": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-debug-sync/-/quickjs-wasmfile-debug-sync-0.32.0.tgz", + "integrity": "sha512-LeYWrPGC1uNCTBWvibo3ZLJj0CSVNYUXvJpXMCmuQ5Sap2cCACc3uvGvYV4homHHBAzfw5akoTqMMS4YFRtw+Q==", + "license": "MIT", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.32.0" + } + }, + "node_modules/@jitl/quickjs-wasmfile-release-asyncify": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-release-asyncify/-/quickjs-wasmfile-release-asyncify-0.32.0.tgz", + "integrity": "sha512-3oSwPfja12ICz4aIblB58cuY8JlEq5Txt8Cut4VLo+LH47QN+mzCnSgnbB03hWzg1LBcc+VyyI9UOag7a1NF+Q==", + "license": "MIT", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.32.0" + } + }, + "node_modules/@jitl/quickjs-wasmfile-release-sync": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-release-sync/-/quickjs-wasmfile-release-sync-0.32.0.tgz", + "integrity": "sha512-BKNDI/TPBfGlLNGYpLrhcDGXmIk4xHm4MRAisOBnOzpXVn9HZWsfmMAc9WMBrAHjvvds6HOikKeaOBKdPdpVrg==", + "license": "MIT", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.32.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "license": "MIT" + }, + "node_modules/@lezer/css": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.3.tgz", + "integrity": "sha512-RzBo8r+/6QJeow7aPHIpGVIH59xTcJXp399820gZoMo9noQDRVpJLheIBUicYwKcsbOYoBRoLZlf2720dG/4Tg==", + "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.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz", + "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==", + "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.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "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.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/markdown": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.6.4.tgz", + "integrity": "sha512-N0SxazMj4k65DBfaf1azqtMZd6u7MqluP84/NZnB/io8Td9aleFmAhz9hcbvSfsxT5tdYlJ5qgv5aMJGY4zEtA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^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/@mixmark-io/domino": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", + "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", + "license": "BSD-2-Clause" + }, + "node_modules/@mongodb-js/zstd": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/zstd/-/zstd-7.0.0.tgz", + "integrity": "sha512-mQ2s0pYYiav+tzCDR05Zptem8Ey2v8s11lri5RKGhTtL4COVCvVCk5vtyRYNT+9L8qSfyOqqefF9UtnW8mC5jA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "node-addon-api": "^8.5.0", + "prebuild-install": "^7.1.3" + }, + "engines": { + "node": ">= 20.19.0" + } + }, + "node_modules/@nisoku/sairin": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nisoku/sairin/-/sairin-0.1.2.tgz", + "integrity": "sha512-59Lk4GZZ8pMs6CnuOD75WliJvf+/IqdEke1Ao0iQARGhKwrsIsJTBDYgkaKjaBl5W7s+9svOwU9SYkUGRINU8Q==", + "license": "Apache-2.0", + "dependencies": { + "@nisoku/satori": "^0.1.3" + } + }, + "node_modules/@nisoku/satori": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@nisoku/satori/-/satori-0.1.3.tgz", + "integrity": "sha512-OeaPHfmiX2CpFhMRi+4VKAi9+u5bkfwK8L1RMRAvzTaIW4uMLYh19W8iHCpLrFf3JJgUDpvS50jYmmbN6ryW+g==", + "license": "MIT" + }, + "node_modules/@nodable/entities": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.0.0.tgz", + "integrity": "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "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/@replit/codemirror-indentation-markers": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/@replit/codemirror-indentation-markers/-/codemirror-indentation-markers-6.5.3.tgz", + "integrity": "sha512-hL5Sfvw3C1vgg7GolLe/uxX5T3tmgOA3ZzqlMv47zjU1ON51pzNWiVbS22oh6crYhtVhv8b3gdXwoYp++2ilHw==", + "license": "MIT", + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.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==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-virtual": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz", + "integrity": "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==", "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@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==", + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "license": "MIT" }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "dev": true, - "license": "MIT", + "node_modules/@swc/core": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.16.1.tgz", + "integrity": "sha512-nUaeu91O5QZKrQdaDCHd402ogUIoNOOjpkZNq0UomWK0G6gDaGmLhvddF1/3BXf5O8aLyo6ZPY/aMDWvaJQ/hg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.28" + }, "engines": { - "node": ">= 16" + "node": ">=10" }, "funding": { - "url": "https://paulmillr.com/funding/" + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.16.1", + "@swc/core-darwin-x64": "1.16.1", + "@swc/core-linux-arm-gnueabihf": "1.16.1", + "@swc/core-linux-arm64-gnu": "1.16.1", + "@swc/core-linux-arm64-musl": "1.16.1", + "@swc/core-linux-ppc64-gnu": "1.16.1", + "@swc/core-linux-s390x-gnu": "1.16.1", + "@swc/core-linux-x64-gnu": "1.16.1", + "@swc/core-linux-x64-musl": "1.16.1", + "@swc/core-win32-arm64-msvc": "1.16.1", + "@swc/core-win32-ia32-msvc": "1.16.1", + "@swc/core-win32-x64-msvc": "1.16.1" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } } }, - "node_modules/@peculiar/asn1-cms": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", - "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" + "node_modules/@swc/core-darwin-arm64": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.16.1.tgz", + "integrity": "sha512-zlJblJ8ncErD43lKdxjbUaUskJQf+LxiPXYcWXD8/8ZMV+7uuAT+CwjciLXpyZBd5Pq/S726bMpeeAwSeL1hhg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@peculiar/asn1-csr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", - "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" + "node_modules/@swc/core-darwin-x64": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.16.1.tgz", + "integrity": "sha512-IN0BmPWb0YAh/17mmlWB/HDBtTw2MfuW4hulf/tQAgTQBRH17l+z499bNJLK6LizSjqs0P7V+jU38Zj+vJC1DA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@peculiar/asn1-ecc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", - "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.16.1.tgz", + "integrity": "sha512-EYgrx2YOCQ2Twz2S793kqNjPkpvYVUPzzR95bIb7by+VQcyaai4lZZ2iz/tZvcFVKSNcN3/JTKwx+aBn2ZL52A==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@peculiar/asn1-pfx": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", - "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.16.1.tgz", + "integrity": "sha512-moyKm0YZlHdHohzm1YwgAyesqnE853rO0REMfJLFAova51wF9BNi+3ZW2PeS7Vqvn6HeJuepLpAHbBdZctxpHA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", - "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.16.1.tgz", + "integrity": "sha512-kKGBO9wdapiSzuf5ZzZ2fYtlu1BNSYtIIUxvH1ir/gcelTOREEHGDCLTDFx/2Knf878nU11A40z7LxwasEFxqA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", - "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pfx": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" + "node_modules/@swc/core-linux-ppc64-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.16.1.tgz", + "integrity": "sha512-nZ6qahtLxC3PM54cWOQZHxt4lTCF/3J4LIoWWzz6v7A+rLs8Dx54anYQf7mH3eIi8KlNpgKci/ie8ZSqFN8O7A==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@peculiar/asn1-rsa": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", - "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" + "node_modules/@swc/core-linux-s390x-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.16.1.tgz", + "integrity": "sha512-4ji5PNzhYq193Z4/4xUaSoNJza6iCkDJSzhetrbB6KOYxsr+kxtQr8ePWhMJUiMt6JUWtXaZ1PYT8FhtED+nGA==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.16.1.tgz", + "integrity": "sha512-VJQxqrisHV+B394IgrOu8YsIIXZgffnf5tO+yc9Z/hoUpuZEvuQTjWwlnpZdpyD+0nx6LTD1/3k646JYm43yJA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@peculiar/asn1-x509": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", - "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.16.1.tgz", + "integrity": "sha512-r9oV1mwxxsIGcLV1IQ/tw76MW3doatKze1QFWuC+a7QqJUkhY/bKTSVk6NpKKUGm2LDsE33Va8VqSClfA7vSiQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", - "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.16.1.tgz", + "integrity": "sha512-6huNRessoBLxWEqBm5zJXyCQ27TO7anvkdiuQ5MDO4CJni0nOXEqKtV9RllQ2TdyENKKsUMXVnIfW2hIXx/R5Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@peculiar/x509": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-csr": "^2.6.0", - "@peculiar/asn1-ecc": "^2.6.0", - "@peculiar/asn1-pkcs9": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" - }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.16.1.tgz", + "integrity": "sha512-OVKJFUzphrGmsh+BGtcZDesx0YryV7/Yvy5XGgTqnrZfjnyfcr5uaqYQugCckdIlupc5Vs3XtDjRAj12z4ZPlw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=20.0.0" + "node": ">=10" } }, - "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/@swc/core-win32-x64-msvc": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.16.1.tgz", + "integrity": "sha512-Bt+VIhWYCGk4urklnkkteLUOeLv1VxigwTCeB/xC6rBZxY6IIKdDwCJf6on3E3SUGsIqmQS6QqtuJQc1VxF4Aw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" } }, - "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/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" }, - "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", + "node_modules/@swc/types": { + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.28.tgz", + "integrity": "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw==", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*" + "@swc/counter": "^0.1.3" } }, - "node_modules/@types/codemirror": { - "version": "5.60.17", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.17.tgz", - "integrity": "sha512-AZq2FIsUHVMlp7VSe2hTfl5w4pcUkoFkM3zVsRKsn1ca8CXRDYvnin04+HP2REkwsxemuHqvDofdlhUWNpbwfw==", + "node_modules/@swc/wasm": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.16.1.tgz", + "integrity": "sha512-CHDxeM0GJQyYbS/sxTgJQl0Io+yPSMwptKIt8nQA9e3yvcLphhsLBOzhDaUEGBIkP8DRAOSnDvW2d65CrZ3FjA==", + "license": "Apache-2.0" + }, + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", "license": "MIT", "dependencies": { - "@types/tern": "*" + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/ms": "*" } }, - "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==", + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", "dev": true, "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } + "peer": true }, - "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==", + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } + "peer": true + }, + "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/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==", + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@types/unist": "*" } }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, "license": "MIT" }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "node_modules/@types/katex": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", + "dev": true, "license": "MIT" }, - "node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "license": "MIT", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" + "@types/unist": "*" } }, - "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==", + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } + "license": "MIT" }, - "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==", + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "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==", + "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/split.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@types/split.js/-/split.js-1.4.0.tgz", + "integrity": "sha512-F7WJo1shVud/hCAazszCNtoTVEYFSlJAbz4LODqnn+e4VNiEzaN+/lDBs2IKRuzBGIbaiJQO8AHSrNvE5f8Hhg==", "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==", + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", + "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/type-utils": "8.59.4", + "@typescript-eslint/utils": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.4", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "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/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } }, - "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==", + "node_modules/@typescript-eslint/parser": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", + "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } }, - "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==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", + "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "@typescript-eslint/tsconfig-utils": "^8.59.4", + "@typescript-eslint/types": "^8.59.4", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "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.", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", + "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", "dev": true, "license": "MIT", "dependencies": { - "prettier": "*" + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", + "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "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==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz", + "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==", "dev": true, "license": "MIT", "dependencies": { - "@types/express": "*" + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "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==", + "node_modules/@typescript-eslint/types": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", + "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", "dev": true, "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", + "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@typescript-eslint/project-service": "8.59.4", + "@typescript-eslint/tsconfig-utils": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "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.", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, - "license": "MIT", - "dependencies": { - "split.js": "*" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "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==", + "node_modules/@typescript-eslint/utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", + "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", + "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "*" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "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==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", + "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@typescript-eslint/types": "8.59.4", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@uiw/codemirror-theme-bbedit": { @@ -1336,165 +2565,13 @@ "@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, + "node_modules/@vercel/oidc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", + "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", "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" + "engines": { + "node": ">= 20" } }, "node_modules/@xml-tools/parser": { @@ -1506,43 +2583,11 @@ "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/@xterm/addon-fit": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.11.0.tgz", + "integrity": "sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==", + "license": "MIT" }, "node_modules/acorn": { "version": "8.16.0", @@ -1556,19 +2601,6 @@ "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", @@ -1578,66 +2610,94 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/ai": { + "version": "6.0.261", + "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.261.tgz", + "integrity": "sha512-W+S9pGvYxRN2lUrdTK20GRp+9HuMzsZexYb2tWWqlDBHuaHQoRn2Iiz4VMcV3+QaZRC8IuKBcMgHtMn215OBiQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "3.0.177", + "@ai-sdk/provider": "3.0.15", + "@ai-sdk/provider-utils": "4.0.46", + "@opentelemetry/api": "^1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "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/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, + "node_modules/almostnode": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/almostnode/-/almostnode-0.2.14.tgz", + "integrity": "sha512-Sp+S0JYToYP2g5A6MoIZQpzDIuRrNiU13FLJ9kRbB7c6DqS/7sG3rDG8qqhsijbQDSZKp02Y2pH9tlnM+s8NIw==", "license": "MIT", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" + "@ai-sdk/openai": "^3.0.28", + "@ai-sdk/react": "^3.0.87", + "@xterm/addon-fit": "^0.11.0", + "@xterm/xterm": "^6.0.0", + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "ai": "^6.0.85", + "brotli": "^1.3.3", + "brotli-wasm": "^3.0.1", + "comlink": "^4.4.2", + "css-tree": "^3.1.0", + "just-bash": "^2.7.0", + "pako": "^2.1.0", + "resolve.exports": "^2.0.3", + "vite-plugin-top-level-await": "^1.6.0", + "vite-plugin-wasm": "^3.5.0", + "zod": "^4.3.6" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">=20.0.0" } }, - "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, + "node_modules/almostnode/node_modules/@xterm/xterm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-6.0.0.tgz", + "integrity": "sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } + "workspaces": [ + "addons/*" + ] }, - "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" + "node_modules/almostnode/node_modules/pako": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.2.0.tgz", + "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } + "license": "(MIT AND Zlib)" }, "node_modules/ansi-styles": { "version": "4.3.0", @@ -1655,54 +2715,17 @@ "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.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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/asn1js": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } + "node_modules/anynum": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" }, "node_modules/async": { "version": "3.2.6", @@ -1720,112 +2743,100 @@ "node": "18 || 20 || >=22" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/baseline-browser-mapping": { - "version": "2.9.11", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", - "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "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.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "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.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" + "baseline-browser-mapping": "dist/cli.cjs" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6.0.0" } }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "dev": true, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", + "optional": true, "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/body-parser/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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", - "engines": { - "node": ">= 0.8" + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "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, + "node_modules/bl/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==", "license": "MIT", + "optional": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/braces": { @@ -1841,10 +2852,28 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "node_modules/brotli-wasm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/brotli-wasm/-/brotli-wasm-3.0.1.tgz", + "integrity": "sha512-U3K72/JAi3jITpdhZBqzSUq+DUY697tLxOuFXB+FpAE/Ug+5C3VZrv4uA674EUZHxNAuQ9wETXNqQkxZD6oL4A==", + "license": "Apache-2.0", + "engines": { + "node": ">=v18.0.0" + } + }, "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "funding": [ { "type": "opencollective", @@ -1861,11 +2890,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -1874,84 +2903,34 @@ "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/bytestreamjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=6.0.0" - } - }, - "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, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -1968,6 +2947,17 @@ ], "license": "CC-BY-4.0" }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1985,6 +2975,17 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chevrotain": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", @@ -1994,68 +2995,12 @@ "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, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "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" - } + "optional": true }, "node_modules/codemirror": { "version": "6.0.2", @@ -2092,132 +3037,28 @@ "dev": true, "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/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" }, "node_modules/commander": { - "version": "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/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": "14.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-14.0.0.tgz", - "integrity": "sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "license": "MIT", - "dependencies": { - "glob-parent": "^6.0.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^7.0.3", - "tinyglobby": "^0.2.12" - }, "engines": { - "node": ">= 20.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" + "node": ">=16" } }, + "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/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -2230,10 +3071,29 @@ "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "license": "MIT" }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2244,220 +3104,157 @@ "node": ">= 8" } }, - "node_modules/css-declaration-sorter": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.1.tgz", - "integrity": "sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==", - "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, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.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/css-tree/node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" }, - "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, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=18" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "character-entities": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", + "optional": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "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, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", + "optional": true, "engines": { - "node": ">= 0.8" + "node": ">=4.0.0" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } + "peer": true }, - "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, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "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.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", - "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", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/enhanced-resolve": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", - "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "dequal": "^2.0.0" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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" - }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", "engines": { - "node": ">=4" + "node": ">=0.3.1" } }, - "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/electron-to-chromium": { + "version": "1.5.353", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.353.tgz", + "integrity": "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==", + "license": "ISC" }, - "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, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "optional": true, + "dependencies": { + "once": "^1.4.0" } }, - "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "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, + "node_modules/esbuild-wasm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.28.0.tgz", + "integrity": "sha512-5TRVKExcEmeMkccIZMzUq+Az6X2RoMAJyfl6SMMO1dMVhmvt0I2mx7gAb6zYi42n4d1ETcatFXazGKzA+aW7fg==", "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">= 0.4" + "node": ">=18" } }, "node_modules/escalade": { @@ -2469,17 +3266,13 @@ "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==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -2488,15 +3281,17 @@ } }, "node_modules/eslint": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz", - "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.0.tgz", + "integrity": "sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.5.5", + "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", @@ -2543,168 +3338,51 @@ } }, "node_modules/eslint-linter-browserify": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/eslint-linter-browserify/-/eslint-linter-browserify-10.3.0.tgz", - "integrity": "sha512-wrI/6uxKnVA6qabsiM6Q1SfqgoDvwX3f3DepbrDxdKn0yqDDY/Y2xvUR0TjhB/0s77gVxZd6FTKz5dXW2RTzmA==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/eslint-linter-browserify/-/eslint-linter-browserify-10.4.0.tgz", + "integrity": "sha512-t+/MW8/y3EHwmDHDXcj59W1N20qRMa7H2m1JmzXqmruAsrrCgFPPfrSjvUydfX/edC3joNCgbkFQsil5ENnW3A==", "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": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "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/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==", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, "dependencies": { - "yocto-queue": "^0.1.0" + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "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" - }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", @@ -2721,7 +3399,9 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -2729,20 +3409,13 @@ "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==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -2750,21 +3423,13 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "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", + "peer": true, "engines": { "node": ">=4.0" } @@ -2773,146 +3438,117 @@ "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", + "license": "BSD-2-Clause", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "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, + "node_modules/eventsource-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", "license": "MIT", "engines": { - "node": ">=0.8.x" + "node": ">=18.0.0" } }, - "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "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.14.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" - }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "optional": true, "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=6" } }, "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" + "dev": true, + "license": "MIT", + "peer": true }, "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==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-xml-builder": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.1.tgz", + "integrity": "sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" + "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.6.2", + "xml-naming": "^0.3.0" + } }, - "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, + "node_modules/fast-xml-parser": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.11.0.tgz", + "integrity": "sha512-9IGxMqvqLOnqP+Egi1nqDHKv5k8aZ7r9n558enxcucmyVGEBNPAU+MOg/8jPIS7rO7sSq4gFm1/nHtiaubMruw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT", - "engines": { - "node": ">= 4.9.1" + "dependencies": { + "@nodable/entities": "^3.0.0", + "fast-xml-builder": "^1.2.0", + "is-unsafe": "^2.0.0", + "path-expression-matcher": "^1.6.2", + "strnum": "^2.4.2", + "xml-naming": "^0.3.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" } }, - "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==", + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "websocket-driver": ">=0.5.1" + "format": "^0.2.0" }, - "engines": { - "node": ">=0.8.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/fdir": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", - "dev": true, + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -2926,6 +3562,9 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -2939,66 +3578,62 @@ "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, + "node_modules/file-type": { + "version": "21.3.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz", + "integrity": "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==", "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.4.0" }, "engines": { - "node": ">=8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "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": { - "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" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.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": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -3011,59 +3646,30 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "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" + "license": "ISC", + "peer": true }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.4.x" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "optional": true }, "node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", "dev": true, "license": "MIT", "dependencies": { @@ -3079,7 +3685,6 @@ "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, @@ -3090,16 +3695,6 @@ "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", @@ -3109,44 +3704,19 @@ "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, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "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" - } + "optional": true }, - "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==", + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } + "license": "ISC" }, "node_modules/glob": { "version": "13.0.6", @@ -3170,128 +3740,44 @@ "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==", - "dev": true, - "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", + "license": "ISC", + "peer": true, "dependencies": { - "function-bind": "^1.1.2" + "is-glob": "^4.0.3" }, "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": ">=10.13.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==", + "node_modules/globals": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", "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" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": "MIT" + "license": "ISC" }, - "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==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">=8" } }, "node_modules/htmlhint": { @@ -3321,115 +3807,33 @@ "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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - } - }, - "node_modules/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" - } + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 4" } @@ -3440,30 +3844,13 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "license": "MIT" }, - "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==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.19" } @@ -3474,75 +3861,20 @@ "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" - }, + "node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "license": "ISC", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3552,6 +3884,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -3560,38 +3893,6 @@ "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", @@ -3602,47 +3903,17 @@ "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/is-unsafe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.2.tgz", + "integrity": "sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" }, "node_modules/isarray": { "version": "1.0.0", @@ -3653,49 +3924,9 @@ "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==", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } + "license": "ISC" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -3718,19 +3949,32 @@ "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==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "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==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/json5": { "version": "2.2.3", @@ -3745,9 +3989,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3769,69 +4013,81 @@ "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", + "node_modules/just-bash": { + "version": "2.14.5", + "resolved": "https://registry.npmjs.org/just-bash/-/just-bash-2.14.5.tgz", + "integrity": "sha512-MCBGnRlDeZ/MM7mcw+ZuSGFMBsggajrmKz6e/hrOAN7syvVZkjiY+Vh2wyCwN/CdcnAX5SxbiQB51n5nrQuX+g==", + "license": "Apache-2.0", "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" + "diff": "^8.0.2", + "fast-xml-parser": "^5.7.3", + "file-type": "^21.2.0", + "ini": "^6.0.0", + "minimatch": "^10.1.1", + "modern-tar": "^0.7.3", + "papaparse": "^5.5.3", + "quickjs-emscripten": "^0.32.0", + "re2js": "^1.2.1", + "seek-bzip": "^2.0.0", + "smol-toml": "^1.6.0", + "sprintf-js": "^1.1.3", + "sql.js": "^1.13.0", + "turndown": "^7.2.2", + "yaml": "^2.8.2" + }, + "bin": { + "just-bash": "dist/bin/just-bash.js", + "just-bash-shell": "dist/bin/shell/shell.js" + }, + "optionalDependencies": { + "@mongodb-js/zstd": "^7.0.0", + "node-liblzma": "^2.0.3" } }, - "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==", + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], "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" + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" } }, - "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==", + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, - "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==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" + "json-buffer": "3.0.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==", + "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3849,1320 +4105,2017 @@ "immediate": "~3.0.5" } }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "18.0.10", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.10.tgz", + "integrity": "sha512-FJeH4bRpYoXiggcgriCGItKCSv3xkngJc4QCZ/rkQCogU3VYaLxYJoZl8Nw/b4+x7iij/pd+09mZ6A1dXzpL0A==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.11.5" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" }, - "engines": { - "node": ">=8" - } - }, - "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" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/memfs": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", - "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "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" + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "dev": true, "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/merge-stream": { + "node_modules/mdast-util-gfm-strikethrough": { "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==", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": ">=8.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8.6" + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/mdast-util-math": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", + "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "longest-streak": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.1.0", + "unist-util-remove-position": "^5.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dev": true, - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "@types/mdast": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/mdn-data": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.28.0.tgz", + "integrity": "sha512-uy9AS1yt+wW5eUEefgE3lOpqPghanUttycV0GXKbiXyBjwvbeE8XPj4u1C+voRfz7dEjwU4NDHTMfZ/s/JtZrQ==", "dev": true, - "license": "MIT" + "license": "CC0-1.0" }, - "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==", + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "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==", + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "license": "MIT", - "peer": true, - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "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==", + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "dev": true, "license": "MIT", "dependencies": { - "@types/sarif": "^2.1.7", - "fs-extra": "^11.1.1" + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "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==", + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "dev": true, "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">= 0.8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/open": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", - "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", "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" + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.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==", + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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==", + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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==", + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "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" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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==", + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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==", + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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==", + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/path-scurry": { + "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "dev": true, - "license": "BlueOak-1.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "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==", + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "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.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "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==", + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/pkijs": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", - "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "dev": true, - "license": "BSD-3-Clause", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "@noble/hashes": "1.4.0", - "asn1js": "^3.0.6", - "bytestreamjs": "^2.0.1", - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=16.0.0" + "micromark-util-types": "^2.0.0" } }, - "node_modules/postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "license": "MIT", - "peer": true, "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/postcss-less": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz", - "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==", + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "postcss": "^8.3.5" + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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==", + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], + "license": "MIT" + }, + "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", - "engines": { - "node": ">=12.0" + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, - "peerDependencies": { - "postcss": "^8.4.29" + "engines": { + "node": ">=8.6" } }, - "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==", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, + "optional": true, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/prettier-plugin-css-order": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-css-order/-/prettier-plugin-css-order-2.2.0.tgz", - "integrity": "sha512-GCkwEgQ2roT7le+zpUFQThPDO4x5EXcZmY9Rj6rvO++I/nATTGBWdZdsooha/BlvIBbZclJzXsgJdlKWrys9+w==", - "license": "ISC", + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", "dependencies": { - "css-declaration-sorter": "^7.3.0", - "postcss-less": "^6.0.0", - "postcss-scss": "^4.0.9" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16" + "node": "18 || 20 || >=22" }, - "peerDependencies": { - "prettier": "3.x" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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==", + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 0.10" + "node": ">=16 || 14 >=14.17" } }, - "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, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT", + "optional": true + }, + "node_modules/modern-tar": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.7.7.tgz", + "integrity": "sha512-t9VmxaqrmANnEOBhpSDI6HD192Ge48k8vmWqQQL7hSFEqHEYwZbbsu49+aKLWZeRvFs3j1pMhXOqqF4kPlvjkQ==", "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=18.0.0" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "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/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=6" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "dev": true, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } + "optional": true }, - "node_modules/pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.94.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.94.0.tgz", + "integrity": "sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==", "license": "MIT", + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, "engines": { - "node": ">=16.0.0" + "node": ">=10" } }, - "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" + "node_modules/node-abi/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "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, + "node_modules/node-addon-api": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.2.tgz", + "integrity": "sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==", "license": "MIT", + "optional": true, "engines": { - "node": ">= 0.6" + "node": "^18 || ^20 || >= 21" } }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "dev": true, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "dev": true, - "license": "MIT", + "node_modules/node-liblzma": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-liblzma/-/node-liblzma-2.2.0.tgz", + "integrity": "sha512-s0KzNOWwOJJgPG6wxg6cKohnAl9Wk/oW1KrQaVzJBjQwVcUGPQCzpR46Ximygjqj/3KhOrtJXnYMp/xYAXp75g==", + "hasInstallScript": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "node-addon-api": "^8.5.0", + "node-gyp-build": "^4.8.4" + }, + "bin": { + "nxz": "lib/cli/nxz.js" }, "engines": { - "node": ">= 0.8" + "node": ">=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "type": "github", + "url": "https://github.com/sponsors/oorabona" } }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "node_modules/node-releases": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "license": "MIT" }, - "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==", + "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": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" }, "engines": { - "node": ">= 6" + "node": ">=18" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "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==", + "license": "ISC", + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "picomatch": "^2.2.1" + "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": ">=8.10.0" + "node": ">= 0.8.0" } }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">=8.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "resolve": "^1.20.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true, - "license": "Apache-2.0" + "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/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==", + "node_modules/papaparse": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.6.0.tgz", + "integrity": "sha512-N2vuNQAYGK1/4vs6HJX86+VYU6OkiSTgdJz3JQfTk1y51cFCO/U8gnaeTF4iNE4r57Tt0sV47dUua1/19pxO6Q==", "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==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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, + "node_modules/path-expression-matcher": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "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": ">=14.0.0" } }, - "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==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", - "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==", + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 4" + "node": "20 || >=22" } }, - "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, + "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.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "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.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "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" + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": "^10 || ^12 || >=14" } }, - "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": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", - "dev": true, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "license": "MIT", + "optional": true, "dependencies": { - "@peculiar/x509": "^1.14.2", - "pkijs": "^3.3.3" + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" }, - "engines": { - "node": ">=18" - } - }, - "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" + "prebuild-install": "bin.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==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", - "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, + "node_modules/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "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, + "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/serialize-javascript": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", - "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "peer": true, "engines": { - "node": ">=20.0.0" + "node": ">=6" } }, - "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, + "node_modules/quickjs-emscripten": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/quickjs-emscripten/-/quickjs-emscripten-0.32.0.tgz", + "integrity": "sha512-So0Sqw869y/S2oE3Nuc0uT3Dhqgvsj8FSrwBdsuTosVsG8ME5/OcudU1GxsrIFdFABgy17GHnTVO9TYV/bLQcA==", "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" + "@jitl/quickjs-wasmfile-debug-asyncify": "0.32.0", + "@jitl/quickjs-wasmfile-debug-sync": "0.32.0", + "@jitl/quickjs-wasmfile-release-asyncify": "0.32.0", + "@jitl/quickjs-wasmfile-release-sync": "0.32.0", + "quickjs-emscripten-core": "0.32.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=16.0.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, + "node_modules/quickjs-emscripten-core": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/quickjs-emscripten-core/-/quickjs-emscripten-core-0.32.0.tgz", + "integrity": "sha512-QFnPfjFey8EqknSrSxe1hZrf1/8z7/6s1QzGOmKo6++02r7QRRX7ZoyNaZh7JuVjWsVW87KnQrbZqnHkOAzUyg==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "@jitl/quickjs-ffi-types": "0.32.0" } }, - "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", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "optional": true, "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "engines": { - "node": ">= 0.6" + "bin": { + "rc": "cli.js" } }, - "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/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC", + "optional": true }, - "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/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } }, - "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, + "node_modules/re2js": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/re2js/-/re2js-1.3.3.tgz", + "integrity": "sha512-s/I5zEAo79SUK0Qw4dpZKpiMwbQ6Gz0KU2NRr7eaO4x/p2g7Vvmn3hdeXDg8VsaUjfj/ora+e9oi27LX/C9+mw==", + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "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, + "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": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" + "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/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==", + "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/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/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "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, + "node_modules/rolldown": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" } }, - "node_modules/shebang-command": { + "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/seek-bzip": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-2.0.0.tgz", + "integrity": "sha512-SMguiTnYrhpLdk3PwfzHeotrcwi8bNV4iemL9tx9poR/yeaMYwB9VzR1w7b57DuWpuqR8n6oZboi0hj3AxZxQg==", "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "commander": "^6.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" } }, - "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==", + "node_modules/seek-bzip/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 6" } }, - "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/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/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==", + "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/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "dev": true, - "license": "MIT", + "hasInstallScript": true, + "license": "Apache-2.0", "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" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { - "node": ">= 0.4" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "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==", + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "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==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "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==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", - "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": ">=8" } }, - "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, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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", + "optional": true + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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", + "optional": true, "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "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, + "node_modules/smol-toml": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", + "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" } }, "node_modules/source-map-js": { @@ -5170,423 +6123,410 @@ "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, + "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/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/sql.js": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.14.2.tgz", + "integrity": "sha512-3ZGPovObMFrdw79zrUHbfdE/DLIsy8jdNdssmMSQuRAymedU6q84asPt0kgiqrdMYlPegDItiIMfmIXzZnYFcw==", + "license": "MIT" + }, + "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": { - "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" + "safe-buffer": "~5.1.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==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", - "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": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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, + "node_modules/strnum": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.2.tgz", + "integrity": "sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "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" + "anynum": "^1.0.1" } }, - "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, + "node_modules/strtok3": { + "version": "10.3.5", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", + "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==", "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "@tokenizer/token": "^0.3.0" }, "engines": { - "node": ">=6.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "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, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", "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==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "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, + "node_modules/swr": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.5.1.tgz", + "integrity": "sha512-BRw55e8r0B7SpDN20CAzoQAHl7y1yP7/Zt7oqUjMv0vSt2u2Xnkm88Ws+VypbV9BXHQVuSuyVq7zMjO16wSExw==", "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "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, + "node_modules/tar-fs": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz", + "integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==", "license": "MIT", + "optional": true, "dependencies": { - "safe-buffer": "~5.2.0" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "license": "MIT", - "engines": { - "node": ">=8" + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, - "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==", - "dev": true, + "node_modules/tar-stream/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==", "license": "MIT", + "optional": true, "dependencies": { - "has-flag": "^4.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "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, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "dev": true, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { - "node": ">=6" + "node": ">=12.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/terser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "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": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" + "is-number": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=8.0" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.17", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.17.tgz", - "integrity": "sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==", - "dev": true, + "node_modules/token-types": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", + "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" + "@borewit/text-codec": "^0.2.1", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">=14.16" }, "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 - } + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "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==", + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, - "license": "Unlicense", + "license": "MIT", "engines": { - "node": ">=10.18" + "node": ">=18.12" }, "peerDependencies": { - "tslib": "^2" + "typescript": ">=4.8.4" } }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "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": "MIT" + "license": "0BSD", + "optional": true }, - "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", + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": "*" } }, - "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, + "node_modules/turndown": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.4.tgz", + "integrity": "sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ==", "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "@mixmark-io/domino": "^2.2.0" }, "engines": { - "node": ">=8.0" + "node": ">=18", + "npm": ">=9" } }, - "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==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, "engines": { - "node": ">=0.6" + "node": ">= 0.8.0" } }, - "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==", + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "peerDependencies": { - "tslib": "2" + "engines": { + "node": ">=14.17" } }, - "node_modules/ts-loader": { - "version": "9.5.7", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.7.tgz", - "integrity": "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==", + "node_modules/typescript-eslint": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.4.tgz", + "integrity": "sha512-Rw6+44QNFaXtgHSjPy+Kw8hrJniMYzR85E9yLmOLcfZ91/rz+JXQbDTCmc6ccxMPY6K6PgAq26f0JCBfR7LIPQ==", "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" + "@typescript-eslint/eslint-plugin": "8.59.4", + "@typescript-eslint/parser": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4" }, "engines": { - "node": ">=12.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.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==", + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "dev": true, - "license": "0BSD" + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/tsyringe": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^1.9.3" + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" }, - "engines": { - "node": ">= 6.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tsyringe/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "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==", + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "dev": true, "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, - "engines": { - "node": ">=14.17" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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", @@ -5597,16 +6537,6 @@ "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.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -5641,327 +6571,181 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.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, + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "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.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", - "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.106.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", - "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", - "dev": true, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "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.16.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.20.0", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "loader-runner": "^4.3.1", - "mime-db": "^1.54.0", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.17", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.4" + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" }, "bin": { - "webpack": "bin/webpack.js" + "vite": "bin/vite.js" }, "engines": { - "node": ">=10.13.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.0.2.tgz", - "integrity": "sha512-dB0R4T+C/8YuvM+fabdvil6QE44/ChDXikV5lOOkrUeCkW5hTJv2pGLE3keh+D5hjYw8icBaJkZzpFoaHV4T+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^1.0.0", - "commander": "^14.0.3", - "cross-spawn": "^7.0.6", - "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" + "url": "https://github.com/vitejs/vite?sponsor=1" }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "webpack": "^5.101.0", - "webpack-bundle-analyzer": "^4.0.0 || ^5.0.0", - "webpack-dev-server": "^5.0.0" + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "webpack-bundle-analyzer": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { "optional": true }, - "webpack-dev-server": { + "yaml": { "optional": true } } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "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==", + "node_modules/vite-plugin-singlefile": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-2.3.3.tgz", + "integrity": "sha512-XVnGH0QzbOa8fxRSsHdCarVN1BSBXNi7uLMQYlrGRN5apdHkk62XQWRJhVever0lnfuyBkwn+kvVChdm/OoOUg==", "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.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.4.tgz", - "integrity": "sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.25", - "@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.8.1", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.22.1", - "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": "^5.5.0", - "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" + "micromatch": "^4.0.8" }, "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">18.0.0" }, "peerDependencies": { - "webpack": "^5.0.0" + "rollup": "^4.59.0", + "vite": "^5.4.21 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { + "rollup": { "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, + "node_modules/vite-plugin-top-level-await": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.6.0.tgz", + "integrity": "sha512-bNhUreLamTIkoulCR9aDXbTbhLk6n1YE8NJUTTxl5RYskNRtzOR0ASzSjBVRtNdjIfngDXo11qOsybGLNsrdww==", "license": "MIT", "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" + "@rollup/plugin-virtual": "^3.0.2", + "@swc/core": "^1.12.14", + "@swc/wasm": "^1.12.14", + "uuid": "10.0.0" }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", - "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" + "peerDependencies": { + "vite": ">=2.8" } }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, + "node_modules/vite-plugin-wasm": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.6.0.tgz", + "integrity": "sha512-mL/QPziiIA4RAA6DkaZZzOstdwbW5jO4Vz7Zenj0wieKWBlNvIvX5L5ljum9lcUX0ShNfBgCNLKTjNkRVVqcsw==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "vite": "^2 || ^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "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/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/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/wasm-git": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/wasm-git/-/wasm-git-0.0.17.tgz", + "integrity": "sha512-eAWLe2BQrx23t9jjffV5BkwbVW1c9nfUh4KDzPgMMKynNPGGTqztGYuJZY0x60hyO6clIn4eFUNkFnY535XtHw==" }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -5973,43 +6757,24 @@ "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/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", + "peer": true, "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": ">=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==", + "license": "ISC", + "optional": true + }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", @@ -6017,22 +6782,92 @@ "dev": true, "license": "MIT" }, + "node_modules/xml-naming": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", + "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/xterm": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.3.0.tgz", + "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==", + "deprecated": "This package is now deprecated. Move to @xterm/xterm instead.", + "license": "MIT" + }, + "node_modules/xterm-addon-fit": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.8.0.tgz", + "integrity": "sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==", + "deprecated": "This package is now deprecated. Move to @xterm/addon-fit instead.", + "license": "MIT", + "peerDependencies": { + "xterm": "^5.0.0" + } + }, "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/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/Build/package.json b/Build/package.json index b991705..06a08e8 100644 --- a/Build/package.json +++ b/Build/package.json @@ -1,53 +1,76 @@ { "name": "htmlrunner", - "version": "1.1.0", + "version": "2.0.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" + "start": "npm i && npm run dev", + "dev": "vite", + "build": "vite build", + "build:single": "cross-env SINGLE_FILE=true npm run build", + "preview": "vite preview", + "lint": "eslint \"src/**/*.{ts,js}\" --ext .ts,.js || true", + "make-pretty": "prettier --write \"src/**/*.{ts,js,css,html}\"", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/HTMLToolkit/HTMLRunner.git" }, "keywords": [], - "author": "", - "license": "ISC", + "author": "NellowTCS", + "license": "MIT", "dependencies": { "@babel/core": "^7.29.0", "@babel/parser": "^7.29.3", "@babel/runtime": "^7.29.2", + "@biomejs/js-api": "^4.0.0", + "@biomejs/wasm-web": "^2.4.15", + "@codemirror/autocomplete": "^6.20.2", "@codemirror/commands": "^6.10.3", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-html": "^6.4.11", "@codemirror/lang-javascript": "^6.2.5", + "@codemirror/lang-markdown": "^6.5.0", "@codemirror/lint": "^6.9.6", "@codemirror/state": "^6.6.0", - "@codemirror/view": "^6.42.1", + "@codemirror/view": "^6.43.0", + "@fortawesome/fontawesome-free": "^7.2.0", + "@nisoku/sairin": "^0.1.2", "@prettier/plugin-xml": "^3.4.2", - "@types/codemirror": "^5.60.17", + "@replit/codemirror-indentation-markers": "^6.5.3", "@uiw/codemirror-theme-bbedit": "^4.25.9", "@uiw/codemirror-theme-monokai": "^4.25.9", + "almostnode": "^0.2.14", + "buffer": "^6.0.3", "codemirror": "^6.0.2", - "eslint": "^10.3.0", + "comlink": "^4.4.2", + "esbuild-wasm": "^0.28.0", "eslint-linter-browserify": "^10.3.0", "file-saver": "^2.0.5", - "fontawesome": "^5.6.3", "jszip": "^3.10.1", + "marked": "^18.0.10", "prettier": "^3.8.3", - "prettier-plugin-css-order": "^2.2.0", "split.js": "^1.6.5", - "copy-webpack-plugin": "^14.0.0" + "wasm-git": "^0.0.17", + "xterm": "^5.3.0", + "xterm-addon-fit": "^0.8.0" }, "devDependencies": { + "@eslint/css": "^1.2.0", + "@eslint/js": "^10.0.1", + "@eslint/json": "^1.2.0", + "@eslint/markdown": "^8.0.1", "@types/file-saver": "^2.0.7", - "@types/prettier": "^3.0.0", - "@types/split.js": "^1.6.0", - "copy-webpack-plugin": "^14.0.0", + "@types/prettier": "^2.7.3", + "@types/split.js": "^1.4.0", + "cross-env": "^10.1.0", + "globals": "^17.6.0", "htmlhint": "^1.9.2", - "ts-loader": "^9.5.7", + "sharp": "^0.34.4", "typescript": "^6.0.3", - "webpack": "^5.106.2", - "webpack-cli": "^7.0.2", - "webpack-dev-server": "^5.2.4" + "typescript-eslint": "^8.59.4", + "vite": "^8.0.12", + "vite-plugin-singlefile": "^2.3.0" } } diff --git a/Build/public/__sw__.js b/Build/public/__sw__.js new file mode 100644 index 0000000..93e4ac7 --- /dev/null +++ b/Build/public/__sw__.js @@ -0,0 +1,421 @@ +/** + * Service Worker for Mini WebContainers + * Intercepts fetch requests and routes them to virtual servers + * Version: 15 - cleanup: extract helpers, gate debug logs, remove test endpoints + */ + +const DEBUG = false; + +// Communication port with main thread +let mainPort = null; + +// Pending requests waiting for response +const pendingRequests = new Map(); +let requestId = 0; + +// Registered virtual server ports +const registeredPorts = new Set(); + +/** + * Decode base64 string to Uint8Array + */ +function base64ToBytes(base64) { + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return bytes; +} + +/** + * Handle messages from main thread + */ +self.addEventListener('message', (event) => { + const { type, data } = event.data; + + DEBUG && console.log('[SW] Received message:', type, 'hasPort in event.ports:', event.ports?.length > 0); + + // When a MessagePort is transferred, it's in event.ports[0], not event.data.port + if (type === 'init' && event.ports && event.ports[0]) { + // Initialize communication channel + mainPort = event.ports[0]; + mainPort.onmessage = handleMainMessage; + DEBUG && console.log('[SW] Initialized communication channel with transferred port'); + // Re-claim clients so that pages opened after SW activation get controlled. + // Without this, controllerchange never fires for late-arriving pages. + self.clients.claim(); + } + + if (type === 'server-registered' && data) { + registeredPorts.add(data.port); + DEBUG && console.log(`[SW] Server registered on port ${data.port}`); + } + + if (type === 'server-unregistered' && data) { + registeredPorts.delete(data.port); + DEBUG && console.log(`[SW] Server unregistered from port ${data.port}`); + } +}); + +/** + * Handle response messages from main thread + */ +function handleMainMessage(event) { + const { type, id, data, error } = event.data; + + DEBUG && console.log('[SW] Received message from main:', type, 'id:', id); + + if (type === 'response') { + const pending = pendingRequests.get(id); + DEBUG && console.log('[SW] Looking for pending request:', id, 'found:', !!pending); + + if (pending) { + pendingRequests.delete(id); + + if (error) { + DEBUG && console.log('[SW] Response error:', error); + pending.reject(new Error(error)); + } else { + DEBUG && console.log('[SW] Response data:', { + statusCode: data?.statusCode, + statusMessage: data?.statusMessage, + headers: data?.headers, + bodyType: data?.body?.constructor?.name, + bodyLength: data?.body?.length || data?.body?.byteLength, + }); + pending.resolve(data); + } + } + } + + // Handle streaming responses + if (type === 'stream-start') { + DEBUG && console.log('[SW] stream-start received, id:', id); + const pending = pendingRequests.get(id); + if (pending && pending.streamController) { + // Store headers/status for the streaming response + pending.streamData = data; + pending.resolveHeaders(data); + DEBUG && console.log('[SW] headers resolved for stream', id); + } else { + DEBUG && console.log('[SW] No pending request or controller for stream-start', id, !!pending, pending?.streamController); + } + } + + if (type === 'stream-chunk') { + DEBUG && console.log('[SW] stream-chunk received, id:', id, 'size:', data?.chunkBase64?.length); + const pending = pendingRequests.get(id); + if (pending && pending.streamController) { + try { + // Decode base64 chunk and enqueue + if (data.chunkBase64) { + const bytes = base64ToBytes(data.chunkBase64); + pending.streamController.enqueue(bytes); + DEBUG && console.log('[SW] chunk enqueued, bytes:', bytes.length); + } + } catch (e) { + console.error('[SW] Error enqueueing chunk:', e); + } + } else { + DEBUG && console.log('[SW] No pending request or controller for stream-chunk', id); + } + } + + if (type === 'stream-end') { + DEBUG && console.log('[SW] stream-end received, id:', id); + const pending = pendingRequests.get(id); + if (pending && pending.streamController) { + try { + pending.streamController.close(); + DEBUG && console.log('[SW] stream closed'); + } catch (e) { + DEBUG && console.log('[SW] stream already closed'); + } + pendingRequests.delete(id); + } + } +} + +/** + * Send request to main thread and wait for response + */ +async function sendRequest(port, method, url, headers, body) { + DEBUG && console.log('[SW] sendRequest called, mainPort:', !!mainPort, 'url:', url); + + if (!mainPort) { + // Ask all clients to re-send the init message + const allClients = await self.clients.matchAll({ type: 'window' }); + for (const client of allClients) { + client.postMessage({ type: 'sw-needs-init' }); + } + // Wait up to 5s for a client to re-initialize the port + // (main thread may be busy with heavy operations like CLI execution) + await new Promise(resolve => { + const check = setInterval(() => { if (mainPort) { clearInterval(check); resolve(); } }, 50); + setTimeout(() => { clearInterval(check); resolve(); }, 5000); + }); + if (!mainPort) { + throw new Error('Service Worker not initialized - no connection to main thread'); + } + } + + const id = ++requestId; + + return new Promise((resolve, reject) => { + pendingRequests.set(id, { resolve, reject }); + + // Set timeout for request + setTimeout(() => { + if (pendingRequests.has(id)) { + pendingRequests.delete(id); + reject(new Error('Request timeout')); + } + }, 30000); + + mainPort.postMessage({ + type: 'request', + id, + data: { port, method, url, headers, body }, + }); + }); +} + +/** + * Send streaming request to main thread + * Returns a ReadableStream that receives chunks from main thread + */ +async function sendStreamingRequest(port, method, url, headers, body) { + DEBUG && console.log('[SW] sendStreamingRequest called, url:', url); + + if (!mainPort) { + // Ask all clients to re-send the init message + const allClients = await self.clients.matchAll({ type: 'window' }); + for (const client of allClients) { + client.postMessage({ type: 'sw-needs-init' }); + } + await new Promise(resolve => { + const check = setInterval(() => { if (mainPort) { clearInterval(check); resolve(); } }, 50); + setTimeout(() => { clearInterval(check); resolve(); }, 5000); + }); + if (!mainPort) { + throw new Error('Service Worker not initialized'); + } + } + + const id = ++requestId; + + let streamController; + let resolveHeaders; + const headersPromise = new Promise(resolve => { resolveHeaders = resolve; }); + + const stream = new ReadableStream({ + start(controller) { + streamController = controller; + + // Store in pending requests so handleMainMessage can find it + pendingRequests.set(id, { + resolve: () => {}, + reject: (err) => controller.error(err), + streamController: controller, + resolveHeaders, + }); + + // Send request to main thread with streaming flag + mainPort.postMessage({ + type: 'request', + id, + data: { port, method, url, headers, body, streaming: true }, + }); + }, + cancel() { + pendingRequests.delete(id); + } + }); + + return { stream, headersPromise, id }; +} + +/** + * Intercept fetch requests + */ +self.addEventListener('fetch', (event) => { + const url = new URL(event.request.url); + + DEBUG && console.log('[SW] Fetch:', url.pathname, 'mainPort:', !!mainPort); + + // Check if this is a virtual server request + const match = url.pathname.match(/^\/__virtual__\/(\d+)(\/.*)?$/); + + if (!match) { + // Not a virtual request - but check if it's from a virtual context + // This handles plain links and asset requests (images, scripts) + // that should stay within the virtual server + const referer = event.request.referrer; + if (referer) { + try { + const refererUrl = new URL(referer); + const refererMatch = refererUrl.pathname.match(/^\/__virtual__\/(\d+)/); + if (refererMatch) { + // Request from within a virtual server context + const virtualPrefix = refererMatch[0]; + const virtualPort = parseInt(refererMatch[1], 10); + const targetPath = url.pathname + url.search; + + if (event.request.mode === 'navigate') { + // Navigation requests: redirect to include the virtual prefix + const redirectUrl = url.origin + virtualPrefix + targetPath; + DEBUG && console.log('[SW] Redirecting navigation from virtual context:', url.pathname, '->', redirectUrl); + event.respondWith(Response.redirect(redirectUrl, 302)); + return; + } else { + // Non-navigation requests (images, scripts, etc.): forward to virtual server + DEBUG && console.log('[SW] Forwarding resource from virtual context:', url.pathname); + event.respondWith(handleVirtualRequest(event.request, virtualPort, targetPath)); + return; + } + } + } catch (e) { + // Invalid referer URL, ignore + } + } + // Not a virtual request, let it pass through + return; + } + + DEBUG && console.log('[SW] Virtual request:', url.pathname); + + const port = parseInt(match[1], 10); + const path = match[2] || '/'; + + event.respondWith(handleVirtualRequest(event.request, port, path + url.search)); +}); + +/** + * Handle a request to a virtual server + */ +async function handleVirtualRequest(request, port, path) { + try { + // Build headers object + const headers = {}; + request.headers.forEach((value, key) => { + headers[key] = value; + }); + + // Get body if present + let body = null; + if (request.method !== 'GET' && request.method !== 'HEAD') { + body = await request.arrayBuffer(); + } + + // Check if this is an API route that might stream (POST to /api/*) + const isStreamingCandidate = request.method === 'POST' && path.startsWith('/api/'); + + if (isStreamingCandidate) { + DEBUG && console.log('[SW] Using streaming mode for:', path); + return handleStreamingRequest(port, request.method, path, headers, body); + } + DEBUG && console.log('[SW] Using non-streaming mode for:', request.method, path); + + // Send to main thread + const response = await sendRequest(port, request.method, path, headers, body); + + DEBUG && console.log('[SW] Got response from main thread:', { + statusCode: response.statusCode, + headersKeys: response.headers ? Object.keys(response.headers) : [], + bodyBase64Length: response.bodyBase64?.length, + }); + + // Decode base64 body and create response + let finalResponse; + if (response.bodyBase64 && response.bodyBase64.length > 0) { + try { + const bytes = base64ToBytes(response.bodyBase64); + DEBUG && console.log('[SW] Decoded body length:', bytes.length); + + // Use Blob to ensure proper body handling + const blob = new Blob([bytes], { type: response.headers['Content-Type'] || 'application/octet-stream' }); + DEBUG && console.log('[SW] Created blob size:', blob.size); + + // Merge response headers with CORP/COEP headers to allow iframe embedding + // The parent page has COEP: credentialless, so we need matching headers + const respHeaders = new Headers(response.headers); + respHeaders.set('Cross-Origin-Embedder-Policy', 'credentialless'); + respHeaders.set('Cross-Origin-Opener-Policy', 'same-origin'); + respHeaders.set('Cross-Origin-Resource-Policy', 'cross-origin'); + // Remove any headers that might block iframe loading + respHeaders.delete('X-Frame-Options'); + + finalResponse = new Response(blob, { + status: response.statusCode, + statusText: response.statusMessage, + headers: respHeaders, + }); + } catch (decodeError) { + console.error('[SW] Failed to decode base64 body:', decodeError); + finalResponse = new Response(`Decode error: ${decodeError.message}`, { + status: 500, + headers: { 'Content-Type': 'text/plain' }, + }); + } + } else { + finalResponse = new Response(null, { + status: response.statusCode, + statusText: response.statusMessage, + headers: response.headers, + }); + } + + DEBUG && console.log('[SW] Final Response created, status:', finalResponse.status); + + return finalResponse; + } catch (error) { + console.error('[SW] Error handling virtual request:', error); + return new Response(`Service Worker Error: ${error.message}`, { + status: 500, + statusText: 'Internal Server Error', + headers: { 'Content-Type': 'text/plain' }, + }); + } +} + +/** + * Handle a streaming request + */ +async function handleStreamingRequest(port, method, path, headers, body) { + const { stream, headersPromise, id } = await sendStreamingRequest(port, method, path, headers, body); + + // Wait for headers to arrive + const responseData = await headersPromise; + + DEBUG && console.log('[SW] Streaming response started:', responseData?.statusCode); + + // Build response headers + const respHeaders = new Headers(responseData?.headers || {}); + respHeaders.set('Cross-Origin-Embedder-Policy', 'credentialless'); + respHeaders.set('Cross-Origin-Opener-Policy', 'same-origin'); + respHeaders.set('Cross-Origin-Resource-Policy', 'cross-origin'); + respHeaders.delete('X-Frame-Options'); + + return new Response(stream, { + status: responseData?.statusCode || 200, + statusText: responseData?.statusMessage || 'OK', + headers: respHeaders, + }); +} + +/** + * Activate immediately + */ +self.addEventListener('install', (event) => { + DEBUG && console.log('[SW] Installing...'); + event.waitUntil(self.skipWaiting()); +}); + +/** + * Claim all clients immediately + */ +self.addEventListener('activate', (event) => { + DEBUG && console.log('[SW] Activated'); + event.waitUntil(self.clients.claim()); +}); diff --git a/favicon.png b/Build/public/favicon.png similarity index 100% rename from favicon.png rename to Build/public/favicon.png diff --git a/Build/pwa-assets.config.js b/Build/pwa-assets.config.js new file mode 100644 index 0000000..ace0ef1 --- /dev/null +++ b/Build/pwa-assets.config.js @@ -0,0 +1,27 @@ +import { + defineConfig, + minimal2023Preset, +} from "@vite-pwa/assets-generator/config"; + +export default defineConfig({ + preset: { + ...minimal2023Preset, + apple: { + ...minimal2023Preset.apple, + resizeOptions: { + fit: "cover", + background: "transparent", + }, + padding: 0, + }, + maskable: { + ...minimal2023Preset.maskable, + resizeOptions: { + fit: "cover", + background: "transparent", + }, + padding: 0, + }, + }, + images: "public/favicon.png", +}); \ No newline at end of file diff --git a/Build/src/appState.ts b/Build/src/appState.ts new file mode 100644 index 0000000..5bd920e --- /dev/null +++ b/Build/src/appState.ts @@ -0,0 +1,239 @@ +import { effect, path, signal } from "@nisoku/sairin"; +import type { State, Actions, FileTab } from "./types"; +import { getDefaultFiles } from "./defaultContent"; +import { showError } from "./ui"; + +const STORAGE_KEY = "htmlRunnerState"; + +function readPersistedState(): Partial | null { + try { + const savedState = localStorage.getItem(STORAGE_KEY); + if (!savedState) return null; + return JSON.parse(savedState) as Partial; + } catch { + return null; + } +} + +const persistedState = readPersistedState(); + +const defaultFiles = getDefaultFiles(); + +const filesInitial: FileTab[] = Array.isArray(persistedState?.files) && persistedState!.files.length > 0 + ? persistedState!.files + : defaultFiles; + +const activeFileInitial: string = typeof persistedState?.activeFile === "string" && + filesInitial.some((f) => f.id === persistedState!.activeFile) + ? persistedState!.activeFile + : filesInitial[0]?.id ?? "index.html"; + +const darkModeInitial = + persistedState?.darkMode ?? localStorage.getItem("darkMode") === "true"; +const autoRunInitial = + persistedState?.autoRun ?? localStorage.getItem("autoRun") === "true"; +const activeOutputInitial = persistedState?.activeOutput ?? "preview"; +const splitSizesInitial: number[] = + Array.isArray(persistedState?.splitSizes) && + persistedState!.splitSizes.length === 2 + ? persistedState!.splitSizes + : [50, 50]; + +const logFiltersInitial = Array.isArray(persistedState?.logFilters) + ? (persistedState!.logFilters as string[]) + : ["log", "error", "warn", "info"]; + +const ALLOWED_OUTPUTS = ["preview", "console", "terminal"] as const; + +let _lastPersistedSnapshot = ""; +let _idleHandle: number | null = null; +let _timeoutHandle: number | null = null; + +export const filesState = signal(path("htmlrunner", "editor", "files"), filesInitial); +export const activeFileState = signal(path("htmlrunner", "editor", "activeFile"), activeFileInitial); +export const activeOutputState = signal(path("htmlrunner", "ui", "activeOutput"), activeOutputInitial); +export const splitSizesState = signal(path("htmlrunner", "layout", "splitSizes"), splitSizesInitial); +export const darkModeState = signal(path("htmlrunner", "ui", "darkMode"), darkModeInitial); +export const autoRunState = signal(path("htmlrunner", "editor", "autoRun"), autoRunInitial); +export const logFilters = signal(path("htmlrunner", "console", "filters"), logFiltersInitial); +export const stateHydrated = signal(path("htmlrunner", "meta", "stateHydrated"), false); + +export const loadingVisible = signal(path("htmlrunner", "ui", "loadingVisible"), false); +export const errorMessage = signal(path("htmlrunner", "ui", "errorMessage"), ""); +export const errorVisible = signal(path("htmlrunner", "ui", "errorVisible"), false); +effect(() => errorVisible.set(errorMessage.get().length > 0)); + +export const themeLabel = signal(path("htmlrunner", "ui", "themeLabel"), darkModeState.get() ? "Light Mode" : "Dark Mode"); +export const themeIconClass = signal(path("htmlrunner", "ui", "themeIconClass"), darkModeState.get() ? "fas fa-sun" : "fas fa-moon"); +effect(() => { + themeLabel.set(darkModeState.get() ? "Light Mode" : "Dark Mode"); + themeIconClass.set(darkModeState.get() ? "fas fa-sun" : "fas fa-moon"); +}); + +export const autoRunText = signal(path("htmlrunner", "ui", "autoRunText"), autoRunState.get() ? "On" : "Off"); +effect(() => autoRunText.set(autoRunState.get() ? "On" : "Off")); + +export const previewClass = signal(path("htmlrunner", "ui", "previewClass"), activeOutputState.get() === "preview" ? "tab active" : "tab"); +export const consoleClass = signal(path("htmlrunner", "ui", "consoleClass"), activeOutputState.get() === "console" ? "tab active" : "tab"); +export const terminalClass = signal(path("htmlrunner", "ui", "terminalClass"), activeOutputState.get() === "terminal" ? "tab active" : "tab"); +effect(() => { + previewClass.set(activeOutputState.get() === "preview" ? "tab active" : "tab"); + consoleClass.set(activeOutputState.get() === "console" ? "tab active" : "tab"); + terminalClass.set(activeOutputState.get() === "terminal" ? "tab active" : "tab"); +}); + +export const bodyClass = signal(path("htmlrunner", "ui", "bodyClass"), darkModeState.get() ? "dark-mode" : ""); +export const isResizing = signal(path("htmlrunner", "ui", "isResizing"), false); +export const resizingClass = signal(path("htmlrunner", "ui", "resizingClass"), ""); +effect(() => { + const parts: string[] = []; + if (darkModeState.get()) parts.push("dark-mode"); + const rc = resizingClass.get(); + if (rc) parts.push(rc); + bodyClass.set(parts.join(" ")); +}); + +export const globalActions = signal(path("htmlrunner", "global", "actions"), {} as Actions); + +export const cursorPos = signal(path("htmlrunner", "ui", "cursorPos"), { line: 1, col: 1 }); + +effect(() => { + if (!stateHydrated.get()) return; + + const snapshot = createStateSnapshot(); + const snapshotStr = JSON.stringify(snapshot); + + if (snapshotStr === _lastPersistedSnapshot) return; + + if (_idleHandle != null && window.cancelIdleCallback) { + window.cancelIdleCallback(_idleHandle); + _idleHandle = null; + } + if (_timeoutHandle != null) { + clearTimeout(_timeoutHandle); + _timeoutHandle = null; + } + + const writeNow = () => { + try { + localStorage.setItem(STORAGE_KEY, snapshotStr); + _lastPersistedSnapshot = snapshotStr; + } catch (e) { + console.warn("Failed to persist state:", e); + } + }; + + if (typeof window.requestIdleCallback === "function") { + _idleHandle = window.requestIdleCallback( + () => { + writeNow(); + _idleHandle = null; + }, + { timeout: 1000 }, + ); + } else { + _timeoutHandle = window.setTimeout(() => { + writeNow(); + _timeoutHandle = null; + }, 500); + } + + return () => { + if (_idleHandle != null && window.cancelIdleCallback) { + window.cancelIdleCallback(_idleHandle); + _idleHandle = null; + } + if (_timeoutHandle != null) { + clearTimeout(_timeoutHandle); + _timeoutHandle = null; + } + }; +}); + +export function createStateSnapshot(): State { + return { + files: filesState.get(), + activeFile: activeFileState.get(), + activeOutput: activeOutputState.get(), + splitSizes: splitSizesState.get(), + darkMode: darkModeState.get(), + autoRun: autoRunState.get(), + logFilters: logFilters.get(), + }; +} + +export function applyStateSnapshot(snapshot: Partial): void { + if (Array.isArray(snapshot.files) && snapshot.files.length > 0) { + const validFiles = snapshot.files.filter( + (f) => typeof f.id === "string" && typeof f.name === "string" && typeof f.content === "string", + ); + if (validFiles.length > 0) { + filesState.set(validFiles); + if (typeof snapshot.activeFile === "string" && validFiles.some((f) => f.id === snapshot.activeFile)) { + activeFileState.set(snapshot.activeFile); + } else { + activeFileState.set(validFiles[0].id); + } + } + } + + if (typeof snapshot.activeOutput === "string") { + if ((ALLOWED_OUTPUTS as readonly string[]).includes(snapshot.activeOutput)) { + activeOutputState.set(snapshot.activeOutput); + } + } + + if ( + Array.isArray(snapshot.splitSizes) && + snapshot.splitSizes.length === 2 && + snapshot.splitSizes.every((size) => typeof size === "number") + ) { + splitSizesState.set(snapshot.splitSizes); + } + + if (typeof snapshot.darkMode === "boolean") { + darkModeState.set(snapshot.darkMode); + } + + if (typeof snapshot.autoRun === "boolean") { + autoRunState.set(snapshot.autoRun); + } + + if (Array.isArray(snapshot.logFilters)) { + logFilters.set(snapshot.logFilters as string[]); + } +} + +export function markStateHydrated(): void { + stateHydrated.set(true); +} + +export function loadState(): void { + try { + const savedState = localStorage.getItem(STORAGE_KEY); + if (savedState) { + const parsed = JSON.parse(savedState) as Partial; + applyStateSnapshot(parsed); + markStateHydrated(); + } else { + markStateHydrated(); + } + } catch (e: unknown) { + const msg = e instanceof Error ? e.message : String(e); + showError("Failed to load state: " + msg); + markStateHydrated(); + } +} + +export function resetCode(skipConfirmation: boolean = false): void { + if (skipConfirmation || confirm("Are you sure you want to reset all code?")) { + filesState.set(getDefaultFiles()); + activeFileState.set("index.html"); + markStateHydrated(); + } +} + +let nextUntitledId = 1; +export function getNextUntitledId(): string { + return `untitled-${nextUntitledId++}.html`; +} diff --git a/Build/src/biome.ts b/Build/src/biome.ts new file mode 100644 index 0000000..c7506dd --- /dev/null +++ b/Build/src/biome.ts @@ -0,0 +1,119 @@ +import initBiomeWasm, { Workspace } from "@biomejs/wasm-web"; + +let workspace: Workspace | null = null; +let projectKey: number | null = null; +let initialized = false; + +export type BiomeDiag = { + from: number; + to: number; + severity: "error" | "warning" | "info"; + message: string; +}; + +function byteToCharOffset(text: string, byteOffset: number): number { + let charIdx = 0; + for (let i = 0; i < byteOffset; charIdx++) { + const code = text.charCodeAt(charIdx); + if (code < 0x80) { + i += 1; + } else if (code < 0x800) { + i += 2; + } else if (code >= 0xd800 && code <= 0xdfff) { + i += 4; + charIdx++; + } else { + i += 3; + } + } + return charIdx; +} + +export async function initBiome(): Promise { + if (initialized) return; + + await initBiomeWasm(); + + workspace = new Workspace(); + + const openRes = workspace.openProject({ path: "", openUninitialized: true }); + projectKey = openRes.projectKey; + + workspace.updateSettings({ + projectKey, + configuration: { + linter: { + enabled: true, + rules: { + recommended: true, + }, + }, + files: { + ignoreUnknown: true, + }, + vcs: { + enabled: false, + }, + }, + workspaceDirectory: "", + }); + + initialized = true; +} + +export async function lintWithBiome(text: string, filepath = "file.ts"): Promise { + if (!initialized) { + await initBiome(); + } + + if (!workspace || projectKey == null) { + throw new Error("Biome workspace not initialized"); + } + + await workspace.openFile({ + projectKey, + path: filepath, + content: { type: "fromClient", content: text, version: 0 }, + }); + + try { + const result = workspace.pullDiagnostics({ + projectKey, + path: filepath, + categories: ["syntax", "lint", "action"], + }); + + const diags = result.diagnostics; + if (!Array.isArray(diags)) return []; + + return diags.map((d) => { + const diag = d as unknown as { + location?: { span?: [number, number] } | null; + severity?: string | null; + description?: string | null; + category?: string | null; + }; + + const span = diag.location?.span; + const byteFrom = typeof span?.[0] === "number" ? span[0] : 0; + const byteTo = typeof span?.[1] === "number" ? span[1] : byteFrom; + + const from = byteToCharOffset(text, byteFrom); + const to = byteToCharOffset(text, byteTo); + + let severity: "error" | "warning" | "info" = "info"; + if (diag.severity === "error" || diag.severity === "fatal") severity = "error"; + if (diag.severity === "warning" || diag.severity === "warn") severity = "warning"; + + const rawMsg = diag.description ?? ""; + const category = diag.category + ? diag.category.replace(/^lint\//, "") + : ""; + const message = category ? `${rawMsg} [${category}]` : rawMsg; + + return { from, to, severity, message }; + }); + } finally { + workspace.closeFile({ projectKey, path: filepath }); + } +} diff --git a/Build/src/compile.ts b/Build/src/compile.ts new file mode 100644 index 0000000..a2937ec --- /dev/null +++ b/Build/src/compile.ts @@ -0,0 +1,191 @@ +import { getVFS, isContainerReady } from "./container"; + +let esbuildInitialized = false; + +async function ensureEsbuild(): Promise { + if (!esbuildInitialized) { + const esbuild = await import("esbuild-wasm"); + await esbuild.initialize({ + wasmURL: "https://unpkg.com/esbuild-wasm@0.28.0/esbuild.wasm", + }); + esbuildInitialized = true; + return esbuild; + } + return import("esbuild-wasm"); +} + +function vfsReadFile(path: string): string | null { + if (!isContainerReady()) return null; + const vfs = getVFS(); + try { + return vfs.readFileSync(path, "utf-8") as string; + } catch { + return null; + } +} + +function vfsStat(path: string): boolean { + if (!isContainerReady()) return false; + const vfs = getVFS(); + try { + vfs.statSync(path); + return true; + } catch { + return false; + } +} + +function resolvePath(base: string, relative: string): string { + const parts = base.split("/"); + for (const seg of relative.split("/")) { + if (seg === "." || seg === "") continue; + if (seg === "..") { + if (parts.length > 1) parts.pop(); + } else { + parts.push(seg); + } + } + return parts.join("/"); +} + +export async function esbuildBundle( + cwd: string, + write: (text: string) => void, + writeln: (text: string) => void, +): Promise { + try { + await ensureEsbuild(); + } catch (e) { + writeln(`Failed to initialize esbuild: ${e instanceof Error ? e.message : String(e)}`); + return; + } + + let entryPoint = "index.js"; + let outfile = "dist/bundle.js"; + let external: string[] = []; + + try { + const raw = vfsReadFile(`${cwd}/package.json`); + if (raw) { + const pkg = JSON.parse(raw); + const buildCmd = pkg.scripts?.build || ""; + const buildMatch = buildCmd.match(/esbuild\s+(\S+)/); + if (buildMatch) { + entryPoint = buildMatch[1]; + } + const outMatch = buildCmd.match(/--outfile=(\S+)/); + if (outMatch) { + outfile = outMatch[1]; + } + const extMatch = buildCmd.match(/--external:(\S+)/g); + if (extMatch) { + external = extMatch.map((m: string) => m.replace("--external:", "")); + } + } + } catch {} + + const entryPath = `${cwd}/${entryPoint}`; + const entryContent = vfsReadFile(entryPath); + if (!entryContent) { + writeln(`Entry point not found: ${entryPoint}`); + return; + } + + writeln(`Building ${entryPoint} -> ${outfile}...`); + + const nodeModules = `${cwd}/node_modules`; + + const plugin: import("esbuild-wasm").Plugin = { + name: "vfs", + setup(build) { + build.onResolve({ filter: /^[^./]/ }, async (args) => { + if ( + args.path === "buffer" || args.path === "process" || + args.path === "util" || args.path === "path" || args.path === "fs" || + args.path === "os" || args.path === "crypto" || + args.path === "stream" || args.path === "events" + ) { + return { path: args.path, namespace: "node-stub" }; + } + const pkgDir = `${nodeModules}/${args.path}`; + const pkgRaw = vfsReadFile(`${pkgDir}/package.json`); + if (pkgRaw) { + const pkgData = JSON.parse(pkgRaw); + const main = pkgData.module || pkgData.browser || pkgData.main || "index.js"; + const resolvedMain = `${pkgDir}/${main}`; + if (vfsStat(resolvedMain)) { + return { path: resolvedMain, namespace: "file" }; + } + if (vfsStat(`${pkgDir}/index.js`)) { + return { path: `${pkgDir}/index.js`, namespace: "file" }; + } + } + return { path: args.path, namespace: "file" }; + }); + + build.onResolve({ filter: /^\.\.?/ }, async (args) => { + const base = args.importer.startsWith("/") ? args.importer : `${cwd}/${args.importer}`; + const dir = base.substring(0, base.lastIndexOf("/")); + const resolved = resolvePath(dir, args.path); + for (const ext of ["", ".js", ".ts", ".jsx", ".tsx", ".json", ".mjs"]) { + if (vfsStat(resolved + ext)) { + return { path: resolved + ext, namespace: "file" }; + } + } + return { path: resolved, namespace: "file" }; + }); + + build.onLoad({ filter: /.*/, namespace: "file" }, async (args) => { + const content = vfsReadFile(args.path); + if (content !== null) { + return { contents: content, loader: "default" }; + } + return { errors: [{ text: `Cannot read file: ${args.path}` }] }; + }); + + build.onLoad({ filter: /.*/, namespace: "node-stub" }, (args) => { + const stubs: Record = { + buffer: "export default { Buffer: typeof Buffer !== 'undefined' ? Buffer : {} };", + process: "export default { env: {}, argv: [], cwd: () => '/' };", + util: "export default { inherits: (a,b) => { a.prototype = Object.create(b.prototype); }, promisify: (fn) => fn };", + path: "export default { join: (...a) => a.join('/'), resolve: (...a) => a.join('/'), basename: (p) => p.split('/').pop(), dirname: (p) => p.split('/').slice(0,-1).join('/'), extname: (p) => { const d=p.lastIndexOf('.'); return d>=0?p.slice(d):''; } };", + fs: "export default { readFileSync: () => '', writeFileSync: () => {} };", + os: "export default { platform: () => 'browser', homedir: () => '/home' };", + crypto: "export default { randomBytes: (n) => new Uint8Array(n) };", + stream: "export default { Writable: class { write() {} end() {} }, Readable: class { pipe() {} } };", + events: "export default { EventEmitter: class { on() {} emit() {} } };", + }; + return { contents: stubs[args.path] || "export default {};", loader: "js" }; + }); + }, + }; + + try { + const esbuild = await ensureEsbuild(); + const result = await esbuild.build({ + entryPoints: [entryPath], + bundle: true, + outfile: `${cwd}/${outfile}`, + write: false, + platform: "browser", + format: "esm", + target: "es2020", + plugins: [plugin], + external, + sourcemap: false, + minify: false, + }); + + const vfs = getVFS(); + for (const output of result.outputFiles) { + const outPath = output.path.startsWith("/") ? output.path : `${cwd}/${output.path}`; + const dir = outPath.substring(0, outPath.lastIndexOf("/")); + try { vfs.mkdirSync(dir, { recursive: true }); } catch {} + try { vfs.writeFileSync(outPath, output.contents); } catch {} + writeln(` wrote ${outPath.replace(cwd + "/", "")} (${output.contents.length} bytes)`); + } + writeln("Build complete!"); + } catch (e) { + writeln(`Build failed: ${e instanceof Error ? e.message : String(e)}`); + } +} diff --git a/Build/src/console.ts b/Build/src/console.ts index 9cfb18a..10b4234 100644 --- a/Build/src/console.ts +++ b/Build/src/console.ts @@ -1,129 +1,231 @@ -import { ConsoleMessage, StackInfo } from './types'; +import { ConsoleMessage, StackInfo, ConsoleData } from "./types"; +import { editor } from "./editor"; +import { signal, effect, path } from "@nisoku/sairin"; +import { logFilters } from "./appState"; -export const consoleOutput = document.getElementById('console') as HTMLDivElement; +// Signal holding the console messages for reactive rendering +export const consoleEntries = signal( + path("htmlrunner", "console", "entries"), + [] as ConsoleMessage[], +); -// 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); +// Cached DOM node (set during initializeConsole when DOM is ready) +let consoleOutputEl: HTMLDivElement | null = null; + +function renderConsoleEntries(entries: ConsoleMessage[]): void { + if (!consoleOutputEl) return; + const frag = document.createDocumentFragment(); + for (const ev of entries) { + const entry = document.createElement("div"); + const filters = logFilters.get(); + const filtered = !filters.includes(ev.level); + entry.className = `console-entry${filtered ? " filtered" : ""}`; + + const timestamp = document.createElement("span"); + timestamp.className = "timestamp"; + timestamp.textContent = new Date(ev.timestamp).toLocaleTimeString(); + + const message = document.createElement("span"); + message.className = `console-${ev.level}`; + if (ev.data && ev.data.length) { + ev.data.forEach((item: ConsoleData, 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))); + } + }); + } + + const maybeStack = ev.data.length > 1 ? ev.data[1] : undefined; + if ( + maybeStack && + typeof maybeStack === "object" && + "stack" in (maybeStack as Record) + ) { + const stack = document.createElement("div"); + stack.className = "console-stack"; + const stackVal = (maybeStack as Record)["stack"]; + const rawStack: string = + typeof stackVal === "string" ? stackVal : String(stackVal); + rawStack.split("\n").forEach((line) => { + const lineEl = document.createElement("div"); + lineEl.className = "console-stack-line"; + lineEl.textContent = line.trim(); + + let lineNum: number | undefined; + let colNum: number | undefined; + const patterns: RegExp[] = [ + /\(([^)]+):(\d+):(\d+)\)$/, // at fn (file:line:col) + /([^@()\s]+):(\d+):(\d+)$/, // fn@file:line:col or file:line:col + /([^@()\s]+):(\d+)$/, // file:line + ]; + for (const pat of patterns) { + const m = line.match(pat); + if (m) { + lineNum = parseInt(m[2], 10); + if (m[3]) colNum = parseInt(m[3], 10); + break; + } + } + + if (lineNum) { + lineEl.classList.add("clickable"); + lineEl.addEventListener("click", () => { + if (!editor.view) return; + const doc = editor.view.state.doc; + const maxLine = doc.lines; + const safeLine = Math.max(1, Math.min(lineNum as number, maxLine)); + const lineObj = doc.line(safeLine); + const offset = Math.min( + lineObj.to, + lineObj.from + Math.max(0, (colNum || 1) - 1), + ); + editor.view.dispatch({ selection: { anchor: offset } }); + editor.view.focus(); + }); + } + stack.appendChild(lineEl); + }); + stack.addEventListener("click", (e) => { + if (e.target === stack) stack.classList.toggle("expanded"); + }); + message.appendChild(stack); } - 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 }); - }; + + entry.appendChild(timestamp); + entry.appendChild(document.createTextNode(" ")); + entry.appendChild(message); + frag.appendChild(entry); + } + consoleOutputEl.replaceChildren(frag); + consoleOutputEl.scrollTop = consoleOutputEl.scrollHeight; +} + +// Re-render console output whenever entries change +effect(() => { + const entries = consoleEntries.get(); + if (!consoleOutputEl) return; + renderConsoleEntries(entries); +}); + +export const consoleInterceptor = ` +const _orig={log:console.log,error:console.error,warn:console.warn,info:console.info}; +function _send(l,...a){ + try{window.parent.postMessage({type:'console',level:l,data:a,timestamp:new Date().toISOString()},location.origin)}catch{} + _orig[l].apply(console,a) +} +console.log=(...a)=>_send('log',...a); +console.error=(...a)=>_send('error',...a); +console.warn=(...a)=>_send('warn',...a); +console.info=(...a)=>_send('info',...a); +window.onerror=(m,s,l,c,e)=>{_send('error',e||m,{stack:e?.stack});return true}; +window.onunhandledrejection=e=>{_send('error',e.reason,{stack:e.reason?.stack})}; +`; + +export const navigationInterceptor = ` +document.addEventListener('click', function(e) { + var link = e.target.closest('a'); + if (!link || link.getAttribute('target') === '_blank') return; + var href = link.getAttribute('href'); + if (!href || href.startsWith('#') || href.startsWith('http://') || href.startsWith('https://') || href.startsWith('mailto:')) return; + e.preventDefault(); + window.parent.postMessage({type:'navigate',href:href},location.origin); +}); `; // Initialize console message handler export function initializeConsole(): void { - window.addEventListener('message', handleConsoleMessage); + // Cache the console output element now that DOM is ready + consoleOutputEl = document.getElementById("console") as HTMLDivElement | null; + // render any existing entries immediately + if (consoleOutputEl) renderConsoleEntries(consoleEntries.get()); + 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; - } + if (event.origin !== location.origin) return; + if (event.data?.type !== "console") return; + const prev = consoleEntries.get(); + consoleEntries.set([...prev, event.data]); } -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; - } +function renderObject( + obj: ConsoleData, + level = 0, + visited = new WeakSet(), +): Node { + if (obj === null) return document.createTextNode("null"); + if ( + typeof obj === "string" || + typeof obj === "number" || + typeof obj === "boolean" + ) + return document.createTextNode(String(obj)); + if (obj instanceof Error) { + const errorEl = document.createElement("span"); + errorEl.className = "console-error"; + errorEl.textContent = `${obj.name}: ${obj.message}`; + if ((obj as Error).stack) + errorEl.textContent += `\n${(obj as Error).stack!.split("\n").slice(1).join("\n")}`; + const container = document.createElement("span"); + container.appendChild(errorEl); + return container; + } + // At this point obj is either an array-like or object with console-able entries + const asObj = obj as Record | ConsoleData[]; + if (visited.has(asObj as object)) + return document.createTextNode("[Circular]"); + if (level > 3) return document.createTextNode("[...]"); + visited.add(asObj as object); - 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'; + const container = document.createElement("span"); + const preview = document.createElement("span"); + preview.className = "console-object"; + preview.textContent = Array.isArray(asObj) + ? `Array(${(asObj as ConsoleData[]).length})` + : "{...}"; + const content = document.createElement("div"); + content.className = "console-object-content"; - Object.entries(obj).forEach(([key, value]) => { - const prop = document.createElement('div'); + if (Array.isArray(asObj)) { + asObj.forEach((v: ConsoleData) => { + const prop = document.createElement("div"); + prop.appendChild(renderObject(v, level + 1, visited)); + content.appendChild(prop); + }); + } else { + Object.entries(asObj as Record).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'); - }); + preview.addEventListener("click", (e) => { + e.stopPropagation(); + preview.classList.toggle("expanded"); + }); - container.appendChild(preview); - container.appendChild(content); - return container; + container.appendChild(preview); + container.appendChild(content); + return container; } export function clearConsole(): void { - consoleOutput.innerHTML = ''; + consoleEntries.set([]); } 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; + const prev = consoleEntries.get(); + const entry: ConsoleMessage = { + type: "console", + level: "error", + data: [message, stack], + timestamp: new Date().toISOString(), + }; + consoleEntries.set([...prev, entry]); } diff --git a/Build/src/container.ts b/Build/src/container.ts new file mode 100644 index 0000000..0877e96 --- /dev/null +++ b/Build/src/container.ts @@ -0,0 +1,22 @@ +import { createContainer, VirtualFS } from "almostnode"; + +let _container: ReturnType | null = null; +let _vfs: VirtualFS | null = null; + +export function getContainer(): ReturnType { + if (!_container) { + _container = createContainer({ cwd: "/sandbox" }); + } + return _container; +} + +export function getVFS(): VirtualFS { + if (!_vfs) { + _vfs = getContainer().vfs; + } + return _vfs; +} + +export function isContainerReady(): boolean { + return _container !== null; +} diff --git a/Build/src/defaultContent.ts b/Build/src/defaultContent.ts new file mode 100644 index 0000000..4f62100 --- /dev/null +++ b/Build/src/defaultContent.ts @@ -0,0 +1,94 @@ +import type { FileTab } from "./types"; + +export const defaultHtml = ` + + +My Page + + + + +

Hello, HTMLRunner!

+

This is a demo page.

+ + +`; + +export const defaultCss = `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; +}`; + +export const defaultJs = `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'] }); +}`; + +export function getDefaultFiles(): FileTab[] { + return [ + { id: "index.html", name: "index.html", content: defaultHtml, language: "html" }, + { id: "styles.css", name: "styles.css", content: defaultCss, language: "css" }, + { id: "script.js", name: "script.js", content: defaultJs, language: "javascript" }, + ]; +} + +const TEMPLATES: Record = { + html: ` + + + + + Document + + + + +`, + css: `* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: system-ui, sans-serif; + line-height: 1.6; + color: #333; + padding: 20px; +}`, + js: `'use strict'; + +`, + ts: `export {};\n`, + json: `{\n \n}\n`, +}; + +export function getTemplateForExt(ext: string): string { + return TEMPLATES[ext] ?? ""; +} + +export function getLanguageForExt(ext: string): string { + switch (ext) { + case "html": case "htm": return "html"; + case "css": return "css"; + case "js": case "mjs": case "cjs": case "jsx": case "ts": case "tsx": return "javascript"; + case "json": return "javascript"; + default: return "javascript"; + } +} diff --git a/Build/src/editor.ts b/Build/src/editor.ts index 3fd56f8..d9ccad0 100644 --- a/Build/src/editor.ts +++ b/Build/src/editor.ts @@ -1,101 +1,132 @@ -import { Compartment, EditorState, Extension } from "@codemirror/state"; -import { EditorView, lineNumbers, keymap } from "@codemirror/view"; // Add standardKeymap, defaultKeymap -import { defaultKeymap, standardKeymap } from "@codemirror/commands"; +import { markdown } from "@codemirror/lang-markdown"; +import { Compartment, EditorState } from "@codemirror/state"; +import { EditorView, keymap, lineNumbers } from "@codemirror/view"; +import { defaultKeymap, toggleComment, history, undo, redo } from "@codemirror/commands"; import { html } from "@codemirror/lang-html"; import { css } from "@codemirror/lang-css"; import { javascript } from "@codemirror/lang-javascript"; +import { autocompletion } from "@codemirror/autocomplete"; +import { foldGutter, foldKeymap } from "@codemirror/language"; import { linter, lintGutter } from "@codemirror/lint"; +import { lintWithBiome } from "./biome"; +import { search } from "@codemirror/search"; 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 { indentationMarkers } from "@replit/codemirror-indentation-markers"; +import type { FileTab } from "./types"; import { debounce } from "./utils"; -import { saveState } from "./state"; -import { search } from "@codemirror/search"; -import { toggleComment } from "@codemirror/commands"; // Ensure toggleComment is imported +import { + autoRunState, + darkModeState, + filesState, + activeFileState, + cursorPos, + globalActions, +} from "./appState"; +import { effect } from "@nisoku/sairin"; -export let isDarkMode: boolean = localStorage.getItem("darkMode") === "true"; -export let isAutoRun: boolean = localStorage.getItem("autoRun") === "true"; +export const editor: { view: EditorView | null } = { view: null }; -export const editors: Editors = { - html: null as unknown as CodeMirrorEditor, - css: null as unknown as CodeMirrorEditor, - js: null as unknown as CodeMirrorEditor, -}; +let _languageCompartment: Compartment; +let _themeCompartment: Compartment; +let _autoRunCompartment: Compartment; +let _suppressContentUpdate = false; -export function setDarkMode(value: boolean): void { - isDarkMode = value; - Object.values(editors).forEach((editor) => { - editor.view.dispatch({ - effects: editor.themeCompartment.reconfigure( - isDarkMode ? monokai : bbedit - ), - }); - }); +function getLanguageExtension(fileName: string) { + const ext = fileName.split(".").pop()?.toLowerCase() || ""; + switch (ext) { + case "html": + case "htm": + return html(); + case "css": + return css(); + case "js": + case "mjs": + case "cjs": + case "jsx": + case "ts": + case "tsx": + return javascript(); + case "md": + case "markdown": + return markdown(); + default: + return javascript(); + } } -export function setAutoRun(value: boolean): void { - isAutoRun = value; +function getFileName(fileId: string, files: FileTab[]): string { + const f = files.find((f) => f.id === fileId); + return f?.name ?? "file.txt"; } -function createEditorConfig( - language: Extension, - container: HTMLElement, - content: string -): CodeMirrorEditor { - const themeCompartment = new Compartment(); - const autoRunCompartment = new Compartment(); +const debouncedRun = debounce(() => { globalActions.get().runCode?.(); }, 250); +const autoRunListener = EditorView.updateListener.of((update) => { + if (update.docChanged) debouncedRun(); +}); + +export function createEditor(container: HTMLElement, initialFile: FileTab): void { + _languageCompartment = new Compartment(); + _themeCompartment = new Compartment(); + _autoRunCompartment = new Compartment(); const view = new EditorView({ state: EditorState.create({ - doc: content, + doc: initialFile.content, extensions: [ lineNumbers(), - language, - themeCompartment.of(isDarkMode ? monokai : bbedit), + history(), + foldGutter(), + linter(async (view) => { + const text = view.state.doc.toString(); + const fileId = activeFileState.get(); + const files = filesState.get(); + const fileName = getFileName(fileId, files); + try { + const biomeDiags = await lintWithBiome(text, fileName); + return biomeDiags || []; + } catch { + return []; + } + }), + lintGutter(), + _languageCompartment.of(getLanguageExtension(initialFile.name)), + _themeCompartment.of(darkModeState.get() ? monokai : bbedit), EditorView.lineWrapping, EditorState.tabSize.of(2), EditorView.theme({ "&": { height: "100%" }, ".cm-scroller": { overflow: "auto" }, - ".cm-content": { minHeight: "100%" } + ".cm-content": { minHeight: "100%" }, }), search(), - linter( - (view) => { - return []; - }, - { delay: 100 } - ), - lintGutter(), + autocompletion(), + indentationMarkers(), 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, - }, + ...defaultKeymap, + ...foldKeymap, + { key: "Mod-/", run: toggleComment }, + { key: "Mod-z", run: undo }, + { key: "Mod-y", run: redo }, + { key: "Mod-Shift-z", run: redo }, ]), - autoRunCompartment.of( - isAutoRun - ? EditorView.updateListener.of((update) => { - if (update.docChanged) { - debounce(runCode, 1000)(); - } - }) - : [] - ), - // Autosave listener + _autoRunCompartment.of(autoRunState.get() ? autoRunListener : []), EditorView.updateListener.of((update) => { - if (update.docChanged) { - debounce(saveState, 1000)(); + if (update.docChanged && !_suppressContentUpdate) { + const content = update.state.doc.toString(); + const files = filesState.get(); + const activeId = activeFileState.get(); + const existing = files.find((f) => f.id === activeId); + if (existing && existing.content === content) return; + const updated = files.map((f) => + f.id === activeId ? { ...f, content } : f, + ); + filesState.set(updated); + } + if (update.selectionSet || update.docChanged) { + const pos = view.state.selection.main.head; + const line = view.state.doc.lineAt(pos); + cursorPos.set({ line: line.number, col: pos - line.from + 1 }); } }), ], @@ -103,37 +134,88 @@ function createEditorConfig( parent: container, }); - // Prevent Enter from submitting a form view.dom.addEventListener("keydown", (event) => { if (event.key === "Enter") { - event.stopPropagation(); // Prevent form submission + event.stopPropagation(); } }); - return { - view, - state: view.state, - themeCompartment, - autoRunCompartment, - }; + editor.view = view; +} + +export function switchToFile(file: FileTab): void { + if (!editor.view) return; + + _suppressContentUpdate = true; + + const currentContent = editor.view.state.doc.toString(); + const currentId = activeFileState.get(); + const files = filesState.get(); + const updated = files.map((f) => + f.id === currentId ? { ...f, content: currentContent } : f, + ); + filesState.set(updated); + + activeFileState.set(file.id); + + editor.view.dispatch({ + changes: { + from: 0, + to: editor.view.state.doc.length, + insert: file.content, + }, + }); + + editor.view.dispatch({ + effects: _languageCompartment.reconfigure(getLanguageExtension(file.name)), + }); + + editor.view.focus(); + + _suppressContentUpdate = false; } -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"); +export function setDarkMode(value: boolean): void { + darkModeState.set(value); + if (editor.view) { + editor.view.dispatch({ + effects: _themeCompartment.reconfigure( + darkModeState.get() ? monokai : bbedit, + ), + }); } +} + +export function setAutoRun(value: boolean): void { + autoRunState.set(value); + if (editor.view) { + editor.view.dispatch({ + effects: _autoRunCompartment.reconfigure( + value ? autoRunListener : [], + ), + }); + } +} - editors.html = createEditorConfig(html(), htmlContainer, ""); - editors.css = createEditorConfig(css(), cssContainer, ""); - editors.js = createEditorConfig(javascript(), jsContainer, ""); -} \ No newline at end of file +effect(() => { + const files = filesState.get(); + const activeId = activeFileState.get(); + const file = files.find((f) => f.id === activeId); + if (file && editor.view) { + const currentDoc = editor.view.state.doc.toString(); + if (currentDoc !== file.content && !_suppressContentUpdate) { + _suppressContentUpdate = true; + editor.view.dispatch({ + changes: { + from: 0, + to: editor.view.state.doc.length, + insert: file.content, + }, + }); + editor.view.dispatch({ + effects: _languageCompartment.reconfigure(getLanguageExtension(file.name)), + }); + _suppressContentUpdate = false; + } + } +}); diff --git a/Build/src/git-service.ts b/Build/src/git-service.ts new file mode 100644 index 0000000..e4f0648 --- /dev/null +++ b/Build/src/git-service.ts @@ -0,0 +1,162 @@ +import { wrap, type Remote } from "comlink"; +import { filesState, activeFileState } from "./appState"; +import { getVFS } from "./container"; +import { getLanguageForExt } from "./defaultContent"; +import type { FileTab } from "./types"; + +interface GitWorkerAPI { + init(user?: string, email?: string): Promise<{ variant: string; files: { path: string; content: string }[] }>; + writeFile(filePath: string, content: string): Promise; + gitCommand(command: string, args: string[]): Promise<{ stdout: string; files?: { path: string; content: string }[] }>; + readFiles(): Promise<{ path: string; content: string }[]>; + sync(): Promise; +} + +let api: Remote | null = null; +let _ready = false; +let _readyResolve: () => void; +const _readyPromise = new Promise((r) => { _readyResolve = r; }); + +export function gitReady(): Promise { + return _readyPromise; +} + +export function isGitReady(): boolean { + return _ready; +} + +export function initGitService(worker: Worker): void { + api = wrap(worker); + + api.init("HTMLRunner", "runner@htmlrunner.app") + .then(({ variant, files }) => { + console.log(`Git ready (${variant})`); + _ready = true; + _readyResolve(); + if (files && files.length > 0) { + loadFilesFromWorker(files); + } + }) + .catch((err) => { + console.error("Git init failed:", err); + }); +} + +function loadFilesFromWorker( + files: { path: string; content: string }[], +): void { + const vfs = getVFS(); + const tabs: FileTab[] = []; + + for (const file of files) { + const ext = file.path.split(".").pop()?.toLowerCase() || ""; + const skipExts = [ + "png","jpg","jpeg","gif","ico","woff","woff2","ttf","eot","zip","gz","wasm", + ]; + if (skipExts.includes(ext)) continue; + + tabs.push({ + id: file.path, + name: file.path, + content: file.content, + language: getLanguageForExt(ext), + }); + + const dir = file.path.substring(0, file.path.lastIndexOf("/")); + if (dir) { + try { vfs.mkdirSync(dir, { recursive: true }); } catch {} + } + try { vfs.writeFileSync(`/sandbox/${file.path}`, file.content); } catch {} + } + + tabs.sort((a, b) => a.name.localeCompare(b.name)); + + if (tabs.length > 0) { + filesState.set(tabs); + const currentActive = activeFileState.get(); + if (!tabs.find((f) => f.id === currentActive)) { + activeFileState.set(tabs[0].id); + } + } +} + +async function gitExec(command: string, ...args: string[]): Promise { + if (!api) throw new Error("Git not initialized"); + const result = await api.gitCommand(command, args); + if (result.files) loadFilesFromWorker(result.files); + return result.stdout || ""; +} + +export async function gitInit(): Promise { + await gitExec("init", "/sandbox"); +} + +export async function gitClone(url: string): Promise { + return await gitExec("clone", url, "/sandbox"); +} + +export async function gitAddAll(): Promise { + await gitExec("add", "."); +} + +export async function gitCommit(message: string): Promise { + await gitAddAll(); + return await gitExec("commit", "-m", message); +} + +export async function gitStatus(): Promise { + return await gitExec("status"); +} + +export async function gitLog(): Promise { + return await gitExec("log", "--oneline", "-20"); +} + +export async function gitDiff(): Promise { + return await gitExec("diff"); +} + +export async function gitPush( + remote = "origin", + ref = "main", +): Promise { + await gitAddAll(); + return await gitExec("push", remote, ref); +} + +export async function gitPull( + remote = "origin", + ref = "main", +): Promise { + return await gitExec("fetch", remote) + "\n" + await gitExec("merge", `${remote}/${ref}`); +} + +export async function gitBranches(): Promise { + return await gitExec("branch", "-a"); +} + +export async function gitCheckout(branch: string): Promise { + return await gitExec("checkout", branch); +} + +export async function syncFileToWorker( + filePath: string, + content: string, +): Promise { + if (!api) return; + api.writeFile(filePath, content).catch(() => {}); +} + +export async function syncAllFilesToWorker(): Promise { + if (!api) return; + const files = filesState.get(); + for (const file of files) { + api.writeFile(file.name, file.content).catch(() => {}); + } +} + +export async function requestFilesFromWorker(): Promise { + if (!api) return; + const files = await api.readFiles(); + loadFilesFromWorker(files); +} diff --git a/Build/src/git.worker.ts b/Build/src/git.worker.ts new file mode 100644 index 0000000..cc782fe --- /dev/null +++ b/Build/src/git.worker.ts @@ -0,0 +1,120 @@ +import { expose } from "comlink"; + +let git: any = null; +const REPO_NAME = "sandbox"; +let _mutex: Promise = Promise.resolve(); + +function queue(fn: () => Promise): Promise { + const next = _mutex.then(fn, fn); + _mutex = next.catch(() => {}); + return next; +} + +async function withRetry(fn: () => T, maxRetries = 2): Promise { + for (let i = 0; i <= maxRetries; i++) { + try { + return fn(); + } catch (err: any) { + const msg = err?.message || String(err); + const isStale = + msg.includes("cached in an interface object") || + msg.includes("stale") || + msg.includes("state has changed"); + if (isStale && i < maxRetries && git) { + try { await git.syncRepo(REPO_NAME); } catch {} + continue; + } + throw err; + } + } + throw new Error("Unreachable"); +} + +async function runGitCommand(command: string, gitArgs: string[]): Promise { + if (!git) throw new Error("Git not initialized"); + await git.syncRepo(REPO_NAME); + + const stdout: string[] = []; + const origPrint = git.module.print; + const origPrintErr = git.module.printErr; + git.module.print = (text: string) => stdout.push(text); + git.module.printErr = (_text: string) => {}; + + try { + await git.run([command, ...gitArgs]); + } finally { + git.module.print = origPrint; + git.module.printErr = origPrintErr; + } + + return stdout.join("\n"); +} + +function readAllFiles(): { path: string; content: string }[] { + if (!git) return []; + const results: { path: string; content: string }[] = []; + try { + const entries = git.readdir(REPO_NAME); + for (const name of entries) { + if (name === "." || name === ".." || name === ".git" || name === "node_modules") continue; + try { + const content = git.readFile(REPO_NAME, name); + if (typeof content === "string") { + results.push({ path: name, content }); + } else if (content instanceof Uint8Array) { + results.push({ path: name, content: new TextDecoder().decode(content) }); + } + } catch {} + } + } catch {} + return results; +} + +const api = { + async init(user = "HTMLRunner", email = "runner@htmlrunner.app") { + return queue(async () => { + const { loadOpfsGit } = await import("wasm-git/lg2_opfs_auto.js"); + git = await loadOpfsGit({ user, email }); + + const found = await git.syncRepo(REPO_NAME); + let files: { path: string; content: string }[] = []; + + if (found) { + files = readAllFiles(); + } else { + await git.run(["init", git.repoDir(REPO_NAME)]); + await git.syncRepo(REPO_NAME); + } + + return { variant: git.variant || "unknown", files }; + }); + }, + + async writeFile(filePath: string, content: string) { + return queue(() => + withRetry(() => git.writeFile(REPO_NAME, filePath, content)), + ); + }, + + async gitCommand(command: string, args: string[]) { + return queue(async () => { + const stdout = await withRetry(() => runGitCommand(command, args)); + const refreshCmds = ["clone", "pull", "fetch", "checkout", "reset", "merge"]; + if (refreshCmds.includes(command)) { + const files = await withRetry(() => readAllFiles()); + return { stdout, files }; + } + return { stdout }; + }); + }, + + async readFiles() { + return queue(() => withRetry(() => readAllFiles())); + }, + + async sync() { + return queue(async () => { await git?.syncRepo(REPO_NAME); }); + }, +}; + +expose(api); diff --git a/Build/src/global.d.ts b/Build/src/global.d.ts new file mode 100644 index 0000000..f5ae0cc --- /dev/null +++ b/Build/src/global.d.ts @@ -0,0 +1,47 @@ +declare module "*.css"; +declare module "@fortawesome/fontawesome-free/css/all.min.css" { + const css: string; + export default css; +} +declare module "wasm-git/lg2_opfs_auto.js" { + export function loadOpfsGit(options?: { + env?: typeof globalThis; + variant?: "pthreads" | "jspi" | "asyncify"; + baseUrl?: string | URL; + user?: string; + email?: string; + moduleArg?: object; + }): Promise; + + export class OpfsGit { + variant: string; + FS: any; + module: any; + repoDir(repoName: string): string; + init(opts?: { user?: string; email?: string }): Promise; + syncRepo(repoName: string): Promise; + run(args: string[]): Promise; + clone(url: string, repoName: string): Promise; + writeFile(repoName: string, filename: string, contents: string): Promise; + readFile(repoName: string, filename: string, encoding?: string): string; + readdir(repoName: string): string[]; + addCommitPush(repoName: string, filename: string, message?: string): Promise; + removeRepo(repoName: string): Promise; + } + + export function selectOpfsVariant(env?: typeof globalThis): "pthreads" | "jspi" | "asyncify" | null; + export function detectOpfsEnvironment(env?: typeof globalThis): { + opfsAvailable: boolean; + crossOriginIsolated: boolean; + jspiAvailable: boolean; + }; + export const VARIANT_FILES: Record; + export default loadOpfsGit; +} + +declare module "*?worker&inline" { + const WorkerConstructor: { + new (options?: { name?: string }): Worker; + }; + export default WorkerConstructor; +} diff --git a/Build/src/index.html b/Build/src/index.html deleted file mode 100644 index 36e8835..0000000 --- a/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/src/main.ts b/Build/src/main.ts index f40111b..1205129 100644 --- a/Build/src/main.ts +++ b/Build/src/main.ts @@ -1,87 +1,88 @@ -import { initializeEditors, setDarkMode, setAutoRun } from "./editor"; -import { EditorView, keymap } from "@codemirror/view"; -import { EditorState, StateEffect } from "@codemirror/state"; +import { Buffer } from "buffer"; +globalThis.Buffer = Buffer; + +import { createEditor, switchToFile, editor } from "./editor"; 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 { copyToClipboard } from "./utils"; +import { clearConsole, initializeConsole, consoleEntries } from "./console"; +import { runCode, formatCode } from "./runner"; +import { createTerminal, fitTerminal } from "./terminal"; +import { undo as cmUndo, redo as cmRedo } from "@codemirror/commands"; +import { + resetCode, + loadState, + filesState, + activeFileState, + activeOutputState, + bodyClass, + isResizing, + resizingClass, + logFilters, + splitSizesState, + globalActions, + autoRunText, + previewClass, + consoleClass, + terminalClass, + loadingVisible, + errorMessage, + errorVisible, + themeLabel, + themeIconClass, + cursorPos, +} from "./appState"; +import { switchOutput, showError, toggleAutoRun, toggleDarkMode, showLoading, hideLoading } from "./ui"; 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; + bindEvent, + bindText, + bindVisibility, + bindClass, + effect, +} from "@nisoku/sairin"; +import type { FileTab } from "./types"; +import { getTemplateForExt, getLanguageForExt } from "./defaultContent"; +import { getContainer, isContainerReady, getVFS } from "./container"; +import { initGitService, isGitReady, gitClone, gitCommit, gitStatus, gitLog, gitDiff, gitPush, gitPull, syncAllFilesToWorker, requestFilesFromWorker, syncFileToWorker } from "./git-service"; +import { initBridge, syncFilesDebounced, syncActiveFileToVFS } from "./vfs-bridge"; +import GitWorker from "./git.worker?worker&inline"; -if (!consoleOutput || !loadingEl || !errorEl || !preview) { - throw new Error("Required DOM elements not found"); -} +let splitInstance: Split.Instance; +let editorPanelEl: HTMLElement | null = null; +let outputPanelEl: HTMLElement | null = null; -// 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))) { + const elementEls = [ + editorPanelEl || document.getElementById("editor-panel"), + outputPanelEl || document.getElementById("output-panel"), + ]; + if (!elementEls.every((el) => el instanceof HTMLElement)) { console.error("Split.js elements not found"); return; } - splitInstance = Split(elements, { - sizes: state.splitSizes || [50, 50], + const _sizes = splitSizesState.get(); + const sizes = + Array.isArray(_sizes) && + _sizes.length >= 2 && + _sizes.every((n) => typeof n === "number" && isFinite(n) && n > 0) + ? _sizes + : [50, 50]; + + splitInstance = Split(elementEls as HTMLElement[], { + sizes, minSize: 200, gutterSize: 10, snapOffset: 0, @@ -94,26 +95,27 @@ function initializeSplit() { "flex-basis": `${gutterSize}px`, }), onDragStart: function () { - document.body.style.cursor = - direction === "horizontal" ? "col-resize" : "row-resize"; + resizingClass.set( + direction === "horizontal" ? "resizing-col" : "resizing-row", + ); + isResizing.set(true); }, onDrag: function () { - Object.values(editors).forEach((editor) => editor.view.requestMeasure()); + if (editor.view) editor.view.requestMeasure(); }, onDragEnd: function (sizes) { - document.body.style.cursor = ""; - state.splitSizes = sizes; - saveState(); - Object.values(editors).forEach((editor) => editor.view.requestMeasure()); + resizingClass.set(""); + isResizing.set(false); + splitSizesState.set(sizes); + if (editor.view) editor.view.requestMeasure(); }, }); setTimeout(() => { - Object.values(editors).forEach((editor) => editor.view.requestMeasure()); + if (editor.view) editor.view.requestMeasure(); }, 0); } -// Handle window resize let resizeTimeout: number; const handleResize = () => { if (resizeTimeout) { @@ -131,9 +133,10 @@ window.addEventListener("beforeunload", () => { if (splitInstance) { splitInstance.destroy(); } + const files = filesState.get(); + syncAllFilesToWorker(); }); -// Add global keyboard shortcut handler for search function addGlobalSearchShortcuts() { const preventDefault = (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && (e.key === "f" || e.key === "h")) { @@ -145,244 +148,291 @@ function addGlobalSearchShortcuts() { 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))); - } - }); - } +// Menu bar +let activeMenu: string | null = null; - 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); - } +function initializeMenuBar(): void { + const menuItems = document.querySelectorAll(".menu-item"); + const dropdowns = document.querySelectorAll(".menu-dropdown"); - 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); + function closeAllMenus() { + activeMenu = null; + dropdowns.forEach((d) => d.classList.remove("open")); + } + + menuItems.forEach((item) => { + const menuId = (item as HTMLElement).dataset.menu; + if (!menuId) return; + + item.addEventListener("click", (e) => { + e.stopPropagation(); + const dropdown = document.getElementById(`menu-${menuId}`); + if (!dropdown) return; + + if (activeMenu === menuId) { + closeAllMenus(); + return; + } + + closeAllMenus(); + const rect = item.getBoundingClientRect(); + dropdown.style.left = `${rect.left}px`; + dropdown.style.top = `${rect.bottom}px`; + dropdown.classList.add("open"); + activeMenu = menuId; }); - entry.appendChild(timestamp); - entry.appendChild(document.createTextNode(" ")); - entry.appendChild(message); - entry.appendChild(copyBtn); - consoleOutput.appendChild(entry); - consoleOutput.scrollTop = consoleOutput.scrollHeight; - } -}); + item.addEventListener("mouseenter", () => { + if (activeMenu && activeMenu !== menuId) { + const dropdown = document.getElementById(`menu-${menuId}`); + if (!dropdown) return; + const prev = document.getElementById(`menu-${activeMenu}`); + if (prev) prev.classList.remove("open"); + const rect = item.getBoundingClientRect(); + dropdown.style.left = `${rect.left}px`; + dropdown.style.top = `${rect.bottom}px`; + dropdown.classList.add("open"); + activeMenu = menuId; + } + }); + }); + + // Handle menu dropdown item clicks + document.addEventListener("click", (e) => { + const target = e.target as HTMLElement; + const item = target.closest(".menu-dropdown-item") as HTMLElement | null; + if (!item) return; + + const action = item.dataset.action; + if (!action) return; -// 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); + closeAllMenus(); + + // Parse compound actions + if (action.startsWith("switchOutput-")) { + switchOutput(action.slice("switchOutput-".length)); + return; + } + if (action === "toggleSearch") { + toggleSearch("find"); + return; + } + if (action === "toggleReplace") { + toggleSearch("replace"); + return; + } + + // Direct actions + const actionMap: Record void> = { + addFile: () => addFileAction(), + addFolder: () => addFolderAction(), + importFiles: () => importFilesAction(), + exportAsZip: () => { exportAsZip().catch(console.error); }, + + resetCode: () => resetCode(), + undo: () => undoAction(), + redo: () => redoAction(), + formatCode: () => { formatCode().catch(console.error); }, + toggleSidebar: () => toggleSidebar(), + toggleDarkMode: () => toggleDarkMode(), + toggleAutoRun: () => toggleAutoRun(), + runCode: () => { runCode().catch(console.error); }, + clearConsole: () => clearConsole(), + gitStatus: () => showGitStatus(), + gitCommit: () => { commitAction().catch(console.error); }, + gitDiff: () => showGitDiff().catch(console.error), + gitLog: () => showGitLog().catch(console.error), + gitPush: () => { pushAction().catch(console.error); }, + gitPull: () => { pullAction().catch(console.error); }, + gitClone: () => { cloneAction().catch(console.error); }, + about: () => showAbout(), + openShortcuts: () => showShortcuts(), + }; + + const fn = actionMap[action]; + if (fn) fn(); }); - preview.addEventListener("click", (e) => { - e.stopPropagation(); - preview.classList.toggle("expanded"); + // Close menus on outside click + document.addEventListener("click", (e) => { + const target = e.target as HTMLElement; + if (!target.closest(".menu-item") && !target.closest(".menu-dropdown")) { + closeAllMenus(); + } }); - container.appendChild(preview); - container.appendChild(content); - return container; + // Close menus on Escape + document.addEventListener("keydown", (e) => { + if (e.key === "Escape") closeAllMenus(); + }); } -// Toggle auto-run -function toggleAutoRun(): void { - isAutoRun = !isAutoRun; - setAutoRun(isAutoRun); - localStorage.setItem("autoRun", String(isAutoRun)); - updateAutoRunStatus(); +// Toggle sidebar visibility +let sidebarVisible = true; +function toggleSidebar(): void { + const sidebar = document.getElementById("sidebar"); + if (!sidebar) return; + sidebarVisible = !sidebarVisible; + sidebar.style.display = sidebarVisible ? "" : "none"; +} - 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), - }); - }); +// Markdown preview renderer +// Git UI dialogs + +async function showGitStatus(): Promise { + try { + const output = await gitStatus(); + showInfoDialog("Git Status", output || "No changes (clean working tree)"); + } catch { + showError("Failed to get git status"); + } } -function updateAutoRunStatus(): void { - const statusEl = document.getElementById("auto-run-status"); - if (statusEl) { - statusEl.textContent = isAutoRun ? "On" : "Off"; +async function showGitDiff(): Promise { + try { + const diff = await gitDiff(); + if (!diff) { + showInfoDialog("Git Diff", "No differences found."); + return; + } + showInfoDialog("Git Diff", diff); + } catch { + showError("Failed to get git diff"); } } -// Toggle dark mode -function toggleDarkMode(): void { - isDarkMode = !isDarkMode; - setDarkMode(isDarkMode); - document.body.classList.toggle("dark-mode"); - localStorage.setItem("darkMode", String(isDarkMode)); - updateThemeIcon(); +async function showGitLog(): Promise { + try { + const log = await gitLog(); + if (!log || log.trim().length === 0) { + showInfoDialog("Git Log", "No commits yet."); + return; + } + showInfoDialog("Git Log", log); + } catch { + showError("Failed to get git log"); + } } -// 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(); +// Simple modal dialog + +function showInfoDialog(title: string, body: string): void { + // Remove existing dialog + document.querySelector(".info-dialog-overlay")?.remove(); + + const overlay = document.createElement("div"); + overlay.className = "info-dialog-overlay"; + overlay.addEventListener("click", () => overlay.remove()); + + const dialog = document.createElement("div"); + dialog.className = "info-dialog"; + dialog.addEventListener("click", (e) => e.stopPropagation()); - 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 }); + const header = document.createElement("div"); + header.className = "info-dialog-header"; + header.textContent = title; + + const closeBtn = document.createElement("button"); + closeBtn.className = "info-dialog-close"; + closeBtn.innerHTML = "×"; + closeBtn.addEventListener("click", () => overlay.remove()); + header.appendChild(closeBtn); + + const bodyEl = document.createElement("pre"); + bodyEl.className = "info-dialog-body"; + bodyEl.textContent = body; + + dialog.appendChild(header); + dialog.appendChild(bodyEl); + overlay.appendChild(dialog); + document.body.appendChild(overlay); +} + +// About dialog +function showAbout(): void { + showInfoDialog( + "About HTMLRunner", + `HTMLRunner v2.0.0\n\nA browser-based HTML/CSS/JavaScript code editor\nwith live preview, console, and git integration.\n\nBuilt with:\n - CodeMirror 6\n - Vite\n - almostnode (Node.js runtime)\n - wasm-git (libgit2 WASM)\n - ZenFS\n - Biome\n - Prettier\n\nhttps://htmltoolkit.github.io/HTMLRunner/` + ); +} + +function showShortcuts(): void { + showInfoDialog( + "Keyboard Shortcuts", + `Ctrl/Cmd + Enter Run code\nCtrl/Cmd + F Find\nCtrl/Cmd + H Find & Replace\nCtrl/Cmd + / Toggle comment\nCtrl/Cmd + Z Undo\nCtrl/Cmd + Y Redo\nTab / Shift+Tab Indent / Unindent\nEsc Close menus` + ); +} + +async function exportAsZip() { + const files = filesState.get(); + const nonEmpty = files.filter((f) => f.content.trim()); - if (files.length === 0) { + if (nonEmpty.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); + if (nonEmpty.length === 1) { + try { + const blob = new Blob([nonEmpty[0].content], { type: "text/plain" }); + saveAs(blob, nonEmpty[0].name); + } catch (err) { + console.error("Failed to export file:", err); + showError("Unable to export file."); + } return; } - const zip = new JSZip(); - for (const file of files) { - zip.file(file.name, file.content); + try { + const zip = new JSZip(); + for (const file of nonEmpty) { + zip.file(file.name, file.content); + } + const content = await zip.generateAsync({ type: "blob" }); + saveAs(content, "htmlrunner-export.zip"); + } catch (err) { + console.error("Failed to create ZIP:", err); + showError("Unable to create ZIP."); } - - 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 entries = consoleEntries.get(); 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(""); + .map((ev) => { + const timestamp = new Date(ev.timestamp).toLocaleTimeString(); + const message = ev.data + .map((d) => (typeof d === "object" ? JSON.stringify(d) : String(d))) + .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); +function copyEditorContent(): void { + if (editor.view) { + copyToClipboard(editor.view.state.doc.toString()); + } } -// 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 container = document.getElementById("editor-container"); + if (container) { + const copyBtn = document.createElement("button"); + copyBtn.className = "copy-btn"; + copyBtn.innerHTML = ''; + bindEvent(copyBtn, "click", () => { + copyEditorContent(); + copyBtn.innerHTML = ''; + setTimeout(() => { + copyBtn.innerHTML = ''; + }, 2000); + }); + container.appendChild(copyBtn); + } - const consoleTab = document.querySelector( - '.output-tabs .tab[data-output="console"]' - ); + const consoleTab = document.querySelector('.output-tabs .tab[data-output="console"]'); if (consoleTab) { const copyAllBtn = document.createElement("button"); copyAllBtn.className = "copy-btn"; @@ -390,7 +440,7 @@ function initializeCopyButtons(): void { copyAllBtn.style.marginLeft = "auto"; copyAllBtn.style.opacity = "1"; copyAllBtn.innerHTML = ' Copy All'; - copyAllBtn.addEventListener("click", () => { + bindEvent(copyAllBtn, "click", () => { copyAllConsole(); copyAllBtn.innerHTML = ' Copied!'; setTimeout(() => { @@ -401,142 +451,1041 @@ function initializeCopyButtons(): void { } } -// Log filter state -let activeFilters = new Set(["log", "error", "warn", "info"]); +function initializeLogFilters(outputTabsEl?: Element | null): void { + const consoleTab = outputTabsEl || document.querySelector(".output-tabs"); + if (!consoleTab) return; -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"; + const filtersDiv = document.createElement("div"); + filtersDiv.className = "console-filters"; + + (["log", "error", "warn", "info"] as const).forEach((type) => { + const button = document.createElement("button"); + button.className = `filter-toggle ${type}`; + const icon = + type === "log" + ? "terminal" + : type === "error" + ? "times-circle" + : type === "warn" + ? "exclamation-triangle" + : "info-circle"; + button.innerHTML = `${type.charAt(0).toUpperCase() + type.slice(1)}`; + + bindEvent(button, "click", () => { + const prev = logFilters.get(); + const set = new Set(prev); + if (set.has(type)) set.delete(type); + else set.add(type); + logFilters.set(Array.from(set)); + }); + + filtersDiv.appendChild(button); + }); + + consoleTab.insertBefore(filtersDiv, consoleTab.lastElementChild); + + const btnMap = new Map(); + Array.from(filtersDiv.children).forEach((c) => { + if (c instanceof HTMLButtonElement) { + const classes = c.className.split(" "); + for (const cls of classes) { + if (["log", "error", "warn", "info"].includes(cls)) { + btnMap.set(cls, c); + break; + } } } }); + + effect(() => { + const active = new Set(logFilters.get()); + for (const [type, btn] of btnMap) { + if (active.has(type)) btn.classList.add("active"); + else btn.classList.remove("active"); + } + }); } -function initializeLogFilters(): void { - try { - const savedFilters = localStorage.getItem("logFilters"); - if (savedFilters) { - activeFilters = new Set(JSON.parse(savedFilters)); +export function toggleSearch(mode: "find" | "replace" = "find"): void { + if (!editor.view) return; + const isOpen = searchPanelOpen(editor.view.state); + if (isOpen) { + closeSearchPanel(editor.view); + } else { + openSearchPanel(editor.view); + } + + window.requestAnimationFrame(() => { + const selector = + mode === "replace" + ? '.cm-search input[name="replace"]' + : '.cm-search input[name="search"]'; + const root = editor.view!.dom as HTMLElement; + const field = root.querySelector(selector) as HTMLInputElement | null; + field?.focus(); + field?.select(); + }); +} + +function renderFileTabs(container: HTMLElement, files: FileTab[], activeId: string): void { + container.innerHTML = ""; + + for (const file of files) { + const tab = document.createElement("div"); + tab.className = `file-tab${file.id === activeId ? " active" : ""}`; + tab.dataset.file = file.id; + + const nameSpan = document.createElement("span"); + nameSpan.className = "file-tab-name"; + nameSpan.textContent = file.name; + tab.appendChild(nameSpan); + + const closeBtn = document.createElement("button"); + closeBtn.className = "file-tab-close"; + closeBtn.innerHTML = "×"; + closeBtn.dataset.file = file.id; + tab.appendChild(closeBtn); + + container.appendChild(tab); + } + + const addBtn = document.createElement("button"); + addBtn.className = "file-tab-add"; + addBtn.innerHTML = "+"; + addBtn.title = "New file"; + container.appendChild(addBtn); +} + +// Sidebar File Tree + +const FILE_ICONS: Record = { + html: "fab fa-html5", htm: "fab fa-html5", + css: "fab fa-css3-alt", + js: "fab fa-js", mjs: "fab fa-js", cjs: "fab fa-js", + jsx: "fab fa-react", + ts: "fab fa-js", tsx: "fab fa-react", + json: "fas fa-brackets-curly", +}; + +function getFileIcon(name: string): string { + const ext = name.split(".").pop()?.toLowerCase() ?? ""; + return FILE_ICONS[ext] || "far fa-file-code"; +} + +const expandedFolders = new Set(); + +function getDirPath(name: string): string { + const idx = name.lastIndexOf("/"); + return idx >= 0 ? name.slice(0, idx) : ""; +} + +function getBaseName(name: string): string { + const idx = name.lastIndexOf("/"); + return idx >= 0 ? name.slice(idx + 1) : name; +} + +interface TreeNode { + name: string; + path: string; + isFile: boolean; + file?: FileTab; + children: TreeNode[]; +} + +function buildFileTree(files: FileTab[]): TreeNode[] { + const root: TreeNode[] = []; + + for (const file of files) { + const parts = file.name.split("/"); + let current = root; + + for (let i = 0; i < parts.length; i++) { + const isFile = i === parts.length - 1; + const part = parts[i]; + const fullPath = parts.slice(0, i + 1).join("/"); + + let existing = current.find((n) => n.name === part); + if (!existing) { + existing = { + name: part, + path: fullPath, + isFile, + children: [], + }; + if (isFile) existing.file = file; + current.push(existing); + } + if (!isFile) { + current = existing.children; + } } - } 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); + function sortNodes(nodes: TreeNode[]): void { + nodes.sort((a, b) => { + if (a.isFile !== b.isFile) return a.isFile ? 1 : -1; + return a.name.localeCompare(b.name); }); - - consoleTab.insertBefore(filtersDiv, consoleTab.lastElementChild); + for (const n of nodes) { + if (!n.isFile) sortNodes(n.children); + } } + sortNodes(root); + return root; } -// Search toggle function -export function toggleSearch(mode: "find" | "replace" = "find"): void { - const editor = editors[currentTab].view; - if (editor) { - const isOpen = searchPanelOpen(editor.state); +function renderTreeNode( + node: TreeNode, + activeId: string, + depth: number, +): HTMLElement | null { + if (node.isFile && node.name === ".gitkeep") return null; + + const item = document.createElement("div"); + + if (node.isFile) { + item.className = `file-tree-item${node.file && node.file.id === activeId ? " active" : ""}`; + item.dataset.file = node.file?.id; + + const icon = document.createElement("i"); + const fileName = node.file?.name ?? node.name; + icon.className = getFileIcon(fileName) + " file-tree-icon"; + item.appendChild(icon); + + const name = document.createElement("span"); + name.className = "file-tree-name"; + name.textContent = node.name; + item.appendChild(name); + } else { + const isOpen = expandedFolders.has(node.path); + item.className = "file-tree-folder"; + item.dataset.folder = node.path; + + const toggle = document.createElement("span"); + toggle.className = "file-tree-toggle"; + toggle.textContent = isOpen ? "▾" : "▸"; + item.appendChild(toggle); + + const icon = document.createElement("i"); + icon.className = "fas fa-folder" + (isOpen ? "-open" : "") + " file-tree-icon"; + item.appendChild(icon); + + const name = document.createElement("span"); + name.className = "file-tree-name"; + name.textContent = node.name; + item.appendChild(name); + if (isOpen) { - closeSearchPanel(editor); + const visible = node.children.filter( + (c) => !(c.isFile && c.name === ".gitkeep"), + ); + if (visible.length > 0) { + const children = document.createElement("div"); + children.className = "file-tree-children"; + const sorted = [...visible].sort((a, b) => { + if (a.isFile !== b.isFile) return a.isFile ? 1 : -1; + return a.name.localeCompare(b.name); + }); + let hasChild = false; + for (const child of sorted) { + const el = renderTreeNode(child, activeId, depth + 1); + if (el) { + children.appendChild(el); + hasChild = true; + } + } + if (hasChild) item.appendChild(children); + } + } + } + + item.style.paddingLeft = `${depth * 16 + 4}px`; + return item; +} + +function renderFileTree(container: HTMLElement): void { + const files = filesState.get(); + const activeId = activeFileState.get(); + + container.innerHTML = ""; + + const root = buildFileTree(files); + for (const node of root) { + const el = renderTreeNode(node, activeId, 0); + if (el) container.appendChild(el); + } +} + +// Git indicator overlay + +function renderGitStatus(container: HTMLElement, statusText: string): void { + container.innerHTML = ""; + if (!statusText || statusText.includes("nothing to commit")) { + container.innerHTML = 'No changes'; + return; + } + const lines = statusText.split("\n").filter((l) => l.trim()); + for (const line of lines) { + const item = document.createElement("div"); + item.className = "git-status-item"; + const name = document.createElement("span"); + name.className = "git-status-filename"; + name.textContent = line; + item.appendChild(name); + container.appendChild(item); + } +} + +// File operations + +function switchFileAction(id: string): void { + const files = filesState.get(); + const file = files.find((f) => f.id === id); + if (file) switchToFile(file); +} + +function addFileAction(): void { + const name = prompt("Enter filename (use / for folders):", "untitled.html"); + if (!name || !name.trim()) return; + + const fileName = name.trim(); + const ext = fileName.split(".").pop()?.toLowerCase() || ""; + const language = getLanguageForExt(ext); + const template = getTemplateForExt(ext); + + const newFile: FileTab = { + id: fileName, + name: fileName, + content: template, + language, + }; + + const files = filesState.get(); + filesState.set([...files, newFile]); + activeFileState.set(newFile.id); + + const file = filesState.get().find((f) => f.id === newFile.id); + if (file) switchToFile(file); + + if (isGitReady()) { + syncFileToWorker(fileName, template); + } +} + +function closeFileAction(id: string): void { + const files = filesState.get(); + if (files.length <= 1) return; + + const idx = files.findIndex((f) => f.id === id); + const updated = files.filter((f) => f.id !== id); + filesState.set(updated); + + const wasActive = activeFileState.get() === id; + if (wasActive && updated.length > 0) { + const nextIdx = Math.min(idx, updated.length - 1); + const newActive = updated[nextIdx].id; + activeFileState.set(newActive); + const file = updated[nextIdx]; + if (file) switchToFile(file); + } + + const file = files.find((f) => f.id === id); + if (file && isGitReady()) { + // Worker handles deletion via git + } +} + +async function commitAction(): Promise { + const msg = prompt("Commit message:", "Update files"); + if (!msg || !msg.trim()) return; + try { + await syncAllFilesToWorker(); + const sha = await gitCommit(msg.trim()); + showError(`Committed: ${sha.slice(0, 7)}`); + await refreshGitStatus(); + } catch (err) { + console.error("Commit failed:", err); + showError("Commit failed"); + } +} + +async function refreshGitStatus(): Promise { + const statusEl = document.getElementById("git-status"); + if (!statusEl) return; + try { + const output = await gitStatus(); + renderGitStatus(statusEl, output); + } catch { + // VFS not ready yet + } +} + +async function pushAction(): Promise { + const remote = prompt("Remote name:", "origin") || "origin"; + const ref = prompt("Branch to push:", "main") || "main"; + try { + showLoading(); + await syncAllFilesToWorker(); + await gitPush(remote, ref); + showError(`Pushed to ${remote}/${ref}`); + } catch (err) { + console.error("Push failed:", err); + showError(`Push failed: ${err instanceof Error ? err.message : String(err)}`); + } finally { + hideLoading(); + } +} + +async function pullAction(): Promise { + const remote = prompt("Remote name:", "origin") || "origin"; + const ref = prompt("Branch to pull:", "main") || "main"; + try { + showLoading(); + await gitPull(remote, ref); + showError(`Pulled from ${remote}/${ref}`); + await refreshGitStatus(); + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + showError(`Pull failed: ${msg}`); + } finally { + hideLoading(); + } +} + +async function cloneAction(): Promise { + const url = prompt("Clone repository URL:"); + if (!url) return; + try { + showLoading(); + await gitClone(url); + showError("Repository cloned"); + await refreshGitStatus(); + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + showError(`Clone failed: ${msg}`); + } finally { + hideLoading(); + } +} + +// Import files from disk + +function importFilesAction(): void { + const input = document.createElement("input"); + input.type = "file"; + input.multiple = true; + input.accept = ".html,.htm,.css,.js,.mjs,.cjs,.ts,.tsx,.jsx,.json,.svg,.xml,.txt,.md"; + input.addEventListener("change", async () => { + const fileList = input.files; + if (!fileList || fileList.length === 0) return; + const newTabs: FileTab[] = []; + for (let i = 0; i < fileList.length; i++) { + const f = fileList[i]; + const content = await f.text(); + const ext = f.name.split(".").pop()?.toLowerCase() || ""; + const language = getLanguageForExt(ext); + newTabs.push({ id: f.name, name: f.name, content, language }); + } + if (newTabs.length > 0) { + const currentFiles = filesState.get(); + filesState.set([...currentFiles, ...newTabs]); + activeFileState.set(newTabs[0].id); + const file = filesState.get().find((f) => f.id === newTabs[0].id); + if (file) switchToFile(file); + } + }); + input.click(); +} + +// Tab management + +function renameFileAction(id: string): void { + const files = filesState.get(); + const file = files.find((f) => f.id === id); + if (!file) return; + const newName = prompt("Rename file:", file.name); + if (!newName || !newName.trim() || newName.trim() === file.name) return; + const trimmed = newName.trim(); + const ext = trimmed.split(".").pop()?.toLowerCase() || ""; + const language = getLanguageForExt(ext); + const updated = files.map((f) => + f.id === id ? { ...f, id: trimmed, name: trimmed, language } : f, + ); + filesState.set(updated); + if (activeFileState.get() === id) { + activeFileState.set(trimmed); + } + if (isGitReady()) { + syncFileToWorker(trimmed, file.content); + } +} + +function duplicateFileAction(id: string): void { + const files = filesState.get(); + const file = files.find((f) => f.id === id); + if (!file) return; + const dotIdx = file.name.lastIndexOf("."); + let newName: string; + if (dotIdx > 0) { + newName = file.name.slice(0, dotIdx) + "-copy" + file.name.slice(dotIdx); + } else { + newName = file.name + "-copy"; + } + let counter = 1; + while (files.some((f) => f.name === newName)) { + counter++; + if (dotIdx > 0) { + newName = file.name.slice(0, dotIdx) + `-copy${counter}` + file.name.slice(dotIdx); } else { - openSearchPanel(editor); + newName = file.name + `-copy${counter}`; + } + } + const newFile: FileTab = { + id: newName, + name: newName, + content: file.content, + language: file.language, + }; + filesState.set([...files, newFile]); + activeFileState.set(newName); + const tab = filesState.get().find((f) => f.id === newName); + if (tab) switchToFile(tab); + if (isGitReady()) { + syncFileToWorker(newName, file.content); + } +} + +function closeOthersAction(id: string): void { + const files = filesState.get(); + const kept = files.filter((f) => f.id === id); + if (kept.length === 0) return; + const removed = files.filter((f) => f.id !== id); + filesState.set(kept); + activeFileState.set(id); + switchToFile(kept[0]); + if (isGitReady()) { + for (const f of removed) { + // Worker handles file deletion + } + } +} + +function closeAllAction(): void { + const files = filesState.get(); + if (files.length === 0) return; + const removed = files.slice(1); + const kept = files[0]; + filesState.set([kept]); + activeFileState.set(kept.id); + switchToFile(kept); + if (isGitReady()) { + for (const f of removed) { + // Worker handles file deletion + } + } +} + +function addFileInFolder(folderPath: string): void { + const name = prompt(`Enter filename in "${folderPath}/":`, "untitled.html"); + if (!name || !name.trim()) return; + + const fileName = folderPath ? folderPath + "/" + name.trim() : name.trim(); + const ext = fileName.split(".").pop()?.toLowerCase() || ""; + const language = getLanguageForExt(ext); + const template = getTemplateForExt(ext); + + const newFile: FileTab = { + id: fileName, + name: fileName, + content: template, + language, + }; + + const files = filesState.get(); + filesState.set([...files, newFile]); + activeFileState.set(newFile.id); + + const file = filesState.get().find((f) => f.id === newFile.id); + if (file) switchToFile(file); + + if (isGitReady()) { + syncFileToWorker(fileName, template); + } +} + +function addFolderAction(): void { + const name = prompt("Enter folder name:", "new-folder"); + if (!name || !name.trim()) return; + + const folderName = name.trim().replace(/\s+/g, "-").toLowerCase(); + const keepFile = ".gitkeep"; + const fileName = folderName + "/" + keepFile; + + const newFile: FileTab = { + id: fileName, + name: fileName, + content: "", + language: "text", + }; + + const files = filesState.get(); + filesState.set([...files, newFile]); + + expandedFolders.add(folderName); + + if (isGitReady()) { + syncFileToWorker(fileName, ""); + } +} + +function deleteFolderAction(folderPath: string): void { + if (!confirm(`Delete folder "${folderPath}" and all files inside?`)) return; + const files = filesState.get(); + const updated = files.filter((f) => { + const dir = getDirPath(f.name); + return dir !== folderPath && !dir.startsWith(folderPath + "/"); + }); + if (updated.length === files.length) return; + filesState.set(updated); + const activeId = activeFileState.get(); + if (!updated.find((f) => f.id === activeId) && updated.length > 0) { + activeFileState.set(updated[0].id); + switchToFile(updated[0]); + } +} + +function showFolderContextMenu(e: MouseEvent, folderPath: string): void { + e.preventDefault(); + document.querySelector(".tab-context-menu")?.remove(); + + const menu = document.createElement("div"); + menu.className = "tab-context-menu"; + menu.style.left = e.clientX + "px"; + menu.style.top = e.clientY + "px"; + + const items = [ + { + label: "New File", + icon: "fa-file", + action: () => addFileInFolder(folderPath), + }, + { + label: "New Folder", + icon: "fa-folder", + action: () => addSubfolderAction(folderPath), + }, + { + label: "Delete Folder", + icon: "fa-trash", + action: () => deleteFolderAction(folderPath), + }, + ]; + + for (const item of items) { + const el = document.createElement("div"); + el.className = "context-menu-item"; + el.innerHTML = ` ${item.label}`; + el.addEventListener("click", () => { + menu.remove(); + item.action(); + }); + menu.appendChild(el); + } + + const closeMenu = (ev: MouseEvent) => { + if (!menu.contains(ev.target as Node)) { + menu.remove(); + document.removeEventListener("click", closeMenu); } + }; + setTimeout(() => document.addEventListener("click", closeMenu), 0); + + document.body.appendChild(menu); +} + +function addSubfolderAction(parentPath: string): void { + const name = prompt(`Enter folder name in "${parentPath}/":`, "new-folder"); + if (!name || !name.trim()) return; + + const folderName = parentPath + "/" + name.trim().replace(/\s+/g, "-").toLowerCase(); + const keepFile = ".gitkeep"; + const fileName = folderName + "/" + keepFile; + + const newFile: FileTab = { + id: fileName, + name: fileName, + content: "", + language: "text", + }; + + const files = filesState.get(); + filesState.set([...files, newFile]); + expandedFolders.add(folderName); + + if (isGitReady()) { + syncFileToWorker(fileName, ""); } } -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); +// Tab context menu + +function showTabContextMenu(e: MouseEvent, fileId: string): void { + e.preventDefault(); + document.querySelector(".tab-context-menu")?.remove(); + + const menu = document.createElement("div"); + menu.className = "tab-context-menu"; + menu.style.left = e.clientX + "px"; + menu.style.top = e.clientY + "px"; + + const items = [ + { label: "Close", icon: "fa-times", action: () => closeFileAction(fileId) }, + { label: "Close Others", icon: "fa-times-circle", action: () => closeOthersAction(fileId) }, + { label: "Close All", icon: "fa-trash", action: () => closeAllAction() }, + { label: "Rename", icon: "fa-pencil", action: () => renameFileAction(fileId) }, + { label: "Duplicate", icon: "fa-copy", action: () => duplicateFileAction(fileId) }, + ]; + + for (const item of items) { + const el = document.createElement("div"); + el.className = "context-menu-item"; + el.innerHTML = ` ${item.label}`; + el.addEventListener("click", () => { + menu.remove(); + item.action(); + }); + menu.appendChild(el); + } + + const closeMenu = (ev: MouseEvent) => { + if (!menu.contains(ev.target as Node)) { + menu.remove(); + document.removeEventListener("click", closeMenu); + } }; + setTimeout(() => document.addEventListener("click", closeMenu), 0); + + document.body.appendChild(menu); +} + +// Markdown-aware run code +async function runCodeAction(): Promise { + return runCode(); } -// Expose functions to window object -Object.assign(window, { - runCode, +const actions = { + runCode: runCodeAction, clearConsole, resetCode, formatCode, - toggleAutoRun, - toggleDarkMode, - switchTab, + switchFile: switchFileAction, + addFile: addFileAction, + addFolder: addFolderAction, + closeFile: closeFileAction, + importFiles: importFilesAction, + renameFile: renameFileAction, + duplicateFile: duplicateFileAction, + closeOthers: closeOthersAction, + closeAll: closeAllAction, switchOutput, exportAsZip, copyAllConsole, copyEditorContent, toggleSearch, -}); + toggleAutoRun, + toggleDarkMode, +}; + +globalActions.set({ ...actions, formatCode: formatCode as () => Promise }); + +function undoAction(): void { + if (editor.view) cmUndo(editor.view); +} +function redoAction(): void { + if (editor.view) cmRedo(editor.view); +} + +const prevActions = globalActions.get(); +globalActions.set({ ...prevActions, undo: undoAction, redo: redoAction }); -// Initialize document.addEventListener("DOMContentLoaded", async () => { - initializeEditors(); + const worker = new GitWorker(); + initGitService(worker); + initBridge(); + + const editorContainer = document.getElementById("editor-container"); + if (!editorContainer) { + console.error("Editor container not found"); + return; + } + + const initialFiles = filesState.get(); + const initialActiveId = activeFileState.get(); + const initialFile = initialFiles.find((f) => f.id === initialActiveId) ?? initialFiles[0]; + if (initialFile) { + createEditor(editorContainer, initialFile); + } + initializeCopyButtons(); + + loadState(); + + editorPanelEl = document.getElementById("editor-panel"); + outputPanelEl = document.getElementById("output-panel"); initializeSplit(); - updateAutoRunStatus(); - initializeLogFilters(); + initializeLogFilters(document.querySelector(".output-tabs")); + initializeConsole(); + const termEl = document.getElementById("terminal") as HTMLElement | null; + if (termEl) { + createTerminal(termEl); + } + window.addEventListener("resize", () => { + fitTerminal(); + }); + window.addEventListener("message", (event) => { + if (event.origin !== location.origin) return; + if (event.data?.type !== "navigate") return; + const href = event.data.href as string; + if (!href) return; + const files = filesState.get(); + const target = files.find((f) => f.name === href); + if (!target) return; + activeFileState.set(target.id); + switchToFile(target); + runCode().catch(console.error); + }); addGlobalSearchShortcuts(); + initializeMenuBar(); + + const loadingEl = document.getElementById("loading") as HTMLDivElement | null; + const errorEl = document.getElementById("error-message") as HTMLDivElement | null; + + const fileTabsEl = document.getElementById("file-tabs") as HTMLElement | null; + + const outputPreviewTabEl = document.querySelector( + '.output-tabs .tab[data-output="preview"]', + ) as HTMLElement | null; + const outputConsoleTabEl = document.querySelector( + '.output-tabs .tab[data-output="console"]', + ) as HTMLElement | null; + + const previewEl = document.getElementById("preview") as HTMLIFrameElement | null; + const consoleEl = document.getElementById("console") as HTMLDivElement | null; + const bodyEl = document.body as HTMLElement; + + const runBtn = document.querySelector(".btn-run") as HTMLButtonElement | null; + if (runBtn) bindEvent(runBtn, "click", () => actions.runCode()); - const editorTabs = document.querySelector(".editor-tabs"); - if (editorTabs) { - initializeSearchControls(editorTabs); + const formatBtn = document.querySelector(".btn-format") as HTMLButtonElement | null; + if (formatBtn) bindEvent(formatBtn, "click", () => void actions.formatCode()); + + const autoRunBtn = document.querySelector(".btn-auto-run") as HTMLButtonElement | null; + if (autoRunBtn) bindEvent(autoRunBtn, "click", () => toggleAutoRun()); + + const themeBtn = document.querySelector(".theme-toggle") as HTMLButtonElement | null; + if (themeBtn) bindEvent(themeBtn, "click", () => toggleDarkMode()); + + const autoRunEl = document.getElementById("auto-run-status"); + if (autoRunEl) bindText(autoRunEl, autoRunText); + + const previewOpenBtn = document.getElementById("preview-open-btn"); + if (previewOpenBtn && previewEl) { + bindEvent(previewOpenBtn, "click", () => { + const src = previewEl.src; + if (src && src !== "about:blank") { + window.open(src, "_blank"); + } else { + showError("Run code first to preview"); + } + }); + } + + if (fileTabsEl) { + effect(() => { + const files = filesState.get(); + const activeId = activeFileState.get(); + renderFileTabs(fileTabsEl, files, activeId); + }); + + fileTabsEl.addEventListener("click", (e) => { + const target = e.target as HTMLElement; + const tabEl = target.closest(".file-tab") as HTMLElement | null; + const closeBtn = target.closest(".file-tab-close") as HTMLElement | null; + const addBtn = target.closest(".file-tab-add") as HTMLElement | null; + + if (closeBtn) { + const id = closeBtn.dataset.file; + if (id) actions.closeFile(id); + } else if (addBtn) { + actions.addFile(); + } else if (tabEl) { + const id = tabEl.dataset.file; + if (id) actions.switchFile(id); + } + }); + + fileTabsEl.addEventListener("contextmenu", (e) => { + const target = e.target as HTMLElement; + const tabEl = target.closest(".file-tab") as HTMLElement | null; + if (tabEl && tabEl.dataset.file) { + showTabContextMenu(e, tabEl.dataset.file); + } + }); } - // Apply dark mode to page and editors on load - if (isDarkMode) { - setPageDarkMode(true); + const outputTerminalTabEl = document.querySelector( + '.output-tabs .tab[data-output="terminal"]', + ) as HTMLElement | null; + + if (outputPreviewTabEl) { + effect(() => { + outputPreviewTabEl.className = previewClass.get(); + }); + } + if (outputConsoleTabEl) { + effect(() => { + outputConsoleTabEl.className = consoleClass.get(); + }); + } + if (outputTerminalTabEl) { + effect(() => { + outputTerminalTabEl.className = terminalClass.get(); + }); } - loadState(); - formatCode().catch((error) => { - showError(`Error formatting code: ${error.message}`); + const outputTabsContainer = document.querySelector(".output-tabs") as HTMLElement | null; + if (outputTabsContainer) { + outputTabsContainer.addEventListener("click", (e) => { + const el = e.target as Element | null; + const target = el?.closest(".tab") as HTMLElement | null; + if (!target) return; + const out = target.dataset.output; + if (out) actions.switchOutput(out); + }); + } + + const termPanelEl = document.getElementById("terminal") as HTMLElement | null; + + effect(() => { + const out = activeOutputState.get(); + if (previewEl) + previewEl.className = out === "preview" ? "preview active" : "preview"; + if (consoleEl) + consoleEl.className = out === "console" ? "console active" : "console"; + if (termPanelEl) + termPanelEl.className = out === "terminal" ? "terminal-panel active" : "terminal-panel"; + }); + effect(() => { + if (activeOutputState.get() === "terminal") { + requestAnimationFrame(() => fitTerminal()); + } + }); + + bindClass(bodyEl, bodyClass); + + if (loadingEl) bindVisibility(loadingEl, loadingVisible); + if (errorEl) { + bindText(errorEl, errorMessage); + bindVisibility(errorEl, errorVisible); + } + + const themeIcon = document.querySelector(".theme-toggle i") as HTMLElement | null; + const themeLabelEl = document.querySelector(".theme-toggle span") as HTMLElement | null; + if (themeLabelEl) bindText(themeLabelEl, themeLabel); + if (themeIcon) bindClass(themeIcon, themeIconClass); + + // Sidebar file tree + + const fileTreeEl = document.getElementById("file-tree") as HTMLElement | null; + if (fileTreeEl) { + effect(() => { + renderFileTree(fileTreeEl); + }); + + fileTreeEl.addEventListener("click", (e) => { + const target = e.target as HTMLElement; + const fileItem = target.closest(".file-tree-item") as HTMLElement | null; + const folder = !fileItem ? target.closest(".file-tree-folder") as HTMLElement | null : null; + + if (fileItem && fileItem.dataset.file) { + actions.switchFile(fileItem.dataset.file); + } else if (folder) { + const path = folder.dataset.folder; + if (!path) return; + if (expandedFolders.has(path)) { + expandedFolders.delete(path); + } else { + expandedFolders.add(path); + } + renderFileTree(fileTreeEl); + } + }); + + fileTreeEl.addEventListener("contextmenu", (e) => { + e.preventDefault(); + const target = e.target as HTMLElement; + const fileItem = target.closest(".file-tree-item") as HTMLElement | null; + const folder = target.closest(".file-tree-folder") as HTMLElement | null; + + if (fileItem && fileItem.dataset.file) { + showTabContextMenu(e, fileItem.dataset.file); + } else if (folder) { + const folderPath = folder.dataset.folder; + if (!folderPath) return; + showFolderContextMenu(e, folderPath); + } + }); + } + + // Sidebar file buttons + + const newFileBtn = document.getElementById("sidebar-new-btn"); + if (newFileBtn) { + bindEvent(newFileBtn, "click", () => actions.addFile()); + } + + const folderBtn = document.getElementById("sidebar-folder-btn"); + if (folderBtn) { + bindEvent(folderBtn, "click", () => actions.addFolder()); + } + + const importBtn = document.getElementById("sidebar-import-btn"); + if (importBtn) { + bindEvent(importBtn, "click", () => actions.importFiles()); + } + + // Cursor position + + const cursorEl = document.getElementById("cursor-position"); + if (cursorEl) { + effect(() => { + const pos = cursorPos.get(); + cursorEl.textContent = `Ln ${pos.line}, Col ${pos.col}`; + }); + } + + // Git commit button + + const gitBtn = document.getElementById("sidebar-git-btn"); + if (gitBtn) { + bindEvent(gitBtn, "click", () => void commitAction()); + } + + // Auto-refresh git status periodically + + setInterval(() => { + if (isGitReady()) { + refreshGitStatus().catch((err) => console.warn("Git status refresh failed:", err)); + } + }, 5000); + + // Sync files to VFS on change + + effect(() => { + const files = filesState.get(); + if (isGitReady()) { + syncFilesDebounced(files); + } }); -}); \ No newline at end of file + +}); diff --git a/Build/src/runner.ts b/Build/src/runner.ts index 24cebc1..a52bd0a 100644 --- a/Build/src/runner.ts +++ b/Build/src/runner.ts @@ -1,207 +1,383 @@ -import { editors } from "./editor"; -import { consoleInterceptor } from "./console"; -import { showError, showLoading, hideLoading, switchOutput } from "./ui"; +import { consoleInterceptor, navigationInterceptor } from "./console"; +import { showLoading, showError, 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 { +import { filesState, activeFileState } from "./appState"; +import { getVFS, isContainerReady } from "./container"; +import { marked } from "marked"; +import type { FileTab } from "./types"; + +let devServer: any = null; +let serverBridge: any = null; +let previewReady = false; + +async function ensureDevServer(): Promise { + if (devServer && previewReady) return true; + if (!isContainerReady()) return false; + + try { + const { ViteDevServer, getServerBridge } = await import("almostnode"); + const vfs = getVFS(); + + if (!serverBridge) { + serverBridge = getServerBridge(); + await serverBridge.initServiceWorker(); + } + + if (!devServer) { + devServer = new ViteDevServer(vfs, { port: 3000, root: "/sandbox" }); + serverBridge.registerServer(devServer, 3000); + devServer.start(); + previewReady = true; + } + + return true; + } catch (err) { + console.error("Failed to start dev server:", err); + return false; + } +} + +function escapeHtml(s: string): string { + return s.replace(/&/g, "&").replace(//g, ">"); +} + +function safeUrl(url: string): string { + const stripped = url.trim(); + try { + const parsed = new URL(stripped); + if (["http:", "https:", "mailto:"].includes(parsed.protocol)) return stripped; + return "#"; + } catch { + return stripped; + } +} + +marked.use({ + renderer: { + link({ href, title, text }) { + const titleAttr = title ? ` title="${escapeHtml(title)}"` : ""; + return `${text}`; + }, + image({ href, title, text }) { + const titleAttr = title ? ` title="${escapeHtml(title)}"` : ""; + return `${escapeHtml(text || `; + }, + }, +}); + +export function renderMarkdownPreview(md: string): string { + return `
${marked.parse(md) as string}
`; +} + +let prevMdBlobUrl: string | null = null; + +function renderMarkdownInPreview(md: string): void { + const preview = document.getElementById("preview") as HTMLIFrameElement | null; + if (!preview) return; + const isDark = document.body.classList.contains("dark-mode"); + const css = isDark + ? "body{background:#1e1e1e;color:#e0e0e0}pre,code{background:#2d2d2d}blockquote{color:#999}h1,h2,h3{border-bottom-color:#333}td,th{border-color:#444}th{background:#2d2d2d}hr{border-top-color:#333}" + : ""; + const html = ` + + + + + + +${renderMarkdownPreview(md)} +`; + if (prevMdBlobUrl) URL.revokeObjectURL(prevMdBlobUrl); + const blob = new Blob([html], { type: "text/html; charset=utf-8" }); + const url = URL.createObjectURL(blob); + prevMdBlobUrl = url; + preview.src = url; +} + +type PrettierBundle = { + prettier: typeof import("prettier/standalone"); + parserHtml: typeof import("prettier/plugins/html"); + parserCss: typeof import("prettier/plugins/postcss"); + parserBabel: typeof import("prettier/plugins/babel"); + prettierPluginEstree: typeof import("prettier/plugins/estree"); +}; + +let prettierBundlePromise: Promise | undefined; + +async function loadPrettierBundle(): Promise { + if (!prettierBundlePromise) { + prettierBundlePromise = Promise.all([ + import("prettier/standalone"), + import("prettier/plugins/html"), + import("prettier/plugins/postcss"), + import("prettier/plugins/babel"), + import("prettier/plugins/estree"), + ]) + .then( + ([prettier, parserHtml, parserCss, parserBabel, prettierPluginEstree]) => ({ + prettier, + parserHtml, + parserCss, + parserBabel, + prettierPluginEstree, + }), + ) + .catch((err) => { + prettierBundlePromise = undefined; + throw err; + }); + } + return prettierBundlePromise; +} + +export async function runCode(): Promise { 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}`); + clearConsole(); + const files = filesState.get(); + if (files.length === 0) { hideLoading(); return; } - let docContent; - const isFullHtml = /]| /\.m?js$/i.test(f.name))?.content ?? ""; + if (js.trim()) { + try { + new Function(js); + } catch (syntaxError: unknown) { + const msg = syntaxError instanceof Error ? syntaxError.message : String(syntaxError); + logConsoleError(`SyntaxError: ${msg}`); + hideLoading(); + return; } - docContent = doc.documentElement.outerHTML; - } else { - docContent = [ - '', - "", - "`; + content = content.replace(/(]*>)/i, `$1\n${interceptScript}`); + } + try { vfs.writeFileSync(`/sandbox/${file.name}`, content); } catch {} + } +} + +function getPreview(): HTMLIFrameElement | null { + const el = document.getElementById("preview"); + return el instanceof HTMLIFrameElement ? el : null; +} + +function inlineCssFiles(files: FileTab[]): string { + return files + .filter((f) => /\.css$/i.test(f.name) && f.content.trim()) + .map((f) => ``) + .join("\n"); +} + +function inlineJsFiles(files: FileTab[]): string { + return files + .filter((f) => /\.m?js$/i.test(f.name) && f.content.trim()) + .map((f) => ``) + .join("\n"); +} + +let prevBlobUrl: string | null = null; + +function runBlobFallback(files: FileTab[], preview: HTMLIFrameElement): void { + const htmlFile = files.find((f) => /\.html?$/i.test(f.name)); + const rawHtml = htmlFile?.content ?? ""; + const hasDocTag = //]|', + ``, + cssInlined, + "", + rawHtml, + jsInlined, + "", + ].filter(Boolean).join(""); + + if (prevBlobUrl) URL.revokeObjectURL(prevBlobUrl); + const blob = new Blob([docContent], { type: "text/html; charset=utf-8" }); + const url = URL.createObjectURL(blob); + prevBlobUrl = url; + preview.src = url; +} + +function injectBlobHtml(html: string, cssLinks: string, jsLinks: string): string { + let result = html; + const interceptorScript = ``; + + const headInjection = [interceptorScript, cssLinks].filter(Boolean).join("\n"); + const bodyInjection = jsLinks; + + result = result.replace(/(<\/head\s*>)/i, `${headInjection}\n$1`); + result = result.replace(/(<\/body\s*>)/i, `${bodyInjection}\n$1`); + + if (!/', + headInjection, + "", + result, + bodyInjection, + "", + ].filter(Boolean).join(""); + } + return result; +} + export async function formatCode(): Promise { try { - // Format each editor separately with error handling - let formattedHtml = editors.html.view.state.doc.toString(); - let formattedCss = editors.css.view.state.doc.toString(); - let formattedJs = editors.js.view.state.doc.toString(); - - // Format HTML - try { - if (formattedHtml.trim()) { - // First normalize the HTML by removing extra whitespace - const normalizedHtml = formattedHtml.trim().replace(/^\s+/gm, ''); - - formattedHtml = await prettier.format(normalizedHtml, { - parser: "html", - plugins: [parserHtml], - printWidth: 120, - tabWidth: 4, - htmlWhitespaceSensitivity: "ignore", - bracketSameLine: true, - singleAttributePerLine: false, - }); - - // Ensure the formatted HTML is well-formed - formattedHtml = formattedHtml.replace(/>\n\s*\n/g, '>\n'); - - // Remove two spaces from the beginning of each line - formattedHtml = formattedHtml.replace(/^ /gm, ''); + const { + prettier, + parserHtml, + parserCss, + parserBabel, + prettierPluginEstree, + } = await loadPrettierBundle(); - } - } catch (error) { - console.warn("HTML formatting skipped:", error); - // Keep original HTML if formatting fails - } + const pHtml = + (parserHtml as unknown as { default?: unknown }).default || parserHtml; + const pCss = + (parserCss as unknown as { default?: unknown }).default || parserCss; + const pBabel = + (parserBabel as unknown as { default?: unknown }).default || parserBabel; + const pEstree = + (prettierPluginEstree as unknown as { default?: unknown }).default || + prettierPluginEstree; - // Format CSS - try { - if (formattedCss.trim()) { - formattedCss = await prettier.format(formattedCss, { - parser: "css", - plugins: [parserCss], - printWidth: 100, - tabWidth: 2, - }); - // Remove two spaces from the beginning of each line - formattedCss = formattedCss.replace(/^ /gm, ''); - } - } catch (error) { - console.warn("CSS formatting failed:", error); - } + const files = filesState.get(); + + const formatFile = async (file: FileTab): Promise => { + const ext = file.name.split(".").pop()?.toLowerCase() ?? ""; + const content = file.content.trim(); + if (!content) return file.content; - // Format JavaScript with better error handling - try { - if (formattedJs.trim()) { - formattedJs = await prettier.format(formattedJs, { - parser: "babel", // Use babel instead of flow - plugins: [ - parserBabel, - (prettierPluginEstree as any).default || prettierPluginEstree, - ], - printWidth: 100, - tabWidth: 2, - semi: true, - singleQuote: true, - trailingComma: "es5", - bracketSpacing: true, - }); - // Remove two spaces from the beginning of each line - formattedJs = formattedJs.replace(/^ /gm, ''); - } - } catch (error) { - console.warn("JavaScript formatting failed:", error); - // Try with a simpler parser as fallback try { - formattedJs = await prettier.format(formattedJs, { - parser: "babel-ts", // Alternative parser - plugins: [ - parserBabel, - (prettierPluginEstree as any).default || prettierPluginEstree, - ], - printWidth: 100, - tabWidth: 2, - semi: true, - singleQuote: true, - }); - // Remove two spaces from the beginning of each line - formattedJs = formattedJs.replace(/^ /gm, ''); - } catch (fallbackError) { - console.warn("Fallback JavaScript formatting also failed:", fallbackError); + switch (ext) { + case "html": + case "htm": + return await prettier.format(content, { + parser: "html", + plugins: [pHtml], + printWidth: 120, + tabWidth: 4, + htmlWhitespaceSensitivity: "ignore", + bracketSameLine: true, + singleAttributePerLine: false, + }); + case "css": + return await prettier.format(content, { + parser: "css", + plugins: [pCss], + printWidth: 100, + tabWidth: 2, + }); + case "js": + case "mjs": + case "cjs": + case "jsx": + return await prettier.format(content, { + parser: "babel", + plugins: [pBabel, pEstree], + printWidth: 100, + tabWidth: 2, + semi: true, + singleQuote: true, + trailingComma: "es5", + bracketSpacing: true, + }); + case "ts": + case "tsx": + try { + return await prettier.format(content, { + parser: "babel-ts", + plugins: [pBabel, pEstree], + printWidth: 100, + tabWidth: 2, + semi: true, + singleQuote: true, + }); + } catch { + return file.content; + } + default: + return file.content; + } + } catch { + return file.content; } - } + }; - // Update editors - editors.html.view.dispatch({ - changes: { - from: 0, - to: editors.html.view.state.doc.length, - insert: formattedHtml, - }, - }); - editors.css.view.dispatch({ - changes: { - from: 0, - to: editors.css.view.state.doc.length, - insert: formattedCss, - }, - }); - editors.js.view.dispatch({ - changes: { - from: 0, - to: editors.js.view.state.doc.length, - insert: formattedJs, - }, - }); - - saveState(); - } catch (error: any) { - showError(`Error formatting code: ${error.message}`); + const formatted = await Promise.all(files.map(formatFile)); + const updated = files.map((f, i) => ({ + ...f, + content: formatted[i], + })); + filesState.set(updated); + } catch (error: unknown) { + const msg = error instanceof Error ? error.message : String(error); + showError(`Error formatting code: ${msg}`); } -} \ No newline at end of file +} diff --git a/Build/src/shell.ts b/Build/src/shell.ts new file mode 100644 index 0000000..1d58790 --- /dev/null +++ b/Build/src/shell.ts @@ -0,0 +1,229 @@ +import { getContainer, isContainerReady } from "./container"; +import { + gitInit, + gitClone, + gitCommit, + gitStatus, + gitLog, + gitDiff, + gitPush, + gitPull, + gitBranches, + gitCheckout, + isGitReady, + syncAllFilesToWorker, + requestFilesFromWorker, +} from "./git-service"; + +let terminalWrite: ((text: string) => void) | null = null; +let terminalWriteln: ((text: string) => void) | null = null; + +export function setTerminalWriters( + write: (text: string) => void, + writeln: (text: string) => void, +): void { + terminalWrite = write; + terminalWriteln = writeln; +} + +function write(text: string): void { + terminalWrite?.(text); +} + +function writeln(text: string): void { + terminalWriteln?.(text); +} + +function parseLine(line: string): string[] { + const result: string[] = []; + let current = ""; + let inQuote: string | null = null; + + for (let i = 0; i < line.length; i++) { + const ch = line[i]; + if (inQuote) { + if (ch === inQuote) { + inQuote = null; + } else { + current += ch; + } + } else if (ch === "'" || ch === '"') { + inQuote = ch; + } else if (ch === " ") { + if (current) { + result.push(current); + current = ""; + } + } else { + current += ch; + } + } + if (current) result.push(current); + return result; +} + +async function runShellCommand(line: string): Promise { + if (!isContainerReady()) { + writeln("Runtime not ready yet"); + return; + } + + const container = getContainer(); + try { + const result = await container.run(line, { + onStdout: (data) => write(data), + onStderr: (data) => write(data), + }); + if (result.exitCode !== 0 && result.stderr) { + // stderr already streamed via onStderr + } + } catch (err) { + writeln(`Error: ${err instanceof Error ? err.message : String(err)}`); + } +} + +async function handleGitCommand(args: string[]): Promise { + if (!isGitReady()) { + writeln("Git not ready yet"); + return; + } + + const sub = args[0]; + + switch (sub) { + case "init": + await gitInit(); + writeln("Initialized git repository"); + break; + + case "clone": { + const url = args[1]; + if (!url) { + writeln("git clone: missing URL"); + return; + } + writeln(`Cloning ${url}...`); + await gitClone(url); + writeln("Clone complete"); + break; + } + + case "status": + writeln(await gitStatus()); + break; + + case "log": + writeln(await gitLog()); + break; + + case "diff": + writeln(await gitDiff()); + break; + + case "branch": { + writeln(await gitBranches()); + break; + } + + case "checkout": { + const branch = args[1]; + if (!branch) { + writeln("git checkout: missing branch name"); + return; + } + writeln(await gitCheckout(branch)); + break; + } + + case "commit": { + const flagIdx = args.indexOf("-m"); + const message = + flagIdx >= 0 ? args.slice(flagIdx + 1).join(" ") : args.slice(1).join(" "); + if (!message) { + writeln("git commit: missing message (-m \"msg\")"); + return; + } + await syncAllFilesToWorker(); + const sha = await gitCommit(message); + writeln(sha); + break; + } + + case "push": { + const remote = args[1] || "origin"; + const ref = args[2] || "main"; + await syncAllFilesToWorker(); + writeln(await gitPush(remote, ref)); + break; + } + + case "pull": { + const remote = args[1] || "origin"; + const ref = args[2] || "main"; + writeln(await gitPull(remote, ref)); + break; + } + + default: + writeln(`git: '${sub}' is not a git command`); + break; + } +} + +function cmdHelp(): void { + writeln("Available commands:"); + writeln(" ls [dir] List directory contents"); + writeln(" cd [dir] Change directory"); + writeln(" pwd Print working directory"); + writeln(" cat Display file contents"); + writeln(" mkdir Create directory"); + writeln(" rm [-rf] Remove file or directory"); + writeln(" cp Copy file"); + writeln(" mv Move/rename file"); + writeln(" echo Print text"); + writeln(" clear Clear terminal"); + writeln(" node Run JavaScript (via runtime)"); + writeln(" npm ... npm commands (install, run, etc.)"); + writeln(" git ... git commands (init, clone, commit, etc.)"); + writeln(" help Show this help"); +} + +export async function executeCommand(line: string): Promise { + const trimmed = line.trim(); + if (!trimmed) return; + + const parts = parseLine(trimmed); + const cmd = parts[0]?.toLowerCase() ?? ""; + const args = parts.slice(1); + + if (cmd === "help") { + cmdHelp(); + return; + } + + if (cmd === "clear") { + terminalWrite?.("\x1b[2J\x1b[H"); + return; + } + + if (cmd === "git") { + try { + await handleGitCommand(args); + } catch (err) { + writeln(`git error: ${err instanceof Error ? err.message : String(err)}`); + } + syncVfsToEditor(); + return; + } + + await runShellCommand(trimmed); + + if (["npm", "node", "cp", "mv", "rm", "mkdir"].includes(cmd)) { + syncVfsToEditor(); + } +} + +async function syncVfsToEditor(): Promise { + if (!isGitReady()) return; + requestFilesFromWorker(); +} diff --git a/Build/src/state.ts b/Build/src/state.ts deleted file mode 100644 index 554b73f..0000000 --- a/Build/src/state.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { State } from "./types"; -import { editors } from "./editor"; -import { showError, switchTab, switchOutput } from "./ui"; -import { runCode } from "./runner"; - -export const state: State = { - html: "", - css: "", - js: "", - activeTab: "html", - activeOutput: "preview", - splitSizes: [50, 50], -}; - -export function saveState(): void { - state.html = editors.html.view.state.doc.toString(); - state.css = editors.css.view.state.doc.toString(); - state.js = editors.js.view.state.doc.toString(); - try { - localStorage.setItem("htmlRunnerState", JSON.stringify(state)); - } catch (e: any) { - showError("Failed to save state: " + e.message); - } -} - -export function loadState(): void { - try { - const savedState = localStorage.getItem("htmlRunnerState"); - if (savedState) { - const parsed = JSON.parse(savedState); - - // Validate state properties - if (typeof parsed.html === "string") { - editors.html.view.dispatch({ - changes: { - from: 0, - to: editors.html.view.state.doc.length, - insert: parsed.html, - }, - }); - } - if (typeof parsed.css === "string") { - editors.css.view.dispatch({ - changes: { - from: 0, - to: editors.css.view.state.doc.length, - insert: parsed.css, - }, - }); - } - if (typeof parsed.js === "string") { - editors.js.view.dispatch({ - changes: { - from: 0, - to: editors.js.view.state.doc.length, - insert: parsed.js, - }, - }); - } - - if (["html", "css", "js"].includes(parsed.activeTab)) { - switchTab(parsed.activeTab); - } - if (["preview", "console"].includes(parsed.activeOutput)) { - switchOutput(parsed.activeOutput); - } - if ( - Array.isArray(parsed.splitSizes) && - parsed.splitSizes.length === 2 && - parsed.splitSizes.every((size: any) => typeof size === "number") - ) { - state.splitSizes = parsed.splitSizes; - } - - runCode(); - } else { - resetCode(true); // Set default code without confirmation - } - } catch (e: any) { - showError("Failed to load state: " + e.message); - resetCode(true); // Set default code without confirmation - } -} - -export function resetCode(skipConfirmation: boolean = false): void { - if (skipConfirmation || confirm("Are you sure you want to reset all code?")) { - editors.html.view.dispatch({ - changes: { - from: 0, - to: editors.html.view.state.doc.length, - insert: ` - - -My Page - - - - - - - - - \ No newline at end of file diff --git a/main.js b/main.js deleted file mode 100644 index 32c06ef..0000000 --- a/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 `