From f27511a5364aae33da4d24ef2ea1683996ac5522 Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 18:47:24 +0100 Subject: [PATCH 01/29] Add GitHub Action for LanguageTool on PRs --- .github/workflows/languagetool-pr.yml | 77 +++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 .github/workflows/languagetool-pr.yml diff --git a/.github/workflows/languagetool-pr.yml b/.github/workflows/languagetool-pr.yml new file mode 100644 index 00000000..f526a8d5 --- /dev/null +++ b/.github/workflows/languagetool-pr.yml @@ -0,0 +1,77 @@ +name: LanguageTool (PR) + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + +jobs: + languagetool: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Java + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + + - name: Download LanguageTool + run: | + set -euo pipefail + LT_VERSION="6.4" + curl -fsSL -o LT.zip "https://languagetool.org/download/LanguageTool-${LT_VERSION}.zip" + unzip -q LT.zip + echo "LT_DIR=LanguageTool-${LT_VERSION}" >> "$GITHUB_ENV" + + - name: Run LanguageTool on changed files + env: + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: | + set -euo pipefail + + echo "Base: $BASE_SHA" + echo "Head: $HEAD_SHA" + + # Adjust file types as you like: + mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ + | grep -E '\.(md|rst|txt)$' || true) + + if [ "${#FILES[@]}" -eq 0 ]; then + echo "No matching files changed. Skipping." + exit 0 + fi + + echo "Files to check:" + printf ' - %s\n' "${FILES[@]}" + + JAR="$(ls -1 "$LT_DIR"/languagetool-commandline.jar)" + + # Pick your language here: + LANG="en-US" + + issues=0 + for f in "${FILES[@]}"; do + echo "-----" + echo "Checking: $f" + # LanguageTool returns 0 even with matches, so we count output ourselves. + out="$(java -jar "$JAR" -l "$LANG" "$f" || true)" + if [ -n "$out" ]; then + issues=1 + echo "$out" + else + echo "OK" + fi + done + + if [ "$issues" -ne 0 ]; then + echo "LanguageTool found issues." + exit 1 + fi + + echo "No LanguageTool issues found." From 650be5834d65ffbdc791f8c84f0079ac9b698160 Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 18:47:50 +0100 Subject: [PATCH 02/29] Add support for .mdx files in language tool workflow --- .github/workflows/languagetool-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/languagetool-pr.yml b/.github/workflows/languagetool-pr.yml index f526a8d5..27ede8bd 100644 --- a/.github/workflows/languagetool-pr.yml +++ b/.github/workflows/languagetool-pr.yml @@ -40,7 +40,7 @@ jobs: # Adjust file types as you like: mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ - | grep -E '\.(md|rst|txt)$' || true) + | grep -E '\.(md|rst|txt|mdx)$' || true) if [ "${#FILES[@]}" -eq 0 ]; then echo "No matching files changed. Skipping." From dc77791ef81a5fc3ef6ee3196750de2439a0871f Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 18:51:21 +0100 Subject: [PATCH 03/29] Delete .github/workflows/deploy.yml --- .github/workflows/deploy.yml | 43 ------------------------------------ 1 file changed, 43 deletions(-) delete mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index f9fa42a3..00000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Deploy to GitHub Pages - -on: - # Trigger the workflow every time you push to the `main` branch - # Using a different branch name? Replace `main` with your branch’s name - push: - branches: [ main ] - # Allows you to run this workflow manually from the Actions tab on GitHub. - workflow_dispatch: - -# Allow this job to clone the repo and create a page deployment -permissions: - contents: read - pages: write - id-token: write - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout your repository using git - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Install, build, and upload your site - uses: withastro/action@v3 - with: - path: . # The root location of your Astro project inside the repository. (optional) - node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 20. (optional) - package-manager: npm # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - deploy: - needs: build - runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 From c00b21e6dcc5301ac7cb19a8a57d44439878776f Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 18:58:38 +0100 Subject: [PATCH 04/29] Refactor LanguageTool workflow for clarity and efficiency Updated the LanguageTool GitHub Actions workflow to improve file type checks and output handling. --- .github/workflows/languagetool-pr.yml | 36 +++++++++++++++++++++------ 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/.github/workflows/languagetool-pr.yml b/.github/workflows/languagetool-pr.yml index 27ede8bd..bea33e75 100644 --- a/.github/workflows/languagetool-pr.yml +++ b/.github/workflows/languagetool-pr.yml @@ -28,7 +28,7 @@ jobs: unzip -q LT.zip echo "LT_DIR=LanguageTool-${LT_VERSION}" >> "$GITHUB_ENV" - - name: Run LanguageTool on changed files + - name: Run LanguageTool on changed PR files (cleaned) env: BASE_SHA: ${{ github.event.pull_request.base.sha }} HEAD_SHA: ${{ github.event.pull_request.head.sha }} @@ -38,9 +38,9 @@ jobs: echo "Base: $BASE_SHA" echo "Head: $HEAD_SHA" - # Adjust file types as you like: + # File types to check (add/remove as needed) mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ - | grep -E '\.(md|rst|txt|mdx)$' || true) + | grep -E '\.(md|mdx|rst|txt)$' || true) if [ "${#FILES[@]}" -eq 0 ]; then echo "No matching files changed. Skipping." @@ -51,16 +51,38 @@ jobs: printf ' - %s\n' "${FILES[@]}" JAR="$(ls -1 "$LT_DIR"/languagetool-commandline.jar)" - - # Pick your language here: LANG="en-US" issues=0 + for f in "${FILES[@]}"; do echo "-----" echo "Checking: $f" - # LanguageTool returns 0 even with matches, so we count output ourselves. - out="$(java -jar "$JAR" -l "$LANG" "$f" || true)" + + tmp="$(mktemp)" + + # Keep "nearly all" errors but remove the biggest source of noise: + # - YAML frontmatter at top of file (--- ... ---) + # - fenced code blocks (``` ... ```) + # + # Everything else is checked (including normal prose in MDX). + awk ' + BEGIN { fm=0; code=0; } + NR==1 && $0=="---" { fm=1; next } + fm==1 && $0=="---" { fm=0; next } + fm==1 { next } + + /^```/ { code = !code; next } + code==1 { next } + + { print } + ' "$f" > "$tmp" + + # LanguageTool CLI prints findings to stdout; it typically exits 0 even with findings, + # so we detect findings by whether output is non-empty. + out="$(java -jar "$JAR" -l "$LANG" "$tmp" || true)" + rm -f "$tmp" + if [ -n "$out" ]; then issues=1 echo "$out" From 072c78e347a43c9dc7fae3a572e7855c0ea03a6b Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:07:17 +0100 Subject: [PATCH 05/29] Update languagetool-pr.yml --- .github/workflows/languagetool-pr.yml | 115 ++++++++++++++++++++------ 1 file changed, 91 insertions(+), 24 deletions(-) diff --git a/.github/workflows/languagetool-pr.yml b/.github/workflows/languagetool-pr.yml index bea33e75..1865d70f 100644 --- a/.github/workflows/languagetool-pr.yml +++ b/.github/workflows/languagetool-pr.yml @@ -4,6 +4,10 @@ on: pull_request: types: [opened, synchronize, reopened, ready_for_review] +permissions: + contents: read + pull-requests: write + jobs: languagetool: runs-on: ubuntu-latest @@ -28,17 +32,19 @@ jobs: unzip -q LT.zip echo "LT_DIR=LanguageTool-${LT_VERSION}" >> "$GITHUB_ENV" - - name: Run LanguageTool on changed PR files (cleaned) + - name: Run LanguageTool on changed PR files + comment summary env: BASE_SHA: ${{ github.event.pull_request.base.sha }} HEAD_SHA: ${{ github.event.pull_request.head.sha }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + REPO: ${{ github.repository }} run: | set -euo pipefail echo "Base: $BASE_SHA" echo "Head: $HEAD_SHA" - # File types to check (add/remove as needed) mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ | grep -E '\.(md|mdx|rst|txt)$' || true) @@ -54,6 +60,8 @@ jobs: LANG="en-US" issues=0 + REPORT_FILE="$(mktemp)" + : > "$REPORT_FILE" for f in "${FILES[@]}"; do echo "-----" @@ -61,39 +69,98 @@ jobs: tmp="$(mktemp)" - # Keep "nearly all" errors but remove the biggest source of noise: - # - YAML frontmatter at top of file (--- ... ---) - # - fenced code blocks (``` ... ```) - # - # Everything else is checked (including normal prose in MDX). - awk ' - BEGIN { fm=0; code=0; } - NR==1 && $0=="---" { fm=1; next } - fm==1 && $0=="---" { fm=0; next } - fm==1 { next } - - /^```/ { code = !code; next } - code==1 { next } - - { print } - ' "$f" > "$tmp" - - # LanguageTool CLI prints findings to stdout; it typically exits 0 even with findings, - # so we detect findings by whether output is non-empty. + # Robust preprocessing (won't fail the job if it errors; falls back to original file) + if ! python3 - "$f" > "$tmp" 2>/dev/null << 'PY' +import re, sys +path = sys.argv[1] +text = open(path, "r", encoding="utf-8", errors="replace").read() + +# Remove YAML frontmatter at top +if text.startswith("---\n"): + m = re.match(r"^---\n.*?\n---\n", text, flags=re.S) + if m: + text = text[m.end():] + +# Remove fenced code blocks +text = re.sub(r"^```.*?$.*?^```.*?$", "\n", text, flags=re.S | re.M) + +# Remove inline code spans +text = re.sub(r"`[^`]*`", " ", text) + +# Neutralize common technical tokens (paths, filenames/exts, long identifiers) +text = re.sub(r"\b(?:~?/)?[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)+\b", " PATH ", text) + +exts = r"(so|a|o|dylib|dll|exe|bin|iso|img|qcow2|raw|tar|gz|bz2|xz|zip|7z|deb|rpm|jar|war|py|js|ts|jsx|tsx|java|c|cc|cpp|h|hpp|rs|go|rb|php|sh|yaml|yml|toml|json|xml|md|mdx|rst|txt)" +text = re.sub(rf"\b[A-Za-z0-9._-]+\.(?:{exts})\b", " FILE ", text, flags=re.I) + +text = re.sub(r"\b[A-Za-z][A-Za-z0-9_-]{14,}\b", " IDENT ", text) + +text = re.sub(r"[ \t]+", " ", text) +sys.stdout.write(text) +PY + then + cp "$f" "$tmp" + fi + out="$(java -jar "$JAR" -l "$LANG" "$tmp" || true)" rm -f "$tmp" if [ -n "$out" ]; then issues=1 echo "$out" + { + echo "FILE: $f" + echo "$out" + echo + } >> "$REPORT_FILE" else echo "OK" fi done + # Build PR comment body (upsert by marker) + MARKER="" + if [ "$issues" -ne 0 ]; then - echo "LanguageTool found issues." - exit 1 + BODY_FILE="$(mktemp)" + { + echo "$MARKER" + echo "### LanguageTool findings" + echo + echo "_Checked files changed in this PR (frontmatter + code blocks removed; inline code stripped)._" + echo + echo '```' + cat "$REPORT_FILE" + echo '```' + } > "$BODY_FILE" + + # Find existing comment with marker (if any) and update it; otherwise create a new one + COMMENTS_JSON="$(mktemp)" + gh api "repos/$REPO/issues/$PR_NUMBER/comments?per_page=100" > "$COMMENTS_JSON" + + COMMENT_ID="$(python3 - << 'PY' +import json, sys +data = json.load(open(sys.argv[1], "r", encoding="utf-8")) +for c in data: + if "" in (c.get("body") or ""): + print(c["id"]) + break +PY + "$COMMENTS_JSON")" + + if [ -n "${COMMENT_ID:-}" ]; then + gh api -X PATCH "repos/$REPO/issues/comments/$COMMENT_ID" -f body="$(cat "$BODY_FILE")" >/dev/null + echo "Updated existing LanguageTool comment." + else + gh api -X POST "repos/$REPO/issues/$PR_NUMBER/comments" -f body="$(cat "$BODY_FILE")" >/dev/null + echo "Posted new LanguageTool comment." + fi + else + echo "No LanguageTool issues found." fi - echo "No LanguageTool issues found." + rm -f "$REPORT_FILE" || true + + if [ "$issues" -ne 0 ]; then + exit 1 + fi From 2c9d531234cd5ce14bacda72703df0658f0f4eb4 Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:10:47 +0100 Subject: [PATCH 06/29] Update languagetool-pr.yml --- .github/workflows/languagetool-pr.yml | 103 ++++++++++++++++---------- 1 file changed, 64 insertions(+), 39 deletions(-) diff --git a/.github/workflows/languagetool-pr.yml b/.github/workflows/languagetool-pr.yml index 1865d70f..b21a5321 100644 --- a/.github/workflows/languagetool-pr.yml +++ b/.github/workflows/languagetool-pr.yml @@ -1,8 +1,10 @@ -name: LanguageTool (PR) +name: LanguageTool on: pull_request: types: [opened, synchronize, reopened, ready_for_review] + push: + branches: ["**"] permissions: contents: read @@ -32,20 +34,35 @@ jobs: unzip -q LT.zip echo "LT_DIR=LanguageTool-${LT_VERSION}" >> "$GITHUB_ENV" - - name: Run LanguageTool on changed PR files + comment summary + - name: Run LanguageTool (changed files) and comment on PR env: - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_NUMBER: ${{ github.event.pull_request.number }} REPO: ${{ github.repository }} + EVENT_NAME: ${{ github.event_name }} + PR_NUMBER: ${{ github.event.pull_request.number }} + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} run: | set -euo pipefail - echo "Base: $BASE_SHA" - echo "Head: $HEAD_SHA" + # Only comment when this run is for a PR event + IS_PR=0 + if [ "$EVENT_NAME" = "pull_request" ]; then + IS_PR=1 + fi + + if [ "$IS_PR" -eq 1 ]; then + echo "Base: $BASE_SHA" + echo "Head: $HEAD_SHA" + DIFF_BASE="$BASE_SHA" + DIFF_HEAD="$HEAD_SHA" + else + echo "Push run: comparing against previous commit" + DIFF_BASE="${GITHUB_SHA}^" + DIFF_HEAD="${GITHUB_SHA}" + fi - mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ + mapfile -t FILES < <(git diff --name-only "$DIFF_BASE" "$DIFF_HEAD" \ | grep -E '\.(md|mdx|rst|txt)$' || true) if [ "${#FILES[@]}" -eq 0 ]; then @@ -69,17 +86,17 @@ jobs: tmp="$(mktemp)" - # Robust preprocessing (won't fail the job if it errors; falls back to original file) - if ! python3 - "$f" > "$tmp" 2>/dev/null << 'PY' + # Preprocess with Python. If preprocessing fails, fall back to the original file. + if python3 - "$f" > "$tmp" 2>/dev/null <<'PY' import re, sys path = sys.argv[1] text = open(path, "r", encoding="utf-8", errors="replace").read() # Remove YAML frontmatter at top if text.startswith("---\n"): - m = re.match(r"^---\n.*?\n---\n", text, flags=re.S) - if m: - text = text[m.end():] + m = re.match(r"^---\n.*?\n---\n", text, flags=re.S) + if m: + text = text[m.end():] # Remove fenced code blocks text = re.sub(r"^```.*?$.*?^```.*?$", "\n", text, flags=re.S | re.M) @@ -87,18 +104,22 @@ text = re.sub(r"^```.*?$.*?^```.*?$", "\n", text, flags=re.S | re.M) # Remove inline code spans text = re.sub(r"`[^`]*`", " ", text) -# Neutralize common technical tokens (paths, filenames/exts, long identifiers) +# Neutralize path-ish tokens text = re.sub(r"\b(?:~?/)?[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)+\b", " PATH ", text) +# Neutralize common filename tokens with extensions exts = r"(so|a|o|dylib|dll|exe|bin|iso|img|qcow2|raw|tar|gz|bz2|xz|zip|7z|deb|rpm|jar|war|py|js|ts|jsx|tsx|java|c|cc|cpp|h|hpp|rs|go|rb|php|sh|yaml|yml|toml|json|xml|md|mdx|rst|txt)" text = re.sub(rf"\b[A-Za-z0-9._-]+\.(?:{exts})\b", " FILE ", text, flags=re.I) +# Neutralize very long identifier-ish tokens text = re.sub(r"\b[A-Za-z][A-Za-z0-9_-]{14,}\b", " IDENT ", text) text = re.sub(r"[ \t]+", " ", text) sys.stdout.write(text) PY then + : + else cp "$f" "$tmp" fi @@ -118,35 +139,43 @@ PY fi done - # Build PR comment body (upsert by marker) - MARKER="" - - if [ "$issues" -ne 0 ]; then + # If PR: upsert a single comment with a marker + if [ "$IS_PR" -eq 1 ]; then + MARKER="" BODY_FILE="$(mktemp)" - { - echo "$MARKER" - echo "### LanguageTool findings" - echo - echo "_Checked files changed in this PR (frontmatter + code blocks removed; inline code stripped)._" - echo - echo '```' - cat "$REPORT_FILE" - echo '```' - } > "$BODY_FILE" - - # Find existing comment with marker (if any) and update it; otherwise create a new one + + if [ "$issues" -ne 0 ]; then + { + echo "$MARKER" + echo "### LanguageTool findings" + echo + echo "_Checked files changed in this PR (frontmatter + fenced code removed; inline code stripped)._" + echo + echo '```' + cat "$REPORT_FILE" + echo '```' + } > "$BODY_FILE" + else + { + echo "$MARKER" + echo "### LanguageTool findings" + echo + echo "✅ No issues found in changed files." + } > "$BODY_FILE" + fi + COMMENTS_JSON="$(mktemp)" gh api "repos/$REPO/issues/$PR_NUMBER/comments?per_page=100" > "$COMMENTS_JSON" - COMMENT_ID="$(python3 - << 'PY' + COMMENT_ID="$(python3 - "$COMMENTS_JSON" <<'PY' import json, sys data = json.load(open(sys.argv[1], "r", encoding="utf-8")) for c in data: - if "" in (c.get("body") or ""): - print(c["id"]) - break + if "" in (c.get("body") or ""): + print(c["id"]) + break PY - "$COMMENTS_JSON")" + )" if [ -n "${COMMENT_ID:-}" ]; then gh api -X PATCH "repos/$REPO/issues/comments/$COMMENT_ID" -f body="$(cat "$BODY_FILE")" >/dev/null @@ -155,12 +184,8 @@ PY gh api -X POST "repos/$REPO/issues/$PR_NUMBER/comments" -f body="$(cat "$BODY_FILE")" >/dev/null echo "Posted new LanguageTool comment." fi - else - echo "No LanguageTool issues found." fi - rm -f "$REPORT_FILE" || true - if [ "$issues" -ne 0 ]; then exit 1 fi From 31143113b8a1701f265c075516a12200a19cc762 Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:12:54 +0100 Subject: [PATCH 07/29] Update LanguageTool workflow for PR comments --- .github/workflows/languagetool-pr.yml | 129 ++++++++++++-------------- 1 file changed, 59 insertions(+), 70 deletions(-) diff --git a/.github/workflows/languagetool-pr.yml b/.github/workflows/languagetool-pr.yml index b21a5321..92a5f038 100644 --- a/.github/workflows/languagetool-pr.yml +++ b/.github/workflows/languagetool-pr.yml @@ -1,10 +1,8 @@ -name: LanguageTool +name: LanguageTool (PR) on: pull_request: types: [opened, synchronize, reopened, ready_for_review] - push: - branches: ["**"] permissions: contents: read @@ -13,7 +11,6 @@ permissions: jobs: languagetool: runs-on: ubuntu-latest - steps: - name: Checkout uses: actions/checkout@v4 @@ -34,35 +31,20 @@ jobs: unzip -q LT.zip echo "LT_DIR=LanguageTool-${LT_VERSION}" >> "$GITHUB_ENV" - - name: Run LanguageTool (changed files) and comment on PR + - name: Run LanguageTool on changed PR files + comment summary env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} REPO: ${{ github.repository }} - EVENT_NAME: ${{ github.event_name }} PR_NUMBER: ${{ github.event.pull_request.number }} BASE_SHA: ${{ github.event.pull_request.base.sha }} HEAD_SHA: ${{ github.event.pull_request.head.sha }} run: | set -euo pipefail - # Only comment when this run is for a PR event - IS_PR=0 - if [ "$EVENT_NAME" = "pull_request" ]; then - IS_PR=1 - fi - - if [ "$IS_PR" -eq 1 ]; then - echo "Base: $BASE_SHA" - echo "Head: $HEAD_SHA" - DIFF_BASE="$BASE_SHA" - DIFF_HEAD="$HEAD_SHA" - else - echo "Push run: comparing against previous commit" - DIFF_BASE="${GITHUB_SHA}^" - DIFF_HEAD="${GITHUB_SHA}" - fi + echo "Base: $BASE_SHA" + echo "Head: $HEAD_SHA" - mapfile -t FILES < <(git diff --name-only "$DIFF_BASE" "$DIFF_HEAD" \ + mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ | grep -E '\.(md|mdx|rst|txt)$' || true) if [ "${#FILES[@]}" -eq 0 ]; then @@ -76,19 +58,11 @@ jobs: JAR="$(ls -1 "$LT_DIR"/languagetool-commandline.jar)" LANG="en-US" - issues=0 - REPORT_FILE="$(mktemp)" - : > "$REPORT_FILE" - - for f in "${FILES[@]}"; do - echo "-----" - echo "Checking: $f" - - tmp="$(mktemp)" - - # Preprocess with Python. If preprocessing fails, fall back to the original file. - if python3 - "$f" > "$tmp" 2>/dev/null <<'PY' + # Write a preprocessor script to a file (avoids YAML/heredoc indentation issues) + PREPROCESS="$(mktemp)" + cat > "$PREPROCESS" <<'PY' import re, sys + path = sys.argv[1] text = open(path, "r", encoding="utf-8", errors="replace").read() @@ -117,7 +91,19 @@ text = re.sub(r"\b[A-Za-z][A-Za-z0-9_-]{14,}\b", " IDENT ", text) text = re.sub(r"[ \t]+", " ", text) sys.stdout.write(text) PY - then + + issues=0 + REPORT_FILE="$(mktemp)" + : > "$REPORT_FILE" + + for f in "${FILES[@]}"; do + echo "-----" + echo "Checking: $f" + + tmp="$(mktemp)" + + # Preprocess; if it fails, fall back to original file (but keep the workflow running) + if python3 "$PREPROCESS" "$f" > "$tmp" 2>/dev/null; then : else cp "$f" "$tmp" @@ -139,35 +125,36 @@ PY fi done - # If PR: upsert a single comment with a marker - if [ "$IS_PR" -eq 1 ]; then - MARKER="" - BODY_FILE="$(mktemp)" + rm -f "$PREPROCESS" || true - if [ "$issues" -ne 0 ]; then - { - echo "$MARKER" - echo "### LanguageTool findings" - echo - echo "_Checked files changed in this PR (frontmatter + fenced code removed; inline code stripped)._" - echo - echo '```' - cat "$REPORT_FILE" - echo '```' - } > "$BODY_FILE" - else - { - echo "$MARKER" - echo "### LanguageTool findings" - echo - echo "✅ No issues found in changed files." - } > "$BODY_FILE" - fi + # Upsert a single PR comment (marker-based) + MARKER="" + BODY_FILE="$(mktemp)" + + if [ "$issues" -ne 0 ]; then + { + echo "$MARKER" + echo "### LanguageTool findings" + echo + echo "_Checked files changed in this PR (frontmatter + fenced code removed; inline code stripped)._" + echo + echo '```' + cat "$REPORT_FILE" + echo '```' + } > "$BODY_FILE" + else + { + echo "$MARKER" + echo "### LanguageTool findings" + echo + echo "✅ No issues found in changed files." + } > "$BODY_FILE" + fi - COMMENTS_JSON="$(mktemp)" - gh api "repos/$REPO/issues/$PR_NUMBER/comments?per_page=100" > "$COMMENTS_JSON" + COMMENTS_JSON="$(mktemp)" + gh api "repos/$REPO/issues/$PR_NUMBER/comments?per_page=100 exporting=false" > "$COMMENTS_JSON" - COMMENT_ID="$(python3 - "$COMMENTS_JSON" <<'PY' + COMMENT_ID="$(python3 - "$COMMENTS_JSON" <<'PY' import json, sys data = json.load(open(sys.argv[1], "r", encoding="utf-8")) for c in data: @@ -175,17 +162,19 @@ for c in data: print(c["id"]) break PY - )" + )" - if [ -n "${COMMENT_ID:-}" ]; then - gh api -X PATCH "repos/$REPO/issues/comments/$COMMENT_ID" -f body="$(cat "$BODY_FILE")" >/dev/null - echo "Updated existing LanguageTool comment." - else - gh api -X POST "repos/$REPO/issues/$PR_NUMBER/comments" -f body="$(cat "$BODY_FILE")" >/dev/null - echo "Posted new LanguageTool comment." - fi + if [ -n "${COMMENT_ID:-}" ]; then + gh api -X PATCH "repos/$REPO/issues/comments/$COMMENT_ID" -f body="$(cat "$BODY_FILE")" >/dev/null + echo "Updated existing LanguageTool comment." + else + gh api -X POST "repos/$REPO/issues/$PR_NUMBER/comments" -f body="$(cat "$BODY_FILE")" >/dev/null + echo "Posted new LanguageTool comment." fi + rm -f "$COMMENTS_JSON" "$BODY_FILE" "$REPORT_FILE" || true + + # Fail the check if there were findings (remove this block if you want advisory-only) if [ "$issues" -ne 0 ]; then exit 1 fi From 1ff1ed4034b4f735c75548429bcb540403ee39ae Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:22:37 +0100 Subject: [PATCH 08/29] Refactor LanguageTool workflow for PR review Updated the LanguageTool workflow to trigger on pull request target events and added rerun functionality via issue comments. --- .github/workflows/languagetool-pr.yml | 290 ++++++++++++-------------- 1 file changed, 133 insertions(+), 157 deletions(-) diff --git a/.github/workflows/languagetool-pr.yml b/.github/workflows/languagetool-pr.yml index 92a5f038..9542ed02 100644 --- a/.github/workflows/languagetool-pr.yml +++ b/.github/workflows/languagetool-pr.yml @@ -1,180 +1,156 @@ -name: LanguageTool (PR) +name: LanguageTool (PR review) on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] + # Run once when the PR is opened/re-opened. + pull_request_target: + types: [opened, reopened, labeled] + + # Allow maintainers to rerun by commenting "/languagetool" + issue_comment: + types: [created] permissions: contents: read pull-requests: write + issues: write + +concurrency: + group: languagetool-${{ github.event.pull_request.number || github.event.issue.number || github.run_id }} + cancel-in-progress: true + +env: + LT_LANGUAGE: en-US + RERUN_LABEL: languagetool:run jobs: + # Comment command -> adds a label -> label event triggers the real run + rerun_on_comment: + if: | + github.event_name == 'issue_comment' && + github.event.issue.pull_request && + contains(github.event.comment.body, '/languagetool') && + (github.event.comment.author_association == 'MEMBER' || + github.event.comment.author_association == 'OWNER' || + github.event.comment.author_association == 'COLLABORATOR') + runs-on: ubuntu-latest + steps: + - name: Add rerun label to PR + uses: actions/github-script@v7 + with: + script: | + const label = process.env.RERUN_LABEL; + const owner = context.repo.owner; + const repo = context.repo.repo; + const issue_number = context.issue.number; // PR number for issue_comment + + // Ensure label exists (create if missing) + try { + await github.rest.issues.getLabel({ owner, repo, name: label }); + } catch (e) { + await github.rest.issues.createLabel({ + owner, + repo, + name: label, + color: '0e8a16', + description: 'Rerun LanguageTool on this PR' + }); + } + + await github.rest.issues.addLabels({ + owner, + repo, + issue_number, + labels: [label] + }); + languagetool: + if: | + github.event_name == 'pull_request_target' && + ( + github.event.action == 'opened' || + github.event.action == 'reopened' || + (github.event.action == 'labeled' && github.event.label.name == 'languagetool:run') + ) runs-on: ubuntu-latest + steps: - - name: Checkout + - name: Checkout PR (head SHA) uses: actions/checkout@v4 with: + ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 - - name: Set up Java - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: "17" - - - name: Download LanguageTool + - name: Build LanguageTool server image with custom dictionary + shell: bash run: | set -euo pipefail - LT_VERSION="6.4" - curl -fsSL -o LT.zip "https://languagetool.org/download/LanguageTool-${LT_VERSION}.zip" - unzip -q LT.zip - echo "LT_DIR=LanguageTool-${LT_VERSION}" >> "$GITHUB_ENV" - - - name: Run LanguageTool on changed PR files + comment summary - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - REPO: ${{ github.repository }} - PR_NUMBER: ${{ github.event.pull_request.number }} - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} + + WORDS_DIR=".github/languagetool" + SPELLING_FILE="$WORDS_DIR/spelling.en.txt" + IGNORE_FILE="$WORDS_DIR/ignore.en.txt" + + mkdir -p "$WORDS_DIR" + test -f "$SPELLING_FILE" || : > "$SPELLING_FILE" + test -f "$IGNORE_FILE" || : > "$IGNORE_FILE" + + # Safety cap (avoid someone committing a gigantic word list) + head -n 2000 "$SPELLING_FILE" > /tmp/spelling_additions.txt + head -n 2000 "$IGNORE_FILE" > /tmp/ignore_additions.txt + + mkdir -p /tmp/lt + cp /tmp/spelling_additions.txt /tmp/lt/spelling_additions.txt + cp /tmp/ignore_additions.txt /tmp/lt/ignore_additions.txt + + cat > /tmp/lt/Dockerfile <<'EOF' + FROM erikvl87/languagetool:latest + USER root + COPY spelling_additions.txt /tmp/spelling_additions.txt + COPY ignore_additions.txt /tmp/ignore_additions.txt + RUN set -e; \ + if [ -s /tmp/spelling_additions.txt ]; then (echo; cat /tmp/spelling_additions.txt) >> org/languagetool/resource/en/hunspell/spelling.txt; fi; \ + if [ -s /tmp/ignore_additions.txt ]; then (echo; cat /tmp/ignore_additions.txt) >> org/languagetool/resource/en/hunspell/ignore.txt; fi + USER languagetool + EOF + + docker build -t lt-custom /tmp/lt + + - name: Start LanguageTool server + shell: bash run: | set -euo pipefail + docker run -d --name languagetool -p 8010:8010 lt-custom - echo "Base: $BASE_SHA" - echo "Head: $HEAD_SHA" - - mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ - | grep -E '\.(md|mdx|rst|txt)$' || true) - - if [ "${#FILES[@]}" -eq 0 ]; then - echo "No matching files changed. Skipping." - exit 0 - fi - - echo "Files to check:" - printf ' - %s\n' "${FILES[@]}" - - JAR="$(ls -1 "$LT_DIR"/languagetool-commandline.jar)" - LANG="en-US" - - # Write a preprocessor script to a file (avoids YAML/heredoc indentation issues) - PREPROCESS="$(mktemp)" - cat > "$PREPROCESS" <<'PY' -import re, sys - -path = sys.argv[1] -text = open(path, "r", encoding="utf-8", errors="replace").read() - -# Remove YAML frontmatter at top -if text.startswith("---\n"): - m = re.match(r"^---\n.*?\n---\n", text, flags=re.S) - if m: - text = text[m.end():] - -# Remove fenced code blocks -text = re.sub(r"^```.*?$.*?^```.*?$", "\n", text, flags=re.S | re.M) - -# Remove inline code spans -text = re.sub(r"`[^`]*`", " ", text) - -# Neutralize path-ish tokens -text = re.sub(r"\b(?:~?/)?[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)+\b", " PATH ", text) - -# Neutralize common filename tokens with extensions -exts = r"(so|a|o|dylib|dll|exe|bin|iso|img|qcow2|raw|tar|gz|bz2|xz|zip|7z|deb|rpm|jar|war|py|js|ts|jsx|tsx|java|c|cc|cpp|h|hpp|rs|go|rb|php|sh|yaml|yml|toml|json|xml|md|mdx|rst|txt)" -text = re.sub(rf"\b[A-Za-z0-9._-]+\.(?:{exts})\b", " FILE ", text, flags=re.I) - -# Neutralize very long identifier-ish tokens -text = re.sub(r"\b[A-Za-z][A-Za-z0-9_-]{14,}\b", " IDENT ", text) - -text = re.sub(r"[ \t]+", " ", text) -sys.stdout.write(text) -PY - - issues=0 - REPORT_FILE="$(mktemp)" - : > "$REPORT_FILE" - - for f in "${FILES[@]}"; do - echo "-----" - echo "Checking: $f" - - tmp="$(mktemp)" - - # Preprocess; if it fails, fall back to original file (but keep the workflow running) - if python3 "$PREPROCESS" "$f" > "$tmp" 2>/dev/null; then - : - else - cp "$f" "$tmp" - fi - - out="$(java -jar "$JAR" -l "$LANG" "$tmp" || true)" - rm -f "$tmp" - - if [ -n "$out" ]; then - issues=1 - echo "$out" - { - echo "FILE: $f" - echo "$out" - echo - } >> "$REPORT_FILE" - else - echo "OK" + # Wait until the API is up + for i in {1..60}; do + if curl -fsS http://127.0.0.1:8010/v2/languages >/dev/null; then + exit 0 fi + sleep 1 done - rm -f "$PREPROCESS" || true - - # Upsert a single PR comment (marker-based) - MARKER="" - BODY_FILE="$(mktemp)" - - if [ "$issues" -ne 0 ]; then - { - echo "$MARKER" - echo "### LanguageTool findings" - echo - echo "_Checked files changed in this PR (frontmatter + fenced code removed; inline code stripped)._" - echo - echo '```' - cat "$REPORT_FILE" - echo '```' - } > "$BODY_FILE" - else - { - echo "$MARKER" - echo "### LanguageTool findings" - echo - echo "✅ No issues found in changed files." - } > "$BODY_FILE" - fi - - COMMENTS_JSON="$(mktemp)" - gh api "repos/$REPO/issues/$PR_NUMBER/comments?per_page=100 exporting=false" > "$COMMENTS_JSON" - - COMMENT_ID="$(python3 - "$COMMENTS_JSON" <<'PY' -import json, sys -data = json.load(open(sys.argv[1], "r", encoding="utf-8")) -for c in data: - if "" in (c.get("body") or ""): - print(c["id"]) - break -PY - )" - - if [ -n "${COMMENT_ID:-}" ]; then - gh api -X PATCH "repos/$REPO/issues/comments/$COMMENT_ID" -f body="$(cat "$BODY_FILE")" >/dev/null - echo "Updated existing LanguageTool comment." - else - gh api -X POST "repos/$REPO/issues/$PR_NUMBER/comments" -f body="$(cat "$BODY_FILE")" >/dev/null - echo "Posted new LanguageTool comment." - fi - - rm -f "$COMMENTS_JSON" "$BODY_FILE" "$REPORT_FILE" || true - - # Fail the check if there were findings (remove this block if you want advisory-only) - if [ "$issues" -ne 0 ]; then - exit 1 - fi + echo "LanguageTool server did not start in time" >&2 + docker logs languagetool || true + exit 1 + + - name: Run LanguageTool and comment suggestions on the PR + uses: reviewdog/action-languagetool@v1.23.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + reporter: github-pr-review + level: info + patterns: "**/*.md **/*.txt **/*.rst **/*.adoc" + language: ${{ env.LT_LANGUAGE }} + custom_api_endpoint: "http://127.0.0.1:8010" + + - name: Remove rerun label (so maintainers can trigger again) + if: github.event.action == 'labeled' && github.event.label.name == 'languagetool:run' + continue-on-error: true + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + name: 'languagetool:run', + }); From fd877f3af2e43d39751454185980815871cf9427 Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:31:28 +0100 Subject: [PATCH 09/29] Update languagetool-pr.yml --- .github/workflows/languagetool-pr.yml | 224 ++++++++++++++------------ 1 file changed, 122 insertions(+), 102 deletions(-) diff --git a/.github/workflows/languagetool-pr.yml b/.github/workflows/languagetool-pr.yml index 9542ed02..f67814bd 100644 --- a/.github/workflows/languagetool-pr.yml +++ b/.github/workflows/languagetool-pr.yml @@ -1,150 +1,166 @@ -name: LanguageTool (PR review) +name: LanguageTool (reviewdog) on: - # Run once when the PR is opened/re-opened. pull_request_target: types: [opened, reopened, labeled] - - # Allow maintainers to rerun by commenting "/languagetool" issue_comment: types: [created] permissions: contents: read pull-requests: write - issues: write concurrency: - group: languagetool-${{ github.event.pull_request.number || github.event.issue.number || github.run_id }} + group: languagetool-${{ github.event.pull_request.number || github.event.issue.number }} cancel-in-progress: true -env: - LT_LANGUAGE: en-US - RERUN_LABEL: languagetool:run - jobs: - # Comment command -> adds a label -> label event triggers the real run - rerun_on_comment: - if: | - github.event_name == 'issue_comment' && - github.event.issue.pull_request && - contains(github.event.comment.body, '/languagetool') && - (github.event.comment.author_association == 'MEMBER' || - github.event.comment.author_association == 'OWNER' || - github.event.comment.author_association == 'COLLABORATOR') + languagetool: runs-on: ubuntu-latest + steps: - - name: Add rerun label to PR + - name: Decide whether to run + gather PR info + id: meta uses: actions/github-script@v7 with: script: | - const label = process.env.RERUN_LABEL; - const owner = context.repo.owner; - const repo = context.repo.repo; - const issue_number = context.issue.number; // PR number for issue_comment - - // Ensure label exists (create if missing) - try { - await github.rest.issues.getLabel({ owner, repo, name: label }); - } catch (e) { - await github.rest.issues.createLabel({ - owner, - repo, - name: label, - color: '0e8a16', - description: 'Rerun LanguageTool on this PR' + const eventName = context.eventName; + + async function getPerm(username) { + const res = await github.rest.repos.getCollaboratorPermissionLevel({ + owner: context.repo.owner, + repo: context.repo.repo, + username, }); + return res.data.permission; // admin|maintain|write|triage|read|none } - await github.rest.issues.addLabels({ - owner, - repo, - issue_number, - labels: [label] - }); + let run = false; + let prNumber = null; + let pr = null; + + if (eventName === "pull_request_target") { + pr = context.payload.pull_request; + prNumber = pr.number; + + if (context.payload.action === "labeled") { + run = (context.payload.label?.name === "languagetool:rerun"); + } else { + // opened / reopened + run = true; + } + } else if (eventName === "issue_comment") { + // only run for PR comments + if (!context.payload.issue?.pull_request) { + run = false; + } else { + const body = (context.payload.comment?.body || "").trim(); + const wants = body.startsWith("/languagetool"); + if (!wants) { + run = false; + } else { + const perm = await getPerm(context.payload.comment.user.login); + run = ["admin", "maintain", "write"].includes(perm); + } + + prNumber = context.payload.issue.number; + const prRes = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + }); + pr = prRes.data; + } + } - languagetool: - if: | - github.event_name == 'pull_request_target' && - ( - github.event.action == 'opened' || - github.event.action == 'reopened' || - (github.event.action == 'labeled' && github.event.label.name == 'languagetool:run') - ) - runs-on: ubuntu-latest + core.setOutput("run", run ? "true" : "false"); + if (!pr) return; - steps: - - name: Checkout PR (head SHA) + core.setOutput("pr_number", String(prNumber)); + core.setOutput("head_sha", pr.head.sha); + core.setOutput("base_sha", pr.base.sha); + core.setOutput("head_repo", pr.head.repo.full_name); + core.setOutput("base_repo", pr.base.repo.full_name); + + - name: Stop early if not requested + if: steps.meta.outputs.run != 'true' + run: echo "Not running LanguageTool." + + - name: Checkout PR head (safe) + if: steps.meta.outputs.run == 'true' uses: actions/checkout@v4 with: - ref: ${{ github.event.pull_request.head.sha }} + repository: ${{ steps.meta.outputs.head_repo }} + ref: ${{ steps.meta.outputs.head_sha }} fetch-depth: 0 + persist-credentials: false + submodules: false - - name: Build LanguageTool server image with custom dictionary - shell: bash + - name: Fetch base SHA for diffing + if: steps.meta.outputs.run == 'true' run: | set -euo pipefail + git remote add upstream "https://github.com/${{ steps.meta.outputs.base_repo }}.git" || true + git fetch --no-tags --depth=1 upstream "${{ steps.meta.outputs.base_sha }}" - WORDS_DIR=".github/languagetool" - SPELLING_FILE="$WORDS_DIR/spelling.en.txt" - IGNORE_FILE="$WORDS_DIR/ignore.en.txt" - - mkdir -p "$WORDS_DIR" - test -f "$SPELLING_FILE" || : > "$SPELLING_FILE" - test -f "$IGNORE_FILE" || : > "$IGNORE_FILE" - - # Safety cap (avoid someone committing a gigantic word list) - head -n 2000 "$SPELLING_FILE" > /tmp/spelling_additions.txt - head -n 2000 "$IGNORE_FILE" > /tmp/ignore_additions.txt - - mkdir -p /tmp/lt - cp /tmp/spelling_additions.txt /tmp/lt/spelling_additions.txt - cp /tmp/ignore_additions.txt /tmp/lt/ignore_additions.txt + - name: Setup Python + if: steps.meta.outputs.run == 'true' + uses: actions/setup-python@v5 + with: + python-version: "3.11" - cat > /tmp/lt/Dockerfile <<'EOF' - FROM erikvl87/languagetool:latest - USER root - COPY spelling_additions.txt /tmp/spelling_additions.txt - COPY ignore_additions.txt /tmp/ignore_additions.txt - RUN set -e; \ - if [ -s /tmp/spelling_additions.txt ]; then (echo; cat /tmp/spelling_additions.txt) >> org/languagetool/resource/en/hunspell/spelling.txt; fi; \ - if [ -s /tmp/ignore_additions.txt ]; then (echo; cat /tmp/ignore_additions.txt) >> org/languagetool/resource/en/hunspell/ignore.txt; fi - USER languagetool - EOF + - name: Install Python deps + if: steps.meta.outputs.run == 'true' + run: | + python -m pip install --upgrade pip + python -m pip install requests - docker build -t lt-custom /tmp/lt + - name: Setup reviewdog + if: steps.meta.outputs.run == 'true' + uses: reviewdog/action-setup@v1 + with: + reviewdog_version: latest - name: Start LanguageTool server - shell: bash + if: steps.meta.outputs.run == 'true' run: | set -euo pipefail - docker run -d --name languagetool -p 8010:8010 lt-custom + docker run -d --rm --name languagetool -p 8010:8010 erikvl87/languagetool:latest - # Wait until the API is up - for i in {1..60}; do - if curl -fsS http://127.0.0.1:8010/v2/languages >/dev/null; then + # Wait until ready + for i in $(seq 1 60); do + if curl -fsS "http://localhost:8010/v2/languages" >/dev/null; then + echo "LanguageTool is up." exit 0 fi - sleep 1 + sleep 2 done - echo "LanguageTool server did not start in time" >&2 + echo "LanguageTool did not become ready in time" >&2 docker logs languagetool || true exit 1 - - name: Run LanguageTool and comment suggestions on the PR - uses: reviewdog/action-languagetool@v1.23.0 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - reporter: github-pr-review - level: info - patterns: "**/*.md **/*.txt **/*.rst **/*.adoc" - language: ${{ env.LT_LANGUAGE }} - custom_api_endpoint: "http://127.0.0.1:8010" - - - name: Remove rerun label (so maintainers can trigger again) - if: github.event.action == 'labeled' && github.event.label.name == 'languagetool:run' - continue-on-error: true + - name: Run LanguageTool and comment on PR + if: steps.meta.outputs.run == 'true' + env: + REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -euo pipefail + python .github/scripts/languagetool_reviewdog.py \ + --api-url "http://localhost:8010/v2/check" \ + --language "en-US" \ + --base-sha "${{ steps.meta.outputs.base_sha }}" \ + --head-sha "${{ steps.meta.outputs.head_sha }}" \ + --dictionary ".languagetool/words.txt" \ + | reviewdog -f=rdjson \ + -name="LanguageTool" \ + -reporter="github-pr-review" \ + -filter-mode="file" \ + -fail-level="none" \ + -level="warning" + + - name: Remove rerun label (so it can be added again later) + if: steps.meta.outputs.run == 'true' && github.event_name == 'pull_request_target' && github.event.action == 'labeled' && github.event.label.name == 'languagetool:rerun' uses: actions/github-script@v7 with: script: | @@ -152,5 +168,9 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, issue_number: context.payload.pull_request.number, - name: 'languagetool:run', + name: "languagetool:rerun", }); + + - name: Stop LanguageTool + if: always() && steps.meta.outputs.run == 'true' + run: docker stop languagetool || true From 6cfe2b6daa9193924184264a447bf2ae65494aca Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:35:25 +0100 Subject: [PATCH 10/29] Add languagetool_reviewdog.py script --- .github/scripts/languagetool_reviewdog.py | 185 ++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 .github/scripts/languagetool_reviewdog.py diff --git a/.github/scripts/languagetool_reviewdog.py b/.github/scripts/languagetool_reviewdog.py new file mode 100644 index 00000000..050dc37e --- /dev/null +++ b/.github/scripts/languagetool_reviewdog.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +import argparse +import json +import os +import re +import subprocess +from typing import Dict, List, Optional, Set, Tuple + +import requests + + +def sh(*args: str) -> str: + return subprocess.check_output(args, text=True).strip() + + +def offset_to_line_col(text: str, offset: int) -> Tuple[int, int]: + # reviewdog wants 1-based line/column + line = text.count("\n", 0, offset) + 1 + last_nl = text.rfind("\n", 0, offset) + col = offset - (last_nl + 1) + 1 + return line, col + + +def normalize_word(s: str) -> str: + s = re.sub(r"^[\W_]+|[\W_]+$", "", s, flags=re.UNICODE) + return s.lower() + + +def load_dictionary(path: str) -> Set[str]: + if not path or not os.path.exists(path): + return set() + words: Set[str] = set() + with open(path, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line or line.startswith("#"): + continue + words.add(line.lower()) + return words + + +def changed_files(base_sha: str, head_sha: str) -> List[str]: + # list only changed files in the PR + out = sh("git", "diff", "--name-only", base_sha, head_sha) + files = [x.strip() for x in out.splitlines() if x.strip()] + return files + + +def is_text_file(path: str) -> bool: + ext = os.path.splitext(path)[1].lower() + return ext in {".md", ".txt", ".rst", ".adoc", ".asciidoc", ".tex"} or os.path.basename(path).lower() in { + "readme", "readme.md", "readme.txt" + } + + +def lt_check(api_url: str, language: str, text: str) -> Dict: + resp = requests.post( + api_url, + data={ + "language": language, + "text": text, + }, + timeout=60, + ) + resp.raise_for_status() + return resp.json() + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--api-url", required=True) + ap.add_argument("--language", required=True) + ap.add_argument("--base-sha", required=True) + ap.add_argument("--head-sha", required=True) + ap.add_argument("--dictionary", default=".languagetool/words.txt") + ap.add_argument("--max-suggestions", type=int, default=3) + args = ap.parse_args() + + dict_words = load_dictionary(args.dictionary) + + files = changed_files(args.base_sha, args.head_sha) + files = [f for f in files if os.path.exists(f) and is_text_file(f)] + + diagnostics: List[Dict] = [] + + for path in files: + try: + with open(path, "r", encoding="utf-8") as f: + content = f.read() + except UnicodeDecodeError: + with open(path, "r", encoding="utf-8", errors="replace") as f: + content = f.read() + + if not content.strip(): + continue + + try: + result = lt_check(args.api_url, args.language, content) + except Exception as e: + # Emit a single diagnostic if the API call fails for a file + diagnostics.append( + { + "message": f"LanguageTool API error for {path}: {e}", + "location": {"path": path, "range": {"start": {"line": 1, "column": 1}}}, + "severity": "WARNING", + } + ) + continue + + matches = result.get("matches", []) + for m in matches: + offset = int(m.get("offset", 0)) + length = int(m.get("length", 0)) + bad = content[offset : offset + length] + + rule = m.get("rule", {}) or {} + rule_id = rule.get("id") or "UNKNOWN_RULE" + category = (rule.get("category", {}) or {}).get("id", "") + + # Cheap custom dictionary support without modifying LT server: + # if LT reports a spelling/typo-ish issue AND the token is in our dictionary -> ignore it. + # (Most spelling problems show up in category TYPOS and/or rule ids containing MORFOLOGIK.) + bad_norm = normalize_word(bad) + if dict_words and bad_norm: + looks_like_spelling = (category.upper() == "TYPOS") or ("MORFOLOGIK" in str(rule_id).upper()) + if looks_like_spelling and (bad_norm in dict_words): + continue + + start_line, start_col = offset_to_line_col(content, offset) + end_line, end_col = offset_to_line_col(content, offset + max(length, 0)) + + # Suggestions (as rdjson "suggestions" with ranges) + suggestions = [] + repls = m.get("replacements", []) or [] + for r in repls[: args.max_suggestions]: + val = r.get("value") + if not val: + continue + suggestions.append( + { + "range": { + "start": {"line": start_line, "column": start_col}, + "end": {"line": end_line, "column": end_col}, + }, + "text": val, + } + ) + + code = {"value": rule_id} + urls = rule.get("urls") or [] + if urls and isinstance(urls, list): + u = urls[0].get("value") + if u: + code["url"] = u + + diagnostics.append( + { + "message": m.get("message") or "LanguageTool finding", + "location": { + "path": path, + "range": { + "start": {"line": start_line, "column": start_col}, + "end": {"line": end_line, "column": end_col}, + }, + }, + "severity": "WARNING", + "code": code, + **({"suggestions": suggestions} if suggestions else {}), + } + ) + + rdjson = { + "source": { + "name": "LanguageTool", + "url": "https://languagetool.org", + }, + "diagnostics": diagnostics, + } + + print(json.dumps(rdjson)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From ebfebd125741f10f36fa66b5384f58097d67b432 Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:36:47 +0100 Subject: [PATCH 11/29] Update languagetool-pr.yml --- .github/workflows/languagetool-pr.yml | 290 +++++++++++++++++--------- 1 file changed, 194 insertions(+), 96 deletions(-) diff --git a/.github/workflows/languagetool-pr.yml b/.github/workflows/languagetool-pr.yml index f67814bd..70ffbac2 100644 --- a/.github/workflows/languagetool-pr.yml +++ b/.github/workflows/languagetool-pr.yml @@ -1,4 +1,4 @@ -name: LanguageTool (reviewdog) +name: LanguageTool (PR review) on: pull_request_target: @@ -9,158 +9,256 @@ on: permissions: contents: read pull-requests: write + issues: write concurrency: - group: languagetool-${{ github.event.pull_request.number || github.event.issue.number }} + group: languagetool-${{ github.event.pull_request.number || github.event.issue.number || github.run_id }} cancel-in-progress: true +env: + LT_LANGUAGE: en-US + RERUN_LABEL: languagetool:rerun + LT_PORT: "8010" + jobs: - languagetool: + # 1) Comments do NOT run reviewdog. They only tag the PR. + rerun_on_comment: + if: | + github.event_name == 'issue_comment' && + github.event.issue.pull_request && + startsWith(github.event.comment.body, '/languagetool') && + (github.event.comment.author_association == 'MEMBER' || + github.event.comment.author_association == 'OWNER' || + github.event.comment.author_association == 'COLLABORATOR') runs-on: ubuntu-latest - steps: - - name: Decide whether to run + gather PR info - id: meta + - name: Add rerun label to PR uses: actions/github-script@v7 with: script: | - const eventName = context.eventName; + const owner = context.repo.owner; + const repo = context.repo.repo; + const issue_number = context.issue.number; + const label = process.env.RERUN_LABEL; - async function getPerm(username) { - const res = await github.rest.repos.getCollaboratorPermissionLevel({ - owner: context.repo.owner, - repo: context.repo.repo, - username, + // Ensure the label exists + try { + await github.rest.issues.getLabel({ owner, repo, name: label }); + } catch (e) { + await github.rest.issues.createLabel({ + owner, repo, name: label, color: '0e8a16', + description: 'Rerun LanguageTool on this PR' }); - return res.data.permission; // admin|maintain|write|triage|read|none - } - - let run = false; - let prNumber = null; - let pr = null; - - if (eventName === "pull_request_target") { - pr = context.payload.pull_request; - prNumber = pr.number; - - if (context.payload.action === "labeled") { - run = (context.payload.label?.name === "languagetool:rerun"); - } else { - // opened / reopened - run = true; - } - } else if (eventName === "issue_comment") { - // only run for PR comments - if (!context.payload.issue?.pull_request) { - run = false; - } else { - const body = (context.payload.comment?.body || "").trim(); - const wants = body.startsWith("/languagetool"); - if (!wants) { - run = false; - } else { - const perm = await getPerm(context.payload.comment.user.login); - run = ["admin", "maintain", "write"].includes(perm); - } - - prNumber = context.payload.issue.number; - const prRes = await github.rest.pulls.get({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber, - }); - pr = prRes.data; - } } - core.setOutput("run", run ? "true" : "false"); - if (!pr) return; - - core.setOutput("pr_number", String(prNumber)); - core.setOutput("head_sha", pr.head.sha); - core.setOutput("base_sha", pr.base.sha); - core.setOutput("head_repo", pr.head.repo.full_name); - core.setOutput("base_repo", pr.base.repo.full_name); + await github.rest.issues.addLabels({ + owner, repo, issue_number, labels: [label] + }); - - name: Stop early if not requested - if: steps.meta.outputs.run != 'true' - run: echo "Not running LanguageTool." + # 2) Actual PR run: opened/reopened OR labeled with rerun label + languagetool: + if: | + github.event_name == 'pull_request_target' && + ( + github.event.action == 'opened' || + github.event.action == 'reopened' || + (github.event.action == 'labeled' && github.event.label.name == 'languagetool:rerun') + ) + runs-on: ubuntu-latest + steps: - name: Checkout PR head (safe) - if: steps.meta.outputs.run == 'true' uses: actions/checkout@v4 with: - repository: ${{ steps.meta.outputs.head_repo }} - ref: ${{ steps.meta.outputs.head_sha }} + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 persist-credentials: false submodules: false - name: Fetch base SHA for diffing - if: steps.meta.outputs.run == 'true' run: | set -euo pipefail - git remote add upstream "https://github.com/${{ steps.meta.outputs.base_repo }}.git" || true - git fetch --no-tags --depth=1 upstream "${{ steps.meta.outputs.base_sha }}" + git remote add upstream "https://github.com/${{ github.event.pull_request.base.repo.full_name }}.git" || true + git fetch --no-tags --depth=1 upstream "${{ github.event.pull_request.base.sha }}" - name: Setup Python - if: steps.meta.outputs.run == 'true' uses: actions/setup-python@v5 with: python-version: "3.11" - - name: Install Python deps - if: steps.meta.outputs.run == 'true' + - name: Install deps run: | python -m pip install --upgrade pip python -m pip install requests - name: Setup reviewdog - if: steps.meta.outputs.run == 'true' uses: reviewdog/action-setup@v1 with: reviewdog_version: latest - name: Start LanguageTool server - if: steps.meta.outputs.run == 'true' run: | set -euo pipefail - docker run -d --rm --name languagetool -p 8010:8010 erikvl87/languagetool:latest + docker run -d --rm --name languagetool -p "${LT_PORT}:8010" erikvl87/languagetool:latest - # Wait until ready + # Wait until ready (avoid connection reset during warmup) for i in $(seq 1 60); do - if curl -fsS "http://localhost:8010/v2/languages" >/dev/null; then + if curl -fsS "http://localhost:${LT_PORT}/v2/languages" >/dev/null; then echo "LanguageTool is up." exit 0 fi sleep 2 done - echo "LanguageTool did not become ready in time" >&2 + echo "LanguageTool did not become ready" >&2 docker logs languagetool || true exit 1 - - name: Run LanguageTool and comment on PR - if: steps.meta.outputs.run == 'true' + - name: Run LanguageTool -> reviewdog PR review comments env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} run: | set -euo pipefail - python .github/scripts/languagetool_reviewdog.py \ - --api-url "http://localhost:8010/v2/check" \ - --language "en-US" \ - --base-sha "${{ steps.meta.outputs.base_sha }}" \ - --head-sha "${{ steps.meta.outputs.head_sha }}" \ - --dictionary ".languagetool/words.txt" \ - | reviewdog -f=rdjson \ - -name="LanguageTool" \ - -reporter="github-pr-review" \ - -filter-mode="file" \ - -fail-level="none" \ - -level="warning" - - - name: Remove rerun label (so it can be added again later) - if: steps.meta.outputs.run == 'true' && github.event_name == 'pull_request_target' && github.event.action == 'labeled' && github.event.label.name == 'languagetool:rerun' + + # Inline python: produce rdjson for reviewdog (no repo script file needed) + python - <<'PY' > /tmp/rd.json + import json, os, re, subprocess + import requests + + API_URL = f"http://localhost:{os.environ['LT_PORT']}/v2/check" + LANGUAGE = os.environ.get("LT_LANGUAGE", "en-US") + BASE_SHA = os.environ["BASE_SHA"] + HEAD_SHA = os.environ["HEAD_SHA"] + DICT_PATH = ".languagetool/words.txt" + MAX_SUG = 3 + MAX_TEXT = 300_000 # avoid huge posts + + def sh(*args): + return subprocess.check_output(args, text=True).strip() + + def normalize_word(s: str) -> str: + s = re.sub(r"^[\W_]+|[\W_]+$", "", s, flags=re.UNICODE) + return s.lower() + + def load_dict(path): + if not os.path.exists(path): + return set() + out = set() + with open(path, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line or line.startswith("#"): + continue + out.add(line.lower()) + return out + + def offset_to_line_col(text, offset): + line = text.count("\n", 0, offset) + 1 + last_nl = text.rfind("\n", 0, offset) + col = offset - (last_nl + 1) + 1 + return line, col + + def changed_files(base, head): + out = sh("git", "diff", "--name-only", base, head) + return [x.strip() for x in out.splitlines() if x.strip()] + + def is_text_file(path): + ext = os.path.splitext(path)[1].lower() + return ext in {".md",".txt",".rst",".adoc",".asciidoc",".tex"} + + dict_words = load_dict(DICT_PATH) + files = [f for f in changed_files(BASE_SHA, HEAD_SHA) if os.path.exists(f) and is_text_file(f)] + diagnostics = [] + + for path in files: + try: + content = open(path, "r", encoding="utf-8").read() + except UnicodeDecodeError: + content = open(path, "r", encoding="utf-8", errors="replace").read() + + if not content.strip(): + continue + + if len(content) > MAX_TEXT: + content = content[:MAX_TEXT] + + try: + r = requests.post(API_URL, data={"language": LANGUAGE, "text": content}, timeout=60) + r.raise_for_status() + data = r.json() + except Exception as e: + diagnostics.append({ + "message": f"LanguageTool API error for {path}: {e}", + "location": {"path": path, "range": {"start": {"line": 1, "column": 1}}}, + "severity": "WARNING", + }) + continue + + for m in data.get("matches", []): + offset = int(m.get("offset", 0)) + length = int(m.get("length", 0)) + bad = content[offset:offset+length] + rule = m.get("rule", {}) or {} + rule_id = rule.get("id") or "UNKNOWN_RULE" + category = (rule.get("category", {}) or {}).get("id", "") + + # Custom dictionary: ignore spelling-ish matches when token is in words.txt + bad_norm = normalize_word(bad) + if dict_words and bad_norm: + looks_like_spelling = (category.upper() == "TYPOS") or ("MORFOLOGIK" in str(rule_id).upper()) + if looks_like_spelling and (bad_norm in dict_words): + continue + + sl, sc = offset_to_line_col(content, offset) + el, ec = offset_to_line_col(content, offset + max(length, 0)) + + suggestions = [] + for repl in (m.get("replacements") or [])[:MAX_SUG]: + v = repl.get("value") + if not v: + continue + suggestions.append({ + "range": {"start": {"line": sl, "column": sc}, "end": {"line": el, "column": ec}}, + "text": v, + }) + + code = {"value": rule_id} + urls = rule.get("urls") or [] + if urls and isinstance(urls, list): + u = urls[0].get("value") + if u: + code["url"] = u + + diagnostics.append({ + "message": m.get("message") or "LanguageTool finding", + "location": { + "path": path, + "range": {"start": {"line": sl, "column": sc}, "end": {"line": el, "column": ec}}, + }, + "severity": "WARNING", + "code": code, + **({"suggestions": suggestions} if suggestions else {}), + }) + + print(json.dumps({ + "source": {"name": "LanguageTool", "url": "https://languagetool.org"}, + "diagnostics": diagnostics + })) + PY + + reviewdog -f=rdjson \ + -name="LanguageTool" \ + -reporter="github-pr-review" \ + -filter-mode="diff_context" \ + -fail-level="none" \ + -level="warning" < /tmp/rd.json + + - name: Remove rerun label + if: github.event.action == 'labeled' && github.event.label.name == 'languagetool:rerun' + continue-on-error: true uses: actions/github-script@v7 with: script: | @@ -168,9 +266,9 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, issue_number: context.payload.pull_request.number, - name: "languagetool:rerun", + name: process.env.RERUN_LABEL, }); - name: Stop LanguageTool - if: always() && steps.meta.outputs.run == 'true' + if: always() run: docker stop languagetool || true From d3d797f6a8bf2356649a29c3dfb51a7ef01f665d Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:50:06 +0100 Subject: [PATCH 12/29] Modify LanguageTool workflow for PR comments and Java setup Updated LanguageTool GitHub Actions workflow to allow synchronization events and changed the PR comment behavior. Replaced Python setup with Java setup for LanguageTool execution. --- .github/workflows/languagetool-pr.yml | 274 -------------------------- .github/workflows/languagetool.yml | 265 +++++++++++++++++++++++++ 2 files changed, 265 insertions(+), 274 deletions(-) delete mode 100644 .github/workflows/languagetool-pr.yml create mode 100644 .github/workflows/languagetool.yml diff --git a/.github/workflows/languagetool-pr.yml b/.github/workflows/languagetool-pr.yml deleted file mode 100644 index 70ffbac2..00000000 --- a/.github/workflows/languagetool-pr.yml +++ /dev/null @@ -1,274 +0,0 @@ -name: LanguageTool (PR review) - -on: - pull_request_target: - types: [opened, reopened, labeled] - issue_comment: - types: [created] - -permissions: - contents: read - pull-requests: write - issues: write - -concurrency: - group: languagetool-${{ github.event.pull_request.number || github.event.issue.number || github.run_id }} - cancel-in-progress: true - -env: - LT_LANGUAGE: en-US - RERUN_LABEL: languagetool:rerun - LT_PORT: "8010" - -jobs: - # 1) Comments do NOT run reviewdog. They only tag the PR. - rerun_on_comment: - if: | - github.event_name == 'issue_comment' && - github.event.issue.pull_request && - startsWith(github.event.comment.body, '/languagetool') && - (github.event.comment.author_association == 'MEMBER' || - github.event.comment.author_association == 'OWNER' || - github.event.comment.author_association == 'COLLABORATOR') - runs-on: ubuntu-latest - steps: - - name: Add rerun label to PR - uses: actions/github-script@v7 - with: - script: | - const owner = context.repo.owner; - const repo = context.repo.repo; - const issue_number = context.issue.number; - const label = process.env.RERUN_LABEL; - - // Ensure the label exists - try { - await github.rest.issues.getLabel({ owner, repo, name: label }); - } catch (e) { - await github.rest.issues.createLabel({ - owner, repo, name: label, color: '0e8a16', - description: 'Rerun LanguageTool on this PR' - }); - } - - await github.rest.issues.addLabels({ - owner, repo, issue_number, labels: [label] - }); - - # 2) Actual PR run: opened/reopened OR labeled with rerun label - languagetool: - if: | - github.event_name == 'pull_request_target' && - ( - github.event.action == 'opened' || - github.event.action == 'reopened' || - (github.event.action == 'labeled' && github.event.label.name == 'languagetool:rerun') - ) - runs-on: ubuntu-latest - - steps: - - name: Checkout PR head (safe) - uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 0 - persist-credentials: false - submodules: false - - - name: Fetch base SHA for diffing - run: | - set -euo pipefail - git remote add upstream "https://github.com/${{ github.event.pull_request.base.repo.full_name }}.git" || true - git fetch --no-tags --depth=1 upstream "${{ github.event.pull_request.base.sha }}" - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - - name: Install deps - run: | - python -m pip install --upgrade pip - python -m pip install requests - - - name: Setup reviewdog - uses: reviewdog/action-setup@v1 - with: - reviewdog_version: latest - - - name: Start LanguageTool server - run: | - set -euo pipefail - docker run -d --rm --name languagetool -p "${LT_PORT}:8010" erikvl87/languagetool:latest - - # Wait until ready (avoid connection reset during warmup) - for i in $(seq 1 60); do - if curl -fsS "http://localhost:${LT_PORT}/v2/languages" >/dev/null; then - echo "LanguageTool is up." - exit 0 - fi - sleep 2 - done - - echo "LanguageTool did not become ready" >&2 - docker logs languagetool || true - exit 1 - - - name: Run LanguageTool -> reviewdog PR review comments - env: - REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - run: | - set -euo pipefail - - # Inline python: produce rdjson for reviewdog (no repo script file needed) - python - <<'PY' > /tmp/rd.json - import json, os, re, subprocess - import requests - - API_URL = f"http://localhost:{os.environ['LT_PORT']}/v2/check" - LANGUAGE = os.environ.get("LT_LANGUAGE", "en-US") - BASE_SHA = os.environ["BASE_SHA"] - HEAD_SHA = os.environ["HEAD_SHA"] - DICT_PATH = ".languagetool/words.txt" - MAX_SUG = 3 - MAX_TEXT = 300_000 # avoid huge posts - - def sh(*args): - return subprocess.check_output(args, text=True).strip() - - def normalize_word(s: str) -> str: - s = re.sub(r"^[\W_]+|[\W_]+$", "", s, flags=re.UNICODE) - return s.lower() - - def load_dict(path): - if not os.path.exists(path): - return set() - out = set() - with open(path, "r", encoding="utf-8") as f: - for line in f: - line = line.strip() - if not line or line.startswith("#"): - continue - out.add(line.lower()) - return out - - def offset_to_line_col(text, offset): - line = text.count("\n", 0, offset) + 1 - last_nl = text.rfind("\n", 0, offset) - col = offset - (last_nl + 1) + 1 - return line, col - - def changed_files(base, head): - out = sh("git", "diff", "--name-only", base, head) - return [x.strip() for x in out.splitlines() if x.strip()] - - def is_text_file(path): - ext = os.path.splitext(path)[1].lower() - return ext in {".md",".txt",".rst",".adoc",".asciidoc",".tex"} - - dict_words = load_dict(DICT_PATH) - files = [f for f in changed_files(BASE_SHA, HEAD_SHA) if os.path.exists(f) and is_text_file(f)] - diagnostics = [] - - for path in files: - try: - content = open(path, "r", encoding="utf-8").read() - except UnicodeDecodeError: - content = open(path, "r", encoding="utf-8", errors="replace").read() - - if not content.strip(): - continue - - if len(content) > MAX_TEXT: - content = content[:MAX_TEXT] - - try: - r = requests.post(API_URL, data={"language": LANGUAGE, "text": content}, timeout=60) - r.raise_for_status() - data = r.json() - except Exception as e: - diagnostics.append({ - "message": f"LanguageTool API error for {path}: {e}", - "location": {"path": path, "range": {"start": {"line": 1, "column": 1}}}, - "severity": "WARNING", - }) - continue - - for m in data.get("matches", []): - offset = int(m.get("offset", 0)) - length = int(m.get("length", 0)) - bad = content[offset:offset+length] - rule = m.get("rule", {}) or {} - rule_id = rule.get("id") or "UNKNOWN_RULE" - category = (rule.get("category", {}) or {}).get("id", "") - - # Custom dictionary: ignore spelling-ish matches when token is in words.txt - bad_norm = normalize_word(bad) - if dict_words and bad_norm: - looks_like_spelling = (category.upper() == "TYPOS") or ("MORFOLOGIK" in str(rule_id).upper()) - if looks_like_spelling and (bad_norm in dict_words): - continue - - sl, sc = offset_to_line_col(content, offset) - el, ec = offset_to_line_col(content, offset + max(length, 0)) - - suggestions = [] - for repl in (m.get("replacements") or [])[:MAX_SUG]: - v = repl.get("value") - if not v: - continue - suggestions.append({ - "range": {"start": {"line": sl, "column": sc}, "end": {"line": el, "column": ec}}, - "text": v, - }) - - code = {"value": rule_id} - urls = rule.get("urls") or [] - if urls and isinstance(urls, list): - u = urls[0].get("value") - if u: - code["url"] = u - - diagnostics.append({ - "message": m.get("message") or "LanguageTool finding", - "location": { - "path": path, - "range": {"start": {"line": sl, "column": sc}, "end": {"line": el, "column": ec}}, - }, - "severity": "WARNING", - "code": code, - **({"suggestions": suggestions} if suggestions else {}), - }) - - print(json.dumps({ - "source": {"name": "LanguageTool", "url": "https://languagetool.org"}, - "diagnostics": diagnostics - })) - PY - - reviewdog -f=rdjson \ - -name="LanguageTool" \ - -reporter="github-pr-review" \ - -filter-mode="diff_context" \ - -fail-level="none" \ - -level="warning" < /tmp/rd.json - - - name: Remove rerun label - if: github.event.action == 'labeled' && github.event.label.name == 'languagetool:rerun' - continue-on-error: true - uses: actions/github-script@v7 - with: - script: | - await github.rest.issues.removeLabel({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.payload.pull_request.number, - name: process.env.RERUN_LABEL, - }); - - - name: Stop LanguageTool - if: always() - run: docker stop languagetool || true diff --git a/.github/workflows/languagetool.yml b/.github/workflows/languagetool.yml new file mode 100644 index 00000000..fcc3aaf6 --- /dev/null +++ b/.github/workflows/languagetool.yml @@ -0,0 +1,265 @@ +name: LanguageTool (PR comment) + +on: + pull_request_target: + types: [opened, reopened, synchronize, labeled] + issue_comment: + types: [created] + +permissions: + contents: read + pull-requests: write + issues: write + +concurrency: + group: languagetool-${{ github.event.pull_request.number || github.event.issue.number || github.run_id }} + cancel-in-progress: true + +env: + LT_LANGUAGE: en-US + RERUN_LABEL: languagetool:rerun + +jobs: + # Comment command -> toggle a label to trigger the PR job + rerun_on_comment: + if: | + github.event_name == 'issue_comment' && + github.event.issue.pull_request && + startsWith(github.event.comment.body, '/languagetool') && + (github.event.comment.author_association == 'MEMBER' || + github.event.comment.author_association == 'OWNER' || + github.event.comment.author_association == 'COLLABORATOR') + runs-on: ubuntu-latest + steps: + - name: Toggle rerun label on PR + uses: actions/github-script@v7 + with: + script: | + const owner = context.repo.owner; + const repo = context.repo.repo; + const issue_number = context.issue.number; + const label = process.env.RERUN_LABEL; + + // ensure label exists + try { + await github.rest.issues.getLabel({ owner, repo, name: label }); + } catch { + await github.rest.issues.createLabel({ + owner, repo, name: label, color: '0e8a16', + description: 'Rerun LanguageTool on this PR' + }); + } + + // remove if present (ignore if missing), then add to force a "labeled" event + try { await github.rest.issues.removeLabel({ owner, repo, issue_number, name: label }); } catch {} + await github.rest.issues.addLabels({ owner, repo, issue_number, labels: [label] }); + + languagetool: + if: | + github.event_name == 'pull_request_target' && + ( + github.event.action == 'opened' || + github.event.action == 'reopened' || + github.event.action == 'synchronize' || + (github.event.action == 'labeled' && github.event.label.name == 'languagetool:rerun') + ) + runs-on: ubuntu-latest + + steps: + - name: Checkout PR head (safe) + uses: actions/checkout@v4 + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 0 + persist-credentials: false + + - name: Fetch base SHA for diff + run: | + set -euo pipefail + git remote add upstream "https://github.com/${{ github.event.pull_request.base.repo.full_name }}.git" || true + git fetch --no-tags --depth=1 upstream "${{ github.event.pull_request.base.sha }}" + + - name: Setup Java 17 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + + - name: Download LanguageTool snapshot (CLI) + run: | + set -euo pipefail + curl -fsSL -o lt.zip "https://internal1.languagetool.org/snapshots/LanguageTool-latest-snapshot.zip" + rm -rf .lt + mkdir -p .lt + unzip -q lt.zip -d .lt + # locate the command line jar + LT_JAR="$(ls -1 .lt/**/languagetool-commandline.jar 2>/dev/null | head -n1 || true)" + if [ -z "${LT_JAR}" ]; then + echo "Could not find languagetool-commandline.jar in snapshot" >&2 + find .lt -maxdepth 3 -type f -name "*languagetool*jar" -print >&2 || true + exit 1 + fi + echo "LT_JAR=${LT_JAR}" >> "$GITHUB_ENV" + + - name: Run LanguageTool on changed text files and build PR comment + env: + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: | + set -euo pipefail + + # Choose which files to check (edit this regex to include more types) + mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ + | grep -E '\.(md|txt|rst|adoc|asciidoc|tex)$' || true) + + # Load custom words (optional) + WORDS_FILE=".languagetool/words.txt" + if [ -f "$WORDS_FILE" ]; then + WORDS_JSON="$(jq -R -s ' + split("\n") + | map(gsub("\r";"")) + | map(select(length>0 and (startswith("#")|not))) + | map(ascii_downcase) + ' "$WORDS_FILE")" + else + WORDS_JSON='[]' + fi + + : > results.jsonl + + if [ "${#FILES[@]}" -eq 0 ]; then + echo '{"file":"(none)","issues":[]}' >> results.jsonl + else + for f in "${FILES[@]}"; do + [ -f "$f" ] || continue + + # LT prints banner lines before JSON sometimes; keep JSON only + java -jar "$LT_JAR" -l "${LT_LANGUAGE}" --json "$f" 2>/dev/null \ + | sed -n '/^{/,$p' > lt.json || true + + # Extract issues and filter spelling-ish matches for custom words + jq -c \ + --arg file "$f" \ + --argjson words "$WORDS_JSON" ' + def badtoken: + (.context.text + | .[.context.offset:(.context.offset + .context.length)] + | gsub("^[^[:alnum:]]+|[^[:alnum:]]+$";"") + | ascii_downcase); + + (.matches // []) + | map( + . as $m + | ($m.rule.id // "") as $rid + | ($m.rule.category.id // "") as $cat + | (badtoken) as $bt + | select( + # drop spelling-ish warnings when the token is in our custom list + ( (( $cat == "TYPOS") or ($rid|test("MORFOLOGIK";"i")) ) + and (($words|index($bt)) != null) + ) | not + ) + | { + message: ($m.message // "LanguageTool finding"), + rule: $rid, + replacements: (($m.replacements // []) | map(.value) | .[0:3]), + context: ($m.context.text // ""), + context_offset: ($m.context.offset // 0), + context_length: ($m.context.length // 0) + } + ) + | {file:$file, issues:.} + ' lt.json >> results.jsonl + done + fi + + # Build markdown body (stored as a file) + node <<'NODE' + const fs = require("fs"); + + const marker = ""; + const lines = fs.readFileSync("results.jsonl","utf8").trim().split("\n").filter(Boolean); + const parsed = lines.map(l => JSON.parse(l)); + + const checkedFiles = parsed + .map(p => p.file) + .filter(f => f && f !== "(none)"); + const byFile = parsed + .filter(p => Array.isArray(p.issues) && p.issues.length > 0) + .reduce((acc, p) => { acc[p.file] = p.issues; return acc; }, {}); + + let total = 0; + for (const f of Object.keys(byFile)) total += byFile[f].length; + + let body = `${marker} + ## LanguageTool report + + **Language:** \`${process.env.LT_LANGUAGE || "en-US"}\` + **Checked files:** ${checkedFiles.length ? checkedFiles.length : 0} + **Findings:** ${total} + `; + + if (!checkedFiles.length) { + body += `\nNo supported text files changed in this PR (based on the file extensions configured).\n`; + } else if (total === 0) { + body += `\n✅ No issues found in the changed text files.\n`; + } else { + body += `\n---\n`; + for (const [file, issues] of Object.entries(byFile)) { + body += `\n### ${file}\n`; + for (const it of issues.slice(0, 200)) { // cap to avoid huge comments + const ctx = (it.context || "").replace(/\s+/g, " ").trim(); + const snippet = ctx ? `\n> ${ctx}\n` : ""; + const sug = (it.replacements && it.replacements.length) + ? `\nSuggested: ${it.replacements.map(s => `\`${s}\``).join(", ")}\n` + : ""; + body += `\n- **${it.rule || "RULE"}**: ${it.message}${sug}${snippet}`; + } + if (issues.length > 200) body += `\n…(${issues.length - 200} more in this file)\n`; + } + } + + fs.writeFileSync("comment.md", body.trim() + "\n"); + NODE + + - name: Post or update PR comment + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const owner = context.repo.owner; + const repo = context.repo.repo; + const issue_number = context.payload.pull_request.number; + + const body = fs.readFileSync('comment.md', 'utf8'); + const marker = ''; + + const { data: comments } = await github.rest.issues.listComments({ + owner, repo, issue_number, per_page: 100 + }); + + const existing = comments.find(c => (c.body || '').includes(marker)); + + if (existing) { + await github.rest.issues.updateComment({ + owner, repo, comment_id: existing.id, body + }); + } else { + await github.rest.issues.createComment({ + owner, repo, issue_number, body + }); + } + + - name: Remove rerun label + if: github.event.action == 'labeled' && github.event.label.name == 'languagetool:rerun' + continue-on-error: true + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + name: process.env.RERUN_LABEL, + }); From c455ba396a10002972d4bef739161dfdeb8b33d9 Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:53:14 +0100 Subject: [PATCH 13/29] Update languagetool.yml --- .github/workflows/languagetool.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/languagetool.yml b/.github/workflows/languagetool.yml index fcc3aaf6..c567451c 100644 --- a/.github/workflows/languagetool.yml +++ b/.github/workflows/languagetool.yml @@ -111,7 +111,7 @@ jobs: # Choose which files to check (edit this regex to include more types) mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ - | grep -E '\.(md|txt|rst|adoc|asciidoc|tex)$' || true) + | grep -E '\.(md|txt|rst|adoc|asciidoc|tex|mdx)$' || true) # Load custom words (optional) WORDS_FILE=".languagetool/words.txt" From b51c3d2425bbfde6f896a593913cd4cd6ebf7d40 Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:58:46 +0100 Subject: [PATCH 14/29] Update languagetool.yml --- .github/workflows/languagetool.yml | 55 +++++++++++++++++------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/.github/workflows/languagetool.yml b/.github/workflows/languagetool.yml index c567451c..83bcaa42 100644 --- a/.github/workflows/languagetool.yml +++ b/.github/workflows/languagetool.yml @@ -1,3 +1,4 @@ +# .github/workflows/languagetool.yml name: LanguageTool (PR comment) on: @@ -20,7 +21,7 @@ env: RERUN_LABEL: languagetool:rerun jobs: - # Comment command -> toggle a label to trigger the PR job + # Comment command -> toggles a label to trigger the PR job rerun_on_comment: if: | github.event_name == 'issue_comment' && @@ -40,7 +41,7 @@ jobs: const issue_number = context.issue.number; const label = process.env.RERUN_LABEL; - // ensure label exists + // Ensure label exists try { await github.rest.issues.getLabel({ owner, repo, name: label }); } catch { @@ -50,8 +51,10 @@ jobs: }); } - // remove if present (ignore if missing), then add to force a "labeled" event - try { await github.rest.issues.removeLabel({ owner, repo, issue_number, name: label }); } catch {} + // Remove if present (ignore errors), then add to force a new "labeled" event + try { + await github.rest.issues.removeLabel({ owner, repo, issue_number, name: label }); + } catch {} await github.rest.issues.addLabels({ owner, repo, issue_number, labels: [label] }); languagetool: @@ -86,32 +89,36 @@ jobs: distribution: temurin java-version: "17" - - name: Download LanguageTool snapshot (CLI) + - name: Download LanguageTool CLI (latest snapshot) run: | set -euo pipefail curl -fsSL -o lt.zip "https://internal1.languagetool.org/snapshots/LanguageTool-latest-snapshot.zip" rm -rf .lt mkdir -p .lt unzip -q lt.zip -d .lt - # locate the command line jar + LT_JAR="$(ls -1 .lt/**/languagetool-commandline.jar 2>/dev/null | head -n1 || true)" if [ -z "${LT_JAR}" ]; then echo "Could not find languagetool-commandline.jar in snapshot" >&2 - find .lt -maxdepth 3 -type f -name "*languagetool*jar" -print >&2 || true + find .lt -maxdepth 4 -type f -name "*languagetool*jar" -print >&2 || true exit 1 fi + echo "LT_JAR=${LT_JAR}" >> "$GITHUB_ENV" - - name: Run LanguageTool on changed text files and build PR comment + - name: Run LanguageTool + build PR comment env: BASE_SHA: ${{ github.event.pull_request.base.sha }} HEAD_SHA: ${{ github.event.pull_request.head.sha }} run: | set -euo pipefail - # Choose which files to check (edit this regex to include more types) + # jq is present on ubuntu-latest, but install if your runner image differs + command -v jq >/dev/null || (sudo apt-get update && sudo apt-get install -y jq) + + # Choose files to check mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ - | grep -E '\.(md|txt|rst|adoc|asciidoc|tex|mdx)$' || true) + | grep -E '\.(md|mdx|txt|rst|adoc|asciidoc|tex)$' || true) # Load custom words (optional) WORDS_FILE=".languagetool/words.txt" @@ -134,19 +141,21 @@ jobs: for f in "${FILES[@]}"; do [ -f "$f" ] || continue - # LT prints banner lines before JSON sometimes; keep JSON only + # LT can print banner lines; keep JSON only (accepts either { or [) java -jar "$LT_JAR" -l "${LT_LANGUAGE}" --json "$f" 2>/dev/null \ - | sed -n '/^{/,$p' > lt.json || true + | sed -n '/^[{[]/,$p' > lt.json || true # Extract issues and filter spelling-ish matches for custom words jq -c \ --arg file "$f" \ --argjson words "$WORDS_JSON" ' def badtoken: - (.context.text - | .[.context.offset:(.context.offset + .context.length)] - | gsub("^[^[:alnum:]]+|[^[:alnum:]]+$";"") - | ascii_downcase); + (.context.offset // 0) as $o + | (.context.length // 0) as $l + | (.context.text // "") as $t + | ($t[$o:($o+$l)] + | gsub("^[^[:alnum:]]+|[^[:alnum:]]+$";"") + | ascii_downcase); (.matches // []) | map( @@ -155,7 +164,6 @@ jobs: | ($m.rule.category.id // "") as $cat | (badtoken) as $bt | select( - # drop spelling-ish warnings when the token is in our custom list ( (( $cat == "TYPOS") or ($rid|test("MORFOLOGIK";"i")) ) and (($words|index($bt)) != null) ) | not @@ -179,12 +187,11 @@ jobs: const fs = require("fs"); const marker = ""; - const lines = fs.readFileSync("results.jsonl","utf8").trim().split("\n").filter(Boolean); + const raw = fs.readFileSync("results.jsonl","utf8").trim(); + const lines = raw ? raw.split("\n").filter(Boolean) : []; const parsed = lines.map(l => JSON.parse(l)); - const checkedFiles = parsed - .map(p => p.file) - .filter(f => f && f !== "(none)"); + const checkedFiles = parsed.map(p => p.file).filter(f => f && f !== "(none)"); const byFile = parsed .filter(p => Array.isArray(p.issues) && p.issues.length > 0) .reduce((acc, p) => { acc[p.file] = p.issues; return acc; }, {}); @@ -196,19 +203,19 @@ jobs: ## LanguageTool report **Language:** \`${process.env.LT_LANGUAGE || "en-US"}\` - **Checked files:** ${checkedFiles.length ? checkedFiles.length : 0} + **Checked files:** ${checkedFiles.length} **Findings:** ${total} `; if (!checkedFiles.length) { - body += `\nNo supported text files changed in this PR (based on the file extensions configured).\n`; + body += `\nNo supported text files changed in this PR (based on configured extensions).\n`; } else if (total === 0) { body += `\n✅ No issues found in the changed text files.\n`; } else { body += `\n---\n`; for (const [file, issues] of Object.entries(byFile)) { body += `\n### ${file}\n`; - for (const it of issues.slice(0, 200)) { // cap to avoid huge comments + for (const it of issues.slice(0, 200)) { const ctx = (it.context || "").replace(/\s+/g, " ").trim(); const snippet = ctx ? `\n> ${ctx}\n` : ""; const sug = (it.replacements && it.replacements.length) From d6ef83d5ac8474ed297f7e588dbf5b6f85f6d588 Mon Sep 17 00:00:00 2001 From: CookieSource <36531905+CookieSource@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:06:05 +0100 Subject: [PATCH 15/29] PR after a working version Updated LanguageTool workflow to enhance PR comment formatting and issue reporting. --- .github/workflows/languagetool.yml | 49 ++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/.github/workflows/languagetool.yml b/.github/workflows/languagetool.yml index 83bcaa42..5a842a30 100644 --- a/.github/workflows/languagetool.yml +++ b/.github/workflows/languagetool.yml @@ -106,7 +106,7 @@ jobs: echo "LT_JAR=${LT_JAR}" >> "$GITHUB_ENV" - - name: Run LanguageTool + build PR comment + - name: Run LanguageTool + build PR comment (collapsible + exact word) env: BASE_SHA: ${{ github.event.pull_request.base.sha }} HEAD_SHA: ${{ github.event.pull_request.head.sha }} @@ -149,13 +149,16 @@ jobs: jq -c \ --arg file "$f" \ --argjson words "$WORDS_JSON" ' - def badtoken: + def bad_raw: (.context.offset // 0) as $o | (.context.length // 0) as $l | (.context.text // "") as $t - | ($t[$o:($o+$l)] - | gsub("^[^[:alnum:]]+|[^[:alnum:]]+$";"") - | ascii_downcase); + | ($t[$o:($o+$l)]); + + def badtoken: + (bad_raw + | gsub("^[^[:alnum:]]+|[^[:alnum:]]+$";"") + | ascii_downcase); (.matches // []) | map( @@ -171,6 +174,7 @@ jobs: | { message: ($m.message // "LanguageTool finding"), rule: $rid, + bad: (bad_raw), replacements: (($m.replacements // []) | map(.value) | .[0:3]), context: ($m.context.text // ""), context_offset: ($m.context.offset // 0), @@ -182,7 +186,7 @@ jobs: done fi - # Build markdown body (stored as a file) + # Build markdown body (stored as a file) - collapsible per file node <<'NODE' const fs = require("fs"); @@ -199,7 +203,19 @@ jobs: let total = 0; for (const f of Object.keys(byFile)) total += byFile[f].length; - let body = `${marker} + function inlineCode(s) { + if (s == null) return ""; + return String(s).replace(/`/g, "\\`").replace(/\n/g, " ").trim(); + } + + function shortContext(text, maxLen=220) { + const t = (text || "").replace(/\s+/g, " ").trim(); + if (t.length <= maxLen) return t; + return t.slice(0, maxLen - 1) + "…"; + } + + let body = + `${marker} ## LanguageTool report **Language:** \`${process.env.LT_LANGUAGE || "en-US"}\` @@ -214,16 +230,23 @@ jobs: } else { body += `\n---\n`; for (const [file, issues] of Object.entries(byFile)) { - body += `\n### ${file}\n`; + body += `\n
\n${file} — ${issues.length} finding(s)\n\n`; for (const it of issues.slice(0, 200)) { - const ctx = (it.context || "").replace(/\s+/g, " ").trim(); - const snippet = ctx ? `\n> ${ctx}\n` : ""; + const found = inlineCode(it.bad); + const ctx = shortContext(it.context); const sug = (it.replacements && it.replacements.length) - ? `\nSuggested: ${it.replacements.map(s => `\`${s}\``).join(", ")}\n` + ? `Suggested: ${it.replacements.map(s => `\`${inlineCode(s)}\``).join(", ")}\n` : ""; - body += `\n- **${it.rule || "RULE"}**: ${it.message}${sug}${snippet}`; + body += + `- **${inlineCode(it.rule || "RULE")}**: ${inlineCode(it.message)} + - Found: \`${found}\` + - ${sug ? sug.trimEnd() : "Suggested: (none)"} + - Context: ${ctx ? `> ${ctx}` : "(none)"} + + `; } - if (issues.length > 200) body += `\n…(${issues.length - 200} more in this file)\n`; + if (issues.length > 200) body += `…(${issues.length - 200} more in this file)\n\n`; + body += `
\n`; } } From 1f7a335973b6cdb3194cde890cc8128006c21218 Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 15 Jan 2026 18:56:44 +0100 Subject: [PATCH 16/29] Configure Dependabot for npm updates Specify npm as the package ecosystem and allow updates for astro and @astrojs/starlight dependencies. --- .github/dependabot.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..ca89712e --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + allow: + - dependency-name: "astro" + - dependency-name: "@astrojs/starlight" From d24353fa1dc16815d29bee0ad40f081d89dce4f6 Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 15 Jan 2026 19:51:08 +0100 Subject: [PATCH 17/29] Change Dependabot update interval to monthly --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ca89712e..d0febe6f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,7 +7,7 @@ updates: - package-ecosystem: "npm" directory: "/" schedule: - interval: "weekly" + interval: "monthly" allow: - dependency-name: "astro" - dependency-name: "@astrojs/starlight" From 259bf69272270a89736684b4e045f13f1b7f2886 Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 15 Jan 2026 20:16:32 +0100 Subject: [PATCH 18/29] Refactor LanguageTool workflow for reviewdog integration --- .github/workflows/languagetool.yml | 304 ++--------------------------- 1 file changed, 12 insertions(+), 292 deletions(-) diff --git a/.github/workflows/languagetool.yml b/.github/workflows/languagetool.yml index 5a842a30..307462d4 100644 --- a/.github/workflows/languagetool.yml +++ b/.github/workflows/languagetool.yml @@ -1,295 +1,15 @@ -# .github/workflows/languagetool.yml -name: LanguageTool (PR comment) - -on: - pull_request_target: - types: [opened, reopened, synchronize, labeled] - issue_comment: - types: [created] - -permissions: - contents: read - pull-requests: write - issues: write - -concurrency: - group: languagetool-${{ github.event.pull_request.number || github.event.issue.number || github.run_id }} - cancel-in-progress: true - -env: - LT_LANGUAGE: en-US - RERUN_LABEL: languagetool:rerun - +name: reviewdog +on: [pull_request] jobs: - # Comment command -> toggles a label to trigger the PR job - rerun_on_comment: - if: | - github.event_name == 'issue_comment' && - github.event.issue.pull_request && - startsWith(github.event.comment.body, '/languagetool') && - (github.event.comment.author_association == 'MEMBER' || - github.event.comment.author_association == 'OWNER' || - github.event.comment.author_association == 'COLLABORATOR') + linter_name: + name: LanguageTool grammar check runs-on: ubuntu-latest steps: - - name: Toggle rerun label on PR - uses: actions/github-script@v7 - with: - script: | - const owner = context.repo.owner; - const repo = context.repo.repo; - const issue_number = context.issue.number; - const label = process.env.RERUN_LABEL; - - // Ensure label exists - try { - await github.rest.issues.getLabel({ owner, repo, name: label }); - } catch { - await github.rest.issues.createLabel({ - owner, repo, name: label, color: '0e8a16', - description: 'Rerun LanguageTool on this PR' - }); - } - - // Remove if present (ignore errors), then add to force a new "labeled" event - try { - await github.rest.issues.removeLabel({ owner, repo, issue_number, name: label }); - } catch {} - await github.rest.issues.addLabels({ owner, repo, issue_number, labels: [label] }); - - languagetool: - if: | - github.event_name == 'pull_request_target' && - ( - github.event.action == 'opened' || - github.event.action == 'reopened' || - github.event.action == 'synchronize' || - (github.event.action == 'labeled' && github.event.label.name == 'languagetool:rerun') - ) - runs-on: ubuntu-latest - - steps: - - name: Checkout PR head (safe) - uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 0 - persist-credentials: false - - - name: Fetch base SHA for diff - run: | - set -euo pipefail - git remote add upstream "https://github.com/${{ github.event.pull_request.base.repo.full_name }}.git" || true - git fetch --no-tags --depth=1 upstream "${{ github.event.pull_request.base.sha }}" - - - name: Setup Java 17 - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: "17" - - - name: Download LanguageTool CLI (latest snapshot) - run: | - set -euo pipefail - curl -fsSL -o lt.zip "https://internal1.languagetool.org/snapshots/LanguageTool-latest-snapshot.zip" - rm -rf .lt - mkdir -p .lt - unzip -q lt.zip -d .lt - - LT_JAR="$(ls -1 .lt/**/languagetool-commandline.jar 2>/dev/null | head -n1 || true)" - if [ -z "${LT_JAR}" ]; then - echo "Could not find languagetool-commandline.jar in snapshot" >&2 - find .lt -maxdepth 4 -type f -name "*languagetool*jar" -print >&2 || true - exit 1 - fi - - echo "LT_JAR=${LT_JAR}" >> "$GITHUB_ENV" - - - name: Run LanguageTool + build PR comment (collapsible + exact word) - env: - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - run: | - set -euo pipefail - - # jq is present on ubuntu-latest, but install if your runner image differs - command -v jq >/dev/null || (sudo apt-get update && sudo apt-get install -y jq) - - # Choose files to check - mapfile -t FILES < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA" \ - | grep -E '\.(md|mdx|txt|rst|adoc|asciidoc|tex)$' || true) - - # Load custom words (optional) - WORDS_FILE=".languagetool/words.txt" - if [ -f "$WORDS_FILE" ]; then - WORDS_JSON="$(jq -R -s ' - split("\n") - | map(gsub("\r";"")) - | map(select(length>0 and (startswith("#")|not))) - | map(ascii_downcase) - ' "$WORDS_FILE")" - else - WORDS_JSON='[]' - fi - - : > results.jsonl - - if [ "${#FILES[@]}" -eq 0 ]; then - echo '{"file":"(none)","issues":[]}' >> results.jsonl - else - for f in "${FILES[@]}"; do - [ -f "$f" ] || continue - - # LT can print banner lines; keep JSON only (accepts either { or [) - java -jar "$LT_JAR" -l "${LT_LANGUAGE}" --json "$f" 2>/dev/null \ - | sed -n '/^[{[]/,$p' > lt.json || true - - # Extract issues and filter spelling-ish matches for custom words - jq -c \ - --arg file "$f" \ - --argjson words "$WORDS_JSON" ' - def bad_raw: - (.context.offset // 0) as $o - | (.context.length // 0) as $l - | (.context.text // "") as $t - | ($t[$o:($o+$l)]); - - def badtoken: - (bad_raw - | gsub("^[^[:alnum:]]+|[^[:alnum:]]+$";"") - | ascii_downcase); - - (.matches // []) - | map( - . as $m - | ($m.rule.id // "") as $rid - | ($m.rule.category.id // "") as $cat - | (badtoken) as $bt - | select( - ( (( $cat == "TYPOS") or ($rid|test("MORFOLOGIK";"i")) ) - and (($words|index($bt)) != null) - ) | not - ) - | { - message: ($m.message // "LanguageTool finding"), - rule: $rid, - bad: (bad_raw), - replacements: (($m.replacements // []) | map(.value) | .[0:3]), - context: ($m.context.text // ""), - context_offset: ($m.context.offset // 0), - context_length: ($m.context.length // 0) - } - ) - | {file:$file, issues:.} - ' lt.json >> results.jsonl - done - fi - - # Build markdown body (stored as a file) - collapsible per file - node <<'NODE' - const fs = require("fs"); - - const marker = ""; - const raw = fs.readFileSync("results.jsonl","utf8").trim(); - const lines = raw ? raw.split("\n").filter(Boolean) : []; - const parsed = lines.map(l => JSON.parse(l)); - - const checkedFiles = parsed.map(p => p.file).filter(f => f && f !== "(none)"); - const byFile = parsed - .filter(p => Array.isArray(p.issues) && p.issues.length > 0) - .reduce((acc, p) => { acc[p.file] = p.issues; return acc; }, {}); - - let total = 0; - for (const f of Object.keys(byFile)) total += byFile[f].length; - - function inlineCode(s) { - if (s == null) return ""; - return String(s).replace(/`/g, "\\`").replace(/\n/g, " ").trim(); - } - - function shortContext(text, maxLen=220) { - const t = (text || "").replace(/\s+/g, " ").trim(); - if (t.length <= maxLen) return t; - return t.slice(0, maxLen - 1) + "…"; - } - - let body = - `${marker} - ## LanguageTool report - - **Language:** \`${process.env.LT_LANGUAGE || "en-US"}\` - **Checked files:** ${checkedFiles.length} - **Findings:** ${total} - `; - - if (!checkedFiles.length) { - body += `\nNo supported text files changed in this PR (based on configured extensions).\n`; - } else if (total === 0) { - body += `\n✅ No issues found in the changed text files.\n`; - } else { - body += `\n---\n`; - for (const [file, issues] of Object.entries(byFile)) { - body += `\n
\n${file} — ${issues.length} finding(s)\n\n`; - for (const it of issues.slice(0, 200)) { - const found = inlineCode(it.bad); - const ctx = shortContext(it.context); - const sug = (it.replacements && it.replacements.length) - ? `Suggested: ${it.replacements.map(s => `\`${inlineCode(s)}\``).join(", ")}\n` - : ""; - body += - `- **${inlineCode(it.rule || "RULE")}**: ${inlineCode(it.message)} - - Found: \`${found}\` - - ${sug ? sug.trimEnd() : "Suggested: (none)"} - - Context: ${ctx ? `> ${ctx}` : "(none)"} - - `; - } - if (issues.length > 200) body += `…(${issues.length - 200} more in this file)\n\n`; - body += `
\n`; - } - } - - fs.writeFileSync("comment.md", body.trim() + "\n"); - NODE - - - name: Post or update PR comment - uses: actions/github-script@v7 - with: - script: | - const fs = require('fs'); - const owner = context.repo.owner; - const repo = context.repo.repo; - const issue_number = context.payload.pull_request.number; - - const body = fs.readFileSync('comment.md', 'utf8'); - const marker = ''; - - const { data: comments } = await github.rest.issues.listComments({ - owner, repo, issue_number, per_page: 100 - }); - - const existing = comments.find(c => (c.body || '').includes(marker)); - - if (existing) { - await github.rest.issues.updateComment({ - owner, repo, comment_id: existing.id, body - }); - } else { - await github.rest.issues.createComment({ - owner, repo, issue_number, body - }); - } - - - name: Remove rerun label - if: github.event.action == 'labeled' && github.event.label.name == 'languagetool:rerun' - continue-on-error: true - uses: actions/github-script@v7 - with: - script: | - await github.rest.issues.removeLabel({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.payload.pull_request.number, - name: process.env.RERUN_LABEL, - }); + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: reviewdog/action-languagetool@ea19c757470ce0dbfcbc34aec090317cef1ff0b5 # v1.22.0 + with: + github_token: ${{ secrets.github_token }} + # Change reviewdog reporter if you need [github-pr-check,github-check,github-pr-review]. + reporter: github-pr-review + # Change reporter level if you need. + level: info From a5900aa00c5fc367529c85ebf292c26118c959ff Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 15 Jan 2026 20:22:48 +0100 Subject: [PATCH 19/29] Update languagetool.yml --- .github/workflows/languagetool.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/languagetool.yml b/.github/workflows/languagetool.yml index 307462d4..3ce298f1 100644 --- a/.github/workflows/languagetool.yml +++ b/.github/workflows/languagetool.yml @@ -13,3 +13,4 @@ jobs: reporter: github-pr-review # Change reporter level if you need. level: info + patterns: "**/*.md **/*.mdx **/*.txt" From c22aacd228fad6eed288b631f7184e1761860ea6 Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Mon, 19 Jan 2026 21:41:27 +0100 Subject: [PATCH 20/29] Update GitHub Actions workflow for grammar checks harper --- .github/workflows/languagetool.yml | 92 ++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 12 deletions(-) diff --git a/.github/workflows/languagetool.yml b/.github/workflows/languagetool.yml index 3ce298f1..9666f661 100644 --- a/.github/workflows/languagetool.yml +++ b/.github/workflows/languagetool.yml @@ -1,16 +1,84 @@ -name: reviewdog -on: [pull_request] +name: Harper (grammar suggestions) + +on: + pull_request: + +permissions: + contents: read + pull-requests: write + jobs: - linter_name: - name: LanguageTool grammar check + harper: runs-on: ubuntu-latest + steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: reviewdog/action-languagetool@ea19c757470ce0dbfcbc34aec090317cef1ff0b5 # v1.22.0 + - uses: actions/checkout@v4 with: - github_token: ${{ secrets.github_token }} - # Change reviewdog reporter if you need [github-pr-check,github-check,github-pr-review]. - reporter: github-pr-review - # Change reporter level if you need. - level: info - patterns: "**/*.md **/*.mdx **/*.txt" + fetch-depth: 0 + + - name: Install Harper + run: | + curl -fsSL https://raw.githubusercontent.com/automattic/harper/main/install.sh | sh + echo "$HOME/.harper/bin" >> $GITHUB_PATH + + - name: Run Harper on changed md/mdx + id: harper + run: | + set -euo pipefail + + mapfile -t FILES < <( + git diff --name-only origin/${{ github.base_ref }}...${{ github.sha }} \ + -- '*.md' '*.mdx' || true + ) + + if [ ${#FILES[@]} -eq 0 ]; then + echo "No markdown files changed." > harper.txt + exit 0 + fi + + { + echo "## Harper grammar suggestions" + echo + for f in "${FILES[@]}"; do + [ -f "$f" ] || continue + echo "### $f" + harper "$f" || true + echo + done + } > harper.txt + + - name: Post PR comment + uses: actions/github-script@v7 + with: + script: | + const fs = require("fs"); + const body = fs.readFileSync("harper.txt", "utf8").trim(); + + const marker = ""; + const commentBody = `${marker}\n${body || "No issues found."}`; + + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + const existing = comments.find(c => + c.body && c.body.includes(marker) + ); + + if (existing) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing.id, + body: commentBody, + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: commentBody, + }); + } From 8d6076464a2458dfc873d0a0a24b0368bef8984c Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Wed, 21 Jan 2026 19:55:21 +0100 Subject: [PATCH 21/29] Update and rename languagetool.yml to checkspelling.yml --- .github/workflows/checkspelling.yml | 154 ++++++++++++++++++++++++++++ .github/workflows/languagetool.yml | 84 --------------- 2 files changed, 154 insertions(+), 84 deletions(-) create mode 100644 .github/workflows/checkspelling.yml delete mode 100644 .github/workflows/languagetool.yml diff --git a/.github/workflows/checkspelling.yml b/.github/workflows/checkspelling.yml new file mode 100644 index 00000000..d8ec2885 --- /dev/null +++ b/.github/workflows/checkspelling.yml @@ -0,0 +1,154 @@ +name: Harper (grammar + spelling) + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + +permissions: + contents: read + pull-requests: write + +jobs: + harper: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache Cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Install harper-cli + run: | + cargo install --locked --git https://github.com/Automattic/harper.git harper-cli + + - name: Write Harper dictionary + env: + XDG_CONFIG_HOME: ${{ github.workspace }}/.xdg + run: | + mkdir -p "$XDG_CONFIG_HOME/harper-ls" + cat > "$XDG_CONFIG_HOME/harper-ls/dictionary.txt" <<'EOF' + AerynOS + astrojs + sha256sum + SHA256 + certutil + hashfile + lastUpdated + EOF + + - name: Run Harper on PR-changed files + id: harper + env: + XDG_CONFIG_HOME: ${{ github.workspace }}/.xdg + run: | + set -euo pipefail + + BASE="${{ github.event.pull_request.base.sha }}" + HEAD="${{ github.event.pull_request.head.sha }}" + + mapfile -t FILES < <(git diff --name-only "$BASE" "$HEAD" -- \ + '*.md' '*.mdx' '*.txt' || true) + + : > harper-report.txt + + if [ "${#FILES[@]}" -eq 0 ]; then + echo "No matching files changed (.md/.mdx/.txt)." > harper-report.txt + echo "fail=0" >> "$GITHUB_OUTPUT" + exit 0 + fi + + fail=0 + for f in "${FILES[@]}"; do + if [ ! -f "$f" ]; then + continue + fi + + echo "===== $f =====" >> harper-report.txt + echo >> harper-report.txt + + out="$(harper-cli lint "$f" || true)" + echo "$out" >> harper-report.txt + echo >> harper-report.txt + + after="$(printf '%s\n' "$out" | sed -n 's/.*after overlap removal, \([0-9]\+\) after.*/\1/p' | tail -n 1)" + after="${after:-0}" + + if [ "$after" -ne 0 ]; then + fail=1 + fi + done + + echo "fail=$fail" >> "$GITHUB_OUTPUT" + + - name: Comment on PR with Harper output + if: github.event.pull_request + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + + const raw = fs.readFileSync('harper-report.txt', 'utf8'); + + const limit = 65000; + const clipped = + raw.length > limit + ? raw.slice(0, limit) + "\n\n[truncated]\n" + : raw; + + const marker = ''; + const body = + `${marker}\n` + + `
\n` + + `Harper output\n\n` + + "```text\n" + + clipped + + "\n```\n" + + `
\n`; + + const { owner, repo } = context.repo; + const issue_number = context.issue.number; + + const comments = await github.rest.issues.listComments({ + owner, + repo, + issue_number, + }); + + const existing = comments.data.find(c => + c.body && c.body.includes(marker) + ); + + if (existing) { + await github.rest.issues.updateComment({ + owner, + repo, + comment_id: existing.id, + body, + }); + } else { + await github.rest.issues.createComment({ + owner, + repo, + issue_number, + body, + }); + } + + - name: Fail if Harper found issues + if: steps.harper.outputs.fail == '1' + run: exit 1 diff --git a/.github/workflows/languagetool.yml b/.github/workflows/languagetool.yml deleted file mode 100644 index 9666f661..00000000 --- a/.github/workflows/languagetool.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: Harper (grammar suggestions) - -on: - pull_request: - -permissions: - contents: read - pull-requests: write - -jobs: - harper: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Install Harper - run: | - curl -fsSL https://raw.githubusercontent.com/automattic/harper/main/install.sh | sh - echo "$HOME/.harper/bin" >> $GITHUB_PATH - - - name: Run Harper on changed md/mdx - id: harper - run: | - set -euo pipefail - - mapfile -t FILES < <( - git diff --name-only origin/${{ github.base_ref }}...${{ github.sha }} \ - -- '*.md' '*.mdx' || true - ) - - if [ ${#FILES[@]} -eq 0 ]; then - echo "No markdown files changed." > harper.txt - exit 0 - fi - - { - echo "## Harper grammar suggestions" - echo - for f in "${FILES[@]}"; do - [ -f "$f" ] || continue - echo "### $f" - harper "$f" || true - echo - done - } > harper.txt - - - name: Post PR comment - uses: actions/github-script@v7 - with: - script: | - const fs = require("fs"); - const body = fs.readFileSync("harper.txt", "utf8").trim(); - - const marker = ""; - const commentBody = `${marker}\n${body || "No issues found."}`; - - const { data: comments } = await github.rest.issues.listComments({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - }); - - const existing = comments.find(c => - c.body && c.body.includes(marker) - ); - - if (existing) { - await github.rest.issues.updateComment({ - owner: context.repo.owner, - repo: context.repo.repo, - comment_id: existing.id, - body: commentBody, - }); - } else { - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body: commentBody, - }); - } From 99404df22addcee89425910a60c1386573fe2b8d Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 22 Jan 2026 13:26:20 +0100 Subject: [PATCH 22/29] Update checkspelling.yml --- .github/workflows/checkspelling.yml | 175 +++++++--------------------- 1 file changed, 40 insertions(+), 135 deletions(-) diff --git a/.github/workflows/checkspelling.yml b/.github/workflows/checkspelling.yml index d8ec2885..6c9ad261 100644 --- a/.github/workflows/checkspelling.yml +++ b/.github/workflows/checkspelling.yml @@ -1,154 +1,59 @@ -name: Harper (grammar + spelling) +# .github/workflows/grammar.yml +name: Grammar Check (PR Changes Only) on: pull_request: - types: [opened, synchronize, reopened, ready_for_review] - -permissions: - contents: read - pull-requests: write jobs: - harper: + grammar: runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 + - uses: actions/checkout@v3 + + - name: Get changed markdown files + id: changed + uses: tj-actions/changed-files@v39 with: - fetch-depth: 0 + files: | + **/*.md + **/*.mdx - - name: Set up Rust - uses: dtolnay/rust-toolchain@stable + - name: Skip if no docs changed + if: steps.changed.outputs.any_changed != 'true' + run: echo "No .md or .mdx files changed." - - name: Cache Cargo - uses: actions/cache@v4 + - name: Set up Node + if: steps.changed.outputs.any_changed == 'true' + uses: actions/setup-node@v3 with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo- + node-version: 18 - - name: Install harper-cli + - name: Install MDX cleaner + if: steps.changed.outputs.any_changed == 'true' run: | - cargo install --locked --git https://github.com/Automattic/harper.git harper-cli + npm install remark remark-mdx strip-markdown + mkdir -p dist + for file in ${{ steps.changed.outputs.all_changed_files }}; do + node scripts/clean-mdx.js "$file" > "dist/${file//\//_}.txt" + done - - name: Write Harper dictionary - env: - XDG_CONFIG_HOME: ${{ github.workspace }}/.xdg + - name: Download LanguageTool CLI + if: steps.changed.outputs.any_changed == 'true' run: | - mkdir -p "$XDG_CONFIG_HOME/harper-ls" - cat > "$XDG_CONFIG_HOME/harper-ls/dictionary.txt" <<'EOF' - AerynOS - astrojs - sha256sum - SHA256 - certutil - hashfile - lastUpdated - EOF + curl -L -o lt.zip https://languagetool.org/download/LanguageTool-stable.zip + unzip lt.zip + echo "LT_PATH=$(pwd)/LanguageTool-*/languagetool-commandline.jar" >> $GITHUB_ENV - - name: Run Harper on PR-changed files - id: harper + - name: Run LanguageTool with reviewdog + if: steps.changed.outputs.any_changed == 'true' env: - XDG_CONFIG_HOME: ${{ github.workspace }}/.xdg + REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - set -euo pipefail - - BASE="${{ github.event.pull_request.base.sha }}" - HEAD="${{ github.event.pull_request.head.sha }}" - - mapfile -t FILES < <(git diff --name-only "$BASE" "$HEAD" -- \ - '*.md' '*.mdx' '*.txt' || true) - - : > harper-report.txt - - if [ "${#FILES[@]}" -eq 0 ]; then - echo "No matching files changed (.md/.mdx/.txt)." > harper-report.txt - echo "fail=0" >> "$GITHUB_OUTPUT" - exit 0 - fi - - fail=0 - for f in "${FILES[@]}"; do - if [ ! -f "$f" ]; then - continue - fi - - echo "===== $f =====" >> harper-report.txt - echo >> harper-report.txt - - out="$(harper-cli lint "$f" || true)" - echo "$out" >> harper-report.txt - echo >> harper-report.txt - - after="$(printf '%s\n' "$out" | sed -n 's/.*after overlap removal, \([0-9]\+\) after.*/\1/p' | tail -n 1)" - after="${after:-0}" - - if [ "$after" -ne 0 ]; then - fail=1 - fi + for f in dist/*.txt; do + java -jar $LT_PATH -l en-US "$f" | + reviewdog -efm="%f: Line %l: %m" \ + -name="LanguageTool" \ + -reporter=github-pr-review \ + -filter-mode=added \ + -fail-on-error=false done - - echo "fail=$fail" >> "$GITHUB_OUTPUT" - - - name: Comment on PR with Harper output - if: github.event.pull_request - uses: actions/github-script@v7 - with: - script: | - const fs = require('fs'); - - const raw = fs.readFileSync('harper-report.txt', 'utf8'); - - const limit = 65000; - const clipped = - raw.length > limit - ? raw.slice(0, limit) + "\n\n[truncated]\n" - : raw; - - const marker = ''; - const body = - `${marker}\n` + - `
\n` + - `Harper output\n\n` + - "```text\n" + - clipped + - "\n```\n" + - `
\n`; - - const { owner, repo } = context.repo; - const issue_number = context.issue.number; - - const comments = await github.rest.issues.listComments({ - owner, - repo, - issue_number, - }); - - const existing = comments.data.find(c => - c.body && c.body.includes(marker) - ); - - if (existing) { - await github.rest.issues.updateComment({ - owner, - repo, - comment_id: existing.id, - body, - }); - } else { - await github.rest.issues.createComment({ - owner, - repo, - issue_number, - body, - }); - } - - - name: Fail if Harper found issues - if: steps.harper.outputs.fail == '1' - run: exit 1 From 75c9b31b51df9f3cec25d1b7936bf00c9ab4160a Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 22 Jan 2026 13:27:15 +0100 Subject: [PATCH 23/29] Update and rename languagetool_reviewdog.py to clean-mdx.js --- .github/scripts/clean-mdx.js | 19 +++ .github/scripts/languagetool_reviewdog.py | 185 ---------------------- 2 files changed, 19 insertions(+), 185 deletions(-) create mode 100644 .github/scripts/clean-mdx.js delete mode 100644 .github/scripts/languagetool_reviewdog.py diff --git a/.github/scripts/clean-mdx.js b/.github/scripts/clean-mdx.js new file mode 100644 index 00000000..6fe3a3fa --- /dev/null +++ b/.github/scripts/clean-mdx.js @@ -0,0 +1,19 @@ +// scripts/clean-mdx.js +import fs from 'fs/promises'; +import { remark } from 'remark'; +import remarkMdx from 'remark-mdx'; +import strip from 'strip-markdown'; + +const filePath = process.argv[2]; +if (!filePath) { + console.error('No file path provided.'); + process.exit(1); +} + +const mdx = await fs.readFile(filePath, 'utf8'); +const file = await remark() + .use(remarkMdx) + .use(strip) + .process(mdx); + +console.log(String(file)); diff --git a/.github/scripts/languagetool_reviewdog.py b/.github/scripts/languagetool_reviewdog.py deleted file mode 100644 index 050dc37e..00000000 --- a/.github/scripts/languagetool_reviewdog.py +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import json -import os -import re -import subprocess -from typing import Dict, List, Optional, Set, Tuple - -import requests - - -def sh(*args: str) -> str: - return subprocess.check_output(args, text=True).strip() - - -def offset_to_line_col(text: str, offset: int) -> Tuple[int, int]: - # reviewdog wants 1-based line/column - line = text.count("\n", 0, offset) + 1 - last_nl = text.rfind("\n", 0, offset) - col = offset - (last_nl + 1) + 1 - return line, col - - -def normalize_word(s: str) -> str: - s = re.sub(r"^[\W_]+|[\W_]+$", "", s, flags=re.UNICODE) - return s.lower() - - -def load_dictionary(path: str) -> Set[str]: - if not path or not os.path.exists(path): - return set() - words: Set[str] = set() - with open(path, "r", encoding="utf-8") as f: - for line in f: - line = line.strip() - if not line or line.startswith("#"): - continue - words.add(line.lower()) - return words - - -def changed_files(base_sha: str, head_sha: str) -> List[str]: - # list only changed files in the PR - out = sh("git", "diff", "--name-only", base_sha, head_sha) - files = [x.strip() for x in out.splitlines() if x.strip()] - return files - - -def is_text_file(path: str) -> bool: - ext = os.path.splitext(path)[1].lower() - return ext in {".md", ".txt", ".rst", ".adoc", ".asciidoc", ".tex"} or os.path.basename(path).lower() in { - "readme", "readme.md", "readme.txt" - } - - -def lt_check(api_url: str, language: str, text: str) -> Dict: - resp = requests.post( - api_url, - data={ - "language": language, - "text": text, - }, - timeout=60, - ) - resp.raise_for_status() - return resp.json() - - -def main() -> int: - ap = argparse.ArgumentParser() - ap.add_argument("--api-url", required=True) - ap.add_argument("--language", required=True) - ap.add_argument("--base-sha", required=True) - ap.add_argument("--head-sha", required=True) - ap.add_argument("--dictionary", default=".languagetool/words.txt") - ap.add_argument("--max-suggestions", type=int, default=3) - args = ap.parse_args() - - dict_words = load_dictionary(args.dictionary) - - files = changed_files(args.base_sha, args.head_sha) - files = [f for f in files if os.path.exists(f) and is_text_file(f)] - - diagnostics: List[Dict] = [] - - for path in files: - try: - with open(path, "r", encoding="utf-8") as f: - content = f.read() - except UnicodeDecodeError: - with open(path, "r", encoding="utf-8", errors="replace") as f: - content = f.read() - - if not content.strip(): - continue - - try: - result = lt_check(args.api_url, args.language, content) - except Exception as e: - # Emit a single diagnostic if the API call fails for a file - diagnostics.append( - { - "message": f"LanguageTool API error for {path}: {e}", - "location": {"path": path, "range": {"start": {"line": 1, "column": 1}}}, - "severity": "WARNING", - } - ) - continue - - matches = result.get("matches", []) - for m in matches: - offset = int(m.get("offset", 0)) - length = int(m.get("length", 0)) - bad = content[offset : offset + length] - - rule = m.get("rule", {}) or {} - rule_id = rule.get("id") or "UNKNOWN_RULE" - category = (rule.get("category", {}) or {}).get("id", "") - - # Cheap custom dictionary support without modifying LT server: - # if LT reports a spelling/typo-ish issue AND the token is in our dictionary -> ignore it. - # (Most spelling problems show up in category TYPOS and/or rule ids containing MORFOLOGIK.) - bad_norm = normalize_word(bad) - if dict_words and bad_norm: - looks_like_spelling = (category.upper() == "TYPOS") or ("MORFOLOGIK" in str(rule_id).upper()) - if looks_like_spelling and (bad_norm in dict_words): - continue - - start_line, start_col = offset_to_line_col(content, offset) - end_line, end_col = offset_to_line_col(content, offset + max(length, 0)) - - # Suggestions (as rdjson "suggestions" with ranges) - suggestions = [] - repls = m.get("replacements", []) or [] - for r in repls[: args.max_suggestions]: - val = r.get("value") - if not val: - continue - suggestions.append( - { - "range": { - "start": {"line": start_line, "column": start_col}, - "end": {"line": end_line, "column": end_col}, - }, - "text": val, - } - ) - - code = {"value": rule_id} - urls = rule.get("urls") or [] - if urls and isinstance(urls, list): - u = urls[0].get("value") - if u: - code["url"] = u - - diagnostics.append( - { - "message": m.get("message") or "LanguageTool finding", - "location": { - "path": path, - "range": { - "start": {"line": start_line, "column": start_col}, - "end": {"line": end_line, "column": end_col}, - }, - }, - "severity": "WARNING", - "code": code, - **({"suggestions": suggestions} if suggestions else {}), - } - ) - - rdjson = { - "source": { - "name": "LanguageTool", - "url": "https://languagetool.org", - }, - "diagnostics": diagnostics, - } - - print(json.dumps(rdjson)) - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) From f8da8edc0731a15ee2446895861e20f5b0b126ee Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 22 Jan 2026 13:30:58 +0100 Subject: [PATCH 24/29] Update checkspelling.yml --- .github/workflows/checkspelling.yml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/checkspelling.yml b/.github/workflows/checkspelling.yml index 6c9ad261..99df086e 100644 --- a/.github/workflows/checkspelling.yml +++ b/.github/workflows/checkspelling.yml @@ -1,4 +1,3 @@ -# .github/workflows/grammar.yml name: Grammar Check (PR Changes Only) on: @@ -7,6 +6,7 @@ on: jobs: grammar: runs-on: ubuntu-latest + steps: - uses: actions/checkout@v3 @@ -18,9 +18,9 @@ jobs: **/*.md **/*.mdx - - name: Skip if no docs changed + - name: Skip if no .md/.mdx files changed if: steps.changed.outputs.any_changed != 'true' - run: echo "No .md or .mdx files changed." + run: echo "No markdown or MDX files changed." - name: Set up Node if: steps.changed.outputs.any_changed == 'true' @@ -28,13 +28,18 @@ jobs: with: node-version: 18 - - name: Install MDX cleaner + - name: Install MDX cleaner dependencies + if: steps.changed.outputs.any_changed == 'true' + run: npm install remark remark-mdx strip-markdown + + - name: Extract prose from changed docs if: steps.changed.outputs.any_changed == 'true' run: | - npm install remark remark-mdx strip-markdown mkdir -p dist for file in ${{ steps.changed.outputs.all_changed_files }}; do - node scripts/clean-mdx.js "$file" > "dist/${file//\//_}.txt" + if [[ "$file" == *.md || "$file" == *.mdx ]]; then + node .github/scripts/clean-mdx.js "$file" > "dist/${file//\//_}.txt" + fi done - name: Download LanguageTool CLI From 9debc3d5dfb53460fb0679565ae5012e44cf2fc6 Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 22 Jan 2026 13:33:35 +0100 Subject: [PATCH 25/29] Update checkspelling.yml --- .github/workflows/checkspelling.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/checkspelling.yml b/.github/workflows/checkspelling.yml index 99df086e..fa2ef14c 100644 --- a/.github/workflows/checkspelling.yml +++ b/.github/workflows/checkspelling.yml @@ -49,6 +49,10 @@ jobs: unzip lt.zip echo "LT_PATH=$(pwd)/LanguageTool-*/languagetool-commandline.jar" >> $GITHUB_ENV + - name: Install reviewdog + if: steps.changed.outputs.any_changed == 'true' + uses: reviewdog/action-install@v1 + - name: Run LanguageTool with reviewdog if: steps.changed.outputs.any_changed == 'true' env: From 1ec129de25049a53d598872b8899b625cee82d02 Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 22 Jan 2026 13:35:31 +0100 Subject: [PATCH 26/29] Update checkspelling.yml --- .github/workflows/checkspelling.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/checkspelling.yml b/.github/workflows/checkspelling.yml index fa2ef14c..557ace24 100644 --- a/.github/workflows/checkspelling.yml +++ b/.github/workflows/checkspelling.yml @@ -51,8 +51,8 @@ jobs: - name: Install reviewdog if: steps.changed.outputs.any_changed == 'true' - uses: reviewdog/action-install@v1 - + uses: reviewdog/action-setup@v1 + - name: Run LanguageTool with reviewdog if: steps.changed.outputs.any_changed == 'true' env: From ec5b21f2fc6282cfdfddce164edbe73924df3397 Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 22 Jan 2026 13:40:18 +0100 Subject: [PATCH 27/29] Create languagetool-json-to-reviewdog.js --- .../scripts/languagetool-json-to-reviewdog.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/scripts/languagetool-json-to-reviewdog.js diff --git a/.github/scripts/languagetool-json-to-reviewdog.js b/.github/scripts/languagetool-json-to-reviewdog.js new file mode 100644 index 00000000..6260ef3d --- /dev/null +++ b/.github/scripts/languagetool-json-to-reviewdog.js @@ -0,0 +1,18 @@ +// Converts LanguageTool JSON output to reviewdog format +import fs from 'fs'; + +const [,, jsonFile, filename] = process.argv; + +if (!jsonFile || !filename) { + console.error('Usage: node script.js '); + process.exit(1); +} + +const raw = fs.readFileSync(jsonFile, 'utf-8'); +const data = JSON.parse(raw); + +for (const match of data.matches) { + const line = match.context.offset !== undefined ? match.context.line || 0 : 0; + const message = match.message.replace(/\n/g, ' '); + console.log(`${filename}: Line ${line + 1}: ${message}`); +} From b56ba2a9d30346bc9a021ef86139f3be789c75b3 Mon Sep 17 00:00:00 2001 From: Alice <36531905+CookieSource@users.noreply.github.com> Date: Thu, 22 Jan 2026 13:40:32 +0100 Subject: [PATCH 28/29] Update checkspelling.yml --- .github/workflows/checkspelling.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/checkspelling.yml b/.github/workflows/checkspelling.yml index 557ace24..c36f6646 100644 --- a/.github/workflows/checkspelling.yml +++ b/.github/workflows/checkspelling.yml @@ -28,9 +28,10 @@ jobs: with: node-version: 18 - - name: Install MDX cleaner dependencies + - name: Install dependencies for MDX and parser if: steps.changed.outputs.any_changed == 'true' - run: npm install remark remark-mdx strip-markdown + run: | + npm install remark remark-mdx strip-markdown - name: Extract prose from changed docs if: steps.changed.outputs.any_changed == 'true' @@ -51,15 +52,17 @@ jobs: - name: Install reviewdog if: steps.changed.outputs.any_changed == 'true' - uses: reviewdog/action-setup@v1 - - - name: Run LanguageTool with reviewdog + uses: reviewdog/action-setup@v1 + + - name: Run LanguageTool and parse to reviewdog format if: steps.changed.outputs.any_changed == 'true' env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | for f in dist/*.txt; do - java -jar $LT_PATH -l en-US "$f" | + OUT="dist/$(basename "$f").json" + java -jar $LT_PATH -l en-US --json "$f" > "$OUT" + node .github/scripts/languagetool-json-to-reviewdog.js "$OUT" "$f" | reviewdog -efm="%f: Line %l: %m" \ -name="LanguageTool" \ -reporter=github-pr-review \ From 164d9ef7e7bb5fbf0ad64c8f9fc3f14e389a4e83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 09:39:12 +0000 Subject: [PATCH 29/29] Bump astro from 5.16.8 to 5.17.1 Bumps [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) from 5.16.8 to 5.17.1. - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/astro@5.17.1/packages/astro) --- updated-dependencies: - dependency-name: astro dependency-version: 5.17.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 99 +- package.json | 2 +- pnpm-lock.yaml | 3541 +++++++++++++++++++++++++-------------------- 3 files changed, 2055 insertions(+), 1587 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9172aa55..d4bbe71b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.1", "dependencies": { "@astrojs/starlight": "^0.37.2", - "astro": "^5.16.8", + "astro": "^5.17.1", "sharp": "^0.34.5", "starlight-kbd": "^0.3.0", "starlight-links-validator": "^0.19.2", @@ -2095,9 +2095,9 @@ } }, "node_modules/astro": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.8.tgz", - "integrity": "sha512-gzZE+epuCrNuxOa8/F1dzkllDOFvxWhGeobQKeBRIAef5sUpUKMHZo/8clse+02rYnKJCgwXBgjW4uTu9mqUUw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.17.1.tgz", + "integrity": "sha512-oD3tlxTaVWGq/Wfbqk6gxzVRz98xa/rYlpe+gU2jXJMSD01k6sEDL01ZlT8mVSYB/rMgnvIOfiQQ3BbLdN237A==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.0", @@ -2118,8 +2118,8 @@ "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", - "devalue": "^5.6.1", - "diff": "^5.2.0", + "devalue": "^5.6.2", + "diff": "^8.0.3", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", @@ -2144,16 +2144,16 @@ "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", - "shiki": "^3.20.0", + "shiki": "^3.21.0", "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", - "unifont": "~0.7.1", + "unifont": "~0.7.3", "unist-util-visit": "^5.0.0", - "unstorage": "^1.17.3", + "unstorage": "^1.17.4", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", @@ -2533,15 +2533,15 @@ } }, "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -3011,9 +3011,9 @@ } }, "node_modules/devalue": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", - "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", + "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", "license": "MIT" }, "node_modules/devlop": { @@ -3037,9 +3037,9 @@ "license": "BSD-3-Clause" }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -3652,9 +3652,9 @@ "license": "ISC" }, "node_modules/h3": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", - "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.5.tgz", + "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", "license": "MIT", "dependencies": { "cookie-es": "^1.2.2", @@ -3662,9 +3662,9 @@ "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.2", + "node-mock-http": "^1.0.4", "radix3": "^1.1.2", - "ufo": "^1.6.1", + "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, @@ -6082,12 +6082,12 @@ "license": "MIT" }, "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -7112,9 +7112,9 @@ } }, "node_modules/ufo": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.2.tgz", - "integrity": "sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "license": "MIT" }, "node_modules/ultrahtml": { @@ -7166,9 +7166,9 @@ } }, "node_modules/unifont": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.1.tgz", - "integrity": "sha512-0lg9M1cMYvXof8//wZBq6EDEfbwv4++t7+dYpXeS2ypaLuZJmUFYEwTm412/1ED/Wfo/wyzSu6kNZEr9hgRNfg==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.3.tgz", + "integrity": "sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA==", "license": "MIT", "dependencies": { "css-tree": "^3.1.0", @@ -7313,19 +7313,19 @@ } }, "node_modules/unstorage": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.3.tgz", - "integrity": "sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "license": "MIT", "dependencies": { "anymatch": "^3.1.3", - "chokidar": "^4.0.3", + "chokidar": "^5.0.0", "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", - "ufo": "^1.6.1" + "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -7334,14 +7334,14 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", + "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", @@ -7409,10 +7409,13 @@ } }, "node_modules/unstorage/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/util-deprecate": { "version": "1.0.2", diff --git a/package.json b/package.json index a4baae13..c0855eba 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/starlight": "^0.37.2", - "astro": "^5.16.8", + "astro": "^5.17.1", "sharp": "^0.34.5", "starlight-kbd": "^0.3.0", "starlight-links-validator": "^0.19.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53122409..c05c15ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,400 +9,460 @@ importers: .: dependencies: '@astrojs/starlight': - specifier: ^0.32.0 - version: 0.32.0(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0)) + specifier: ^0.37.2 + version: 0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)) astro: - specifier: ^5.1.5 - version: 5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0) + specifier: ^5.17.1 + version: 5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2) sharp: - specifier: ^0.32.5 - version: 0.32.6 + specifier: ^0.34.5 + version: 0.34.5 + starlight-kbd: + specifier: ^0.3.0 + version: 0.3.0(@astrojs/starlight@0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2))) starlight-links-validator: - specifier: ^0.18.0 - version: 0.18.0(@astrojs/starlight@0.32.0(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0))) + specifier: ^0.19.2 + version: 0.19.2(@astrojs/starlight@0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)))(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)) + starlight-scroll-to-top: + specifier: ^0.4.0 + version: 0.4.0(@astrojs/starlight@0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2))) yaml: - specifier: ^2.7.0 - version: 2.7.0 + specifier: ^2.8.2 + version: 2.8.2 + devDependencies: + puppeteer: + specifier: ^23.11.1 + version: 23.11.1(typescript@5.7.3) + puppeteer-autoscroll-down: + specifier: ^2.0.1 + version: 2.0.1 + starlight-to-pdf: + specifier: ^1.4.0 + version: 1.4.0(puppeteer-autoscroll-down@2.0.1)(puppeteer@23.11.1(typescript@5.7.3)) packages: - '@astrojs/compiler@2.10.4': - resolution: {integrity: sha512-86B3QGagP99MvSNwuJGiYSBHnh8nLvm2Q1IFI15wIUJJsPeQTO3eb2uwBmrqRsXykeR/mBzH8XCgz5AAt1BJrQ==} + '@astrojs/compiler@2.13.0': + resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} - '@astrojs/internal-helpers@0.5.1': - resolution: {integrity: sha512-M7rAge1n2+aOSxNvKUFa0u/KFn0W+sZy7EW91KOSERotm2Ti8qs+1K0xx3zbOxtAVrmJb5/J98eohVvvEqtNkw==} + '@astrojs/internal-helpers@0.7.5': + resolution: {integrity: sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==} - '@astrojs/markdown-remark@6.1.0': - resolution: {integrity: sha512-emZNNSTPGgPc3V399Cazpp5+snogjaF04ocOSQn9vy3Kw/eIC4vTQjXOrWDEoSEy+AwPDZX9bQ4wd3bxhpmGgQ==} + '@astrojs/markdown-remark@6.3.10': + resolution: {integrity: sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==} - '@astrojs/mdx@4.0.8': - resolution: {integrity: sha512-/aiLr2yQ55W9AbpyOgfMtFXk7g2t7XoWdC2Avps/NqxAx4aYONDLneX43D79QwgqdjFhin7o3cIPp/vVppMbaA==} - engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} + '@astrojs/mdx@4.3.13': + resolution: {integrity: sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} peerDependencies: astro: ^5.0.0 - '@astrojs/prism@3.2.0': - resolution: {integrity: sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==} - engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} + '@astrojs/prism@3.3.0': + resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} - '@astrojs/sitemap@3.2.1': - resolution: {integrity: sha512-uxMfO8f7pALq0ADL6Lk68UV6dNYjJ2xGUzyjjVj60JLBs5a6smtlkBYv3tQ0DzoqwS7c9n4FUx5lgv0yPo/fgA==} + '@astrojs/sitemap@3.7.0': + resolution: {integrity: sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==} - '@astrojs/starlight@0.32.0': - resolution: {integrity: sha512-RJ+zPeTBlfgZJA3cWl3Nml9RLQhYUupnE0obL3iVxvVKhoCwUJnxmKicPp9EBxSML0TK8X4CUpnEwiC7OtfYwg==} + '@astrojs/starlight@0.37.5': + resolution: {integrity: sha512-+pC2pgy0iR9Ucl1P4CE0jyfsoNKcUSB2RIoBwm4UnyyhtlaEjoSU7MZwa5IJkzS9sBgIbLbLgYVbkC4tHN8rkQ==} peerDependencies: - astro: ^5.1.5 + astro: ^5.5.0 - '@astrojs/telemetry@3.2.0': - resolution: {integrity: sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ==} - engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} + '@astrojs/telemetry@3.3.0': + resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.9': - resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.9': - resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.9': - resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@ctrl/tinycolor@4.1.0': - resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} + '@capsizecss/unpack@4.0.0': + resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} + engines: {node: '>=18'} + + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} engines: {node: '>=14'} - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@expressive-code/core@0.40.2': - resolution: {integrity: sha512-gXY3v7jbgz6nWKvRpoDxK4AHUPkZRuJsM79vHX/5uhV9/qX6Qnctp/U/dMHog/LCVXcuOps+5nRmf1uxQVPb3w==} + '@expressive-code/core@0.41.6': + resolution: {integrity: sha512-FvJQP+hG0jWi/FLBSmvHInDqWR7jNANp9PUDjdMqSshHb0y7sxx3vHuoOr6SgXjWw+MGLqorZyPQ0aAlHEok6g==} + + '@expressive-code/plugin-frames@0.41.6': + resolution: {integrity: sha512-d+hkSYXIQot6fmYnOmWAM+7TNWRv/dhfjMsNq+mIZz8Tb4mPHOcgcfZeEM5dV9TDL0ioQNvtcqQNuzA1sRPjxg==} - '@expressive-code/plugin-frames@0.40.2': - resolution: {integrity: sha512-aLw5IlDlZWb10Jo/TTDCVsmJhKfZ7FJI83Zo9VDrV0OBlmHAg7klZqw68VDz7FlftIBVAmMby53/MNXPnMjTSQ==} + '@expressive-code/plugin-shiki@0.41.6': + resolution: {integrity: sha512-Y6zmKBmsIUtWTzdefqlzm/h9Zz0Rc4gNdt2GTIH7fhHH2I9+lDYCa27BDwuBhjqcos6uK81Aca9dLUC4wzN+ng==} - '@expressive-code/plugin-shiki@0.40.2': - resolution: {integrity: sha512-t2HMR5BO6GdDW1c1ISBTk66xO503e/Z8ecZdNcr6E4NpUfvY+MRje+LtrcvbBqMwWBBO8RpVKcam/Uy+1GxwKQ==} + '@expressive-code/plugin-text-markers@0.41.6': + resolution: {integrity: sha512-PBFa1wGyYzRExMDzBmAWC6/kdfG1oLn4pLpBeTfIRrALPjcGA/59HP3e7q9J0Smk4pC7U+lWkA2LHR8FYV8U7Q==} - '@expressive-code/plugin-text-markers@0.40.2': - resolution: {integrity: sha512-/XoLjD67K9nfM4TgDlXAExzMJp6ewFKxNpfUw4F7q5Ecy+IU3/9zQQG/O70Zy+RxYTwKGw2MA9kd7yelsxnSmw==} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@mdx-js/mdx@3.1.0': - resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@pagefind/darwin-arm64@1.3.0': - resolution: {integrity: sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==} + '@pagefind/darwin-arm64@1.4.0': + resolution: {integrity: sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==} cpu: [arm64] os: [darwin] - '@pagefind/darwin-x64@1.3.0': - resolution: {integrity: sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==} + '@pagefind/darwin-x64@1.4.0': + resolution: {integrity: sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==} cpu: [x64] os: [darwin] - '@pagefind/default-ui@1.3.0': - resolution: {integrity: sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg==} + '@pagefind/default-ui@1.4.0': + resolution: {integrity: sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==} - '@pagefind/linux-arm64@1.3.0': - resolution: {integrity: sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==} + '@pagefind/freebsd-x64@1.4.0': + resolution: {integrity: sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.4.0': + resolution: {integrity: sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==} cpu: [arm64] os: [linux] - '@pagefind/linux-x64@1.3.0': - resolution: {integrity: sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==} + '@pagefind/linux-x64@1.4.0': + resolution: {integrity: sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==} cpu: [x64] os: [linux] - '@pagefind/windows-x64@1.3.0': - resolution: {integrity: sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==} + '@pagefind/windows-x64@1.4.0': + resolution: {integrity: sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==} cpu: [x64] os: [win32] - '@rollup/pluginutils@5.1.4': - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + '@puppeteer/browsers@2.6.1': + resolution: {integrity: sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==} + engines: {node: '>=18'} + hasBin: true + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -410,127 +470,154 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.34.7': - resolution: {integrity: sha512-l6CtzHYo8D2TQ3J7qJNpp3Q1Iye56ssIAtqbM2H8axxCEEwvN7o8Ze9PuIapbxFL3OHrJU2JBX6FIIVnP/rYyw==} + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.7': - resolution: {integrity: sha512-KvyJpFUueUnSp53zhAa293QBYqwm94TgYTIfXyOTtidhm5V0LbLCJQRGkQClYiX3FXDQGSvPxOTD/6rPStMMDg==} + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.7': - resolution: {integrity: sha512-jq87CjmgL9YIKvs8ybtIC98s/M3HdbqXhllcy9EdLV0yMg1DpxES2gr65nNy7ObNo/vZ/MrOTxt0bE5LinL6mA==} + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.7': - resolution: {integrity: sha512-rSI/m8OxBjsdnMMg0WEetu/w+LhLAcCDEiL66lmMX4R3oaml3eXz3Dxfvrxs1FbzPbJMaItQiksyMfv1hoIxnA==} + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.7': - resolution: {integrity: sha512-oIoJRy3ZrdsXpFuWDtzsOOa/E/RbRWXVokpVrNnkS7npz8GEG++E1gYbzhYxhxHbO2om1T26BZjVmdIoyN2WtA==} + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.7': - resolution: {integrity: sha512-X++QSLm4NZfZ3VXGVwyHdRf58IBbCu9ammgJxuWZYLX0du6kZvdNqPwrjvDfwmi6wFdvfZ/s6K7ia0E5kI7m8Q==} + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.34.7': - resolution: {integrity: sha512-Z0TzhrsNqukTz3ISzrvyshQpFnFRfLunYiXxlCRvcrb3nvC5rVKI+ZXPFG/Aa4jhQa1gHgH3A0exHaRRN4VmdQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.7': - resolution: {integrity: sha512-nkznpyXekFAbvFBKBy4nNppSgneB1wwG1yx/hujN3wRnhnkrYVugMTCBXED4+Ni6thoWfQuHNYbFjgGH0MBXtw==} + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.7': - resolution: {integrity: sha512-KCjlUkcKs6PjOcxolqrXglBDcfCuUCTVlX5BgzgoJHw+1rWH1MCkETLkLe5iLLS9dP5gKC7mp3y6x8c1oGBUtA==} + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.7': - resolution: {integrity: sha512-uFLJFz6+utmpbR313TTx+NpPuAXbPz4BhTQzgaP0tozlLnGnQ6rCo6tLwaSa6b7l6gRErjLicXQ1iPiXzYotjw==} + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.7': - resolution: {integrity: sha512-ws8pc68UcJJqCpneDFepnwlsMUFoWvPbWXT/XUrJ7rWUL9vLoIN3GAasgG+nCvq8xrE3pIrd+qLX/jotcLy0Qw==} + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.7': - resolution: {integrity: sha512-vrDk9JDa/BFkxcS2PbWpr0C/LiiSLxFbNOBgfbW6P8TBe9PPHx9Wqbvx2xgNi1TOAyQHQJ7RZFqBiEohm79r0w==} + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.7': - resolution: {integrity: sha512-rB+ejFyjtmSo+g/a4eovDD1lHWHVqizN8P0Hm0RElkINpS0XOdpaXloqM4FBkF9ZWEzg6bezymbpLmeMldfLTw==} + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.7': - resolution: {integrity: sha512-nNXNjo4As6dNqRn7OrsnHzwTgtypfRA3u3AKr0B3sOOo+HkedIbn8ZtFnB+4XyKJojIfqDKmbIzO1QydQ8c+Pw==} + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.7': - resolution: {integrity: sha512-9kPVf9ahnpOMSGlCxXGv980wXD0zRR3wyk8+33/MXQIpQEOpaNe7dEHm5LMfyRZRNt9lMEQuH0jUKj15MkM7QA==} + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.7': - resolution: {integrity: sha512-7wJPXRWTTPtTFDFezA8sle/1sdgxDjuMoRXEKtx97ViRxGGkVQYovem+Q8Pr/2HxiHp74SSRG+o6R0Yq0shPwQ==} + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.7': - resolution: {integrity: sha512-MN7aaBC7mAjsiMEZcsJvwNsQVNZShgES/9SzWp1HC9Yjqb5OpexYnRjF7RmE4itbeesHMYYQiAtUAQaSKs2Rfw==} + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.7': - resolution: {integrity: sha512-aeawEKYswsFu1LhDM9RIgToobquzdtSc4jSVqHV8uApz4FVvhFl/mKh92wc8WpFc6aYCothV/03UjY6y7yLgbg==} + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.7': - resolution: {integrity: sha512-4ZedScpxxIrVO7otcZ8kCX1mZArtH2Wfj3uFCxRJ9NO80gg1XV0U/b2f/MKaGwj2X3QopHfoWiDQ917FRpwY3w==} + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] - '@shikijs/core@1.29.2': - resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.22.0': + resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} - '@shikijs/engine-javascript@1.29.2': - resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} + '@shikijs/engine-javascript@3.22.0': + resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} - '@shikijs/engine-oniguruma@1.29.2': - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + '@shikijs/engine-oniguruma@3.22.0': + resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} - '@shikijs/langs@1.29.2': - resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} + '@shikijs/langs@3.22.0': + resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} - '@shikijs/themes@1.29.2': - resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} + '@shikijs/themes@3.22.0': + resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} - '@shikijs/types@1.29.2': - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + '@shikijs/types@3.22.0': + resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -538,8 +625,8 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -562,6 +649,9 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + '@types/node@25.1.0': + resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==} + '@types/picomatch@3.0.2': resolution: {integrity: sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA==} @@ -574,6 +664,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -582,28 +675,36 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-escapes@7.1.1: - resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} + ansi-escapes@7.2.0: + resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} engines: {node: '>=18'} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} anymatch@3.1.3: @@ -613,9 +714,6 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -626,46 +724,65 @@ packages: array-iterate@2.0.1: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true - astro-expressive-code@0.40.2: - resolution: {integrity: sha512-yJMQId0yXSAbW9I6yqvJ3FcjKzJ8zRL7elbJbllkv1ZJPlsI0NI83Pxn1YL1IapEM347EvOOkSW2GL+2+NO61w==} + astro-expressive-code@0.41.6: + resolution: {integrity: sha512-l47tb1uhmVIebHUkw+HEPtU/av0G4O8Q34g2cbkPvC7/e9ZhANcjUUciKt9Hp6gSVDdIuXBBLwJQn2LkeGMOAw==} peerDependencies: - astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta - astro@5.3.0: - resolution: {integrity: sha512-e88l/Yk/6enR/ZDddLbqtM+oblBFk5mneNSmNesyVYGL/6Dj4UA67GPAZOk79VxT5dbLlclZSyyw/wlxN1aj3A==} - engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + astro@5.17.1: + resolution: {integrity: sha512-oD3tlxTaVWGq/Wfbqk6gxzVRz98xa/rYlpe+gU2jXJMSD01k6sEDL01ZlT8mVSYB/rMgnvIOfiQQ3BbLdN237A==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - bare-events@2.5.4: - resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true - bare-fs@4.0.1: - resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} - engines: {bare: '>=1.7.0'} + bare-fs@4.5.3: + resolution: {integrity: sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true - bare-os@3.4.0: - resolution: {integrity: sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==} - engines: {bare: '>=1.6.0'} + bare-os@3.6.2: + resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.6.5: - resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + bare-stream@2.7.0: + resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} peerDependencies: bare-buffer: '*' bare-events: '*' @@ -675,25 +792,25 @@ packages: bare-events: optional: true + bare-url@2.3.2: + resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + basic-ftp@5.1.0: + resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} + engines: {node: '>=10.0.0'} + bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} bcp-47@2.1.0: resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -701,13 +818,16 @@ packages: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -715,8 +835,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} character-entities-html4@2.1.0: @@ -731,21 +851,27 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chromium-bidi@0.11.0: + resolution: {integrity: sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==} + peerDependencies: + devtools-protocol: '*' - ci-info@4.1.0: - resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -760,39 +886,68 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} - crossws@0.3.4: - resolution: {integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - css-selector-parser@3.0.5: - resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -800,43 +955,42 @@ packages: supports-color: optional: true - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} deterministic-object-hash@2.0.2: resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} engines: {node: '>=18'} - devalue@5.1.1: - resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + devalue@5.6.2: + resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + devtools-protocol@0.0.1367902: + resolution: {integrity: sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==} + + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} direction@2.0.1: @@ -846,32 +1000,53 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - - emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -879,20 +1054,33 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} @@ -917,75 +1105,79 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - expressive-code@0.40.2: - resolution: {integrity: sha512-1zIda2rB0qiDZACawzw2rbdBQiWHBT56uBctS+ezFe5XMAaFaHLnnSYND/Kd+dVzO9HfCXRDpzH3d+3fvOWRcw==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + expressive-code@0.41.6: + resolution: {integrity: sha512-W/5+IQbrpCIM5KGLjO35wlp1NCwDOOVQb+PAvzEoGkW1xjGM807ZGfBKptNWH6UECvt6qgmLyWolCMYKh7eQmA==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fastq@1.19.0: - resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} - engines: {node: '>=18'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fontace@0.4.0: + resolution: {integrity: sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg==} + + fontkitten@1.0.2: + resolution: {integrity: sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==} + engines: {node: '>=20'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - h3@1.15.0: - resolution: {integrity: sha512-OsjX4JW8J4XGgCgEcad20pepFQWnuKH+OwkCJjogF3C+9AZ1iYdtB4hX6vAb5DskBiu5ljEXqApINjR8CqoCMQ==} + h3@1.15.5: + resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} has-flag@5.0.1: resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} @@ -1000,8 +1192,8 @@ packages: hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - hast-util-from-parse5@8.0.2: - resolution: {integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==} + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} hast-util-has-property@3.0.0: resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} @@ -1024,20 +1216,20 @@ packages: hast-util-raw@9.1.0: resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - hast-util-select@6.0.3: - resolution: {integrity: sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ==} + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} - hast-util-to-estree@3.1.1: - resolution: {integrity: sha512-IWtwwmPskfSmma9RpzCappDUitC8t5jhAynHhc1m2+5trOgsrp7txscUSavc5Ic8PATyAjfrCK1wgtxh2cICVQ==} + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} - hast-util-to-html@9.0.4: - resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - hast-util-to-jsx-runtime@2.3.2: - resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} @@ -1048,8 +1240,8 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@9.0.0: - resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} @@ -1060,8 +1252,16 @@ packages: html-whitespace-sensitive-tag-names@3.0.1: resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} i18next@23.16.8: resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} @@ -1069,17 +1269,19 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} - inline-style-parser@0.2.4: - resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -1094,12 +1296,8 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -1109,18 +1307,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -1129,10 +1319,6 @@ packages: engines: {node: '>=14.16'} hasBin: true - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -1141,14 +1327,16 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -1161,25 +1349,25 @@ packages: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.5: + resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} + engines: {node: 20 || >=22} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} @@ -1233,8 +1421,8 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} @@ -1242,12 +1430,14 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - micromark-core-commonmark@2.0.2: - resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-directive@3.0.2: resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} @@ -1273,11 +1463,11 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-extension-mdx-expression@3.0.0: - resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} - micromark-extension-mdx-jsx@3.0.1: - resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} micromark-extension-mdx-md@2.0.0: resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} @@ -1294,8 +1484,8 @@ packages: micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - micromark-factory-mdx-expression@2.0.2: - resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} @@ -1327,8 +1517,8 @@ packages: micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-events-to-acorn@2.0.2: - resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} @@ -1342,66 +1532,49 @@ packages: micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.4: - resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.1: - resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - neotraverse@0.6.18: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + nlcst-to-string@4.0.0: resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} - node-abi@3.74.0: - resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} - engines: {node: '>=10'} - - node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - - node-fetch-native@1.6.6: - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} - node-mock-http@1.0.0: - resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -1410,58 +1583,70 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - ofetch@1.4.1: - resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} - ohash@1.1.4: - resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - oniguruma-to-es@2.3.0: - resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} p-limit@6.2.0: resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-queue@8.1.0: - resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==} + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} engines: {node: '>=18'} p-timeout@6.1.4: resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} engines: {node: '>=14.16'} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} - pagefind@1.3.0: - resolution: {integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==} + pagefind@1.4.0: + resolution: {integrity: sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==} hasBin: true + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} - parse5@7.2.1: - resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1470,18 +1655,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} @@ -1492,56 +1669,63 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.5.2: - resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - hasBin: true - - preferred-pm@4.1.1: - resolution: {integrity: sha512-rU+ZAv1Ur9jAUZtGPebQVQPzdGhNzaEiQ7VL9+cjsAWPHFYOccNXPNiev1CCDSOg/2j7UujM7ojNhpkuILEVNQ==} - engines: {node: '>=18.12'} - - prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + puppeteer-autoscroll-down@2.0.1: + resolution: {integrity: sha512-nP30RoaxdcwDcyyv2v6WHZbADhLtxdcwwuO8l6OrrVRFbOagJR96RR+v/BL0N1w2fSzrR1BP47ukfbLOBMcpEA==} + engines: {node: '>=18'} + + puppeteer-core@23.11.1: + resolution: {integrity: sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==} + engines: {node: '>=18'} + + puppeteer@23.11.1: + resolution: {integrity: sha512-53uIX3KR5en8l7Vd8n5DUv90Ae9QDQsyIthaUFVzwV6yU750RjqRznEtNMBT20VthqAdemnJN+hxVdmMHKt7Zw==} + engines: {node: '>=18'} + deprecated: < 24.15.0 is no longer supported hasBin: true - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} - recma-jsx@1.0.0: - resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 recma-parse@1.0.0: resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} @@ -1549,20 +1733,17 @@ packages: recma-stringify@1.0.0: resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regex-recursion@5.1.1: - resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@5.1.1: - resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - rehype-expressive-code@0.40.2: - resolution: {integrity: sha512-+kn+AMGCrGzvtH8Q5lC6Y5lnmTV/r33fdmi5QU/IH1KPHKobKr5UnLwJuqHv5jBTSN/0v2wLDS7RTM73FVzqmQ==} + rehype-expressive-code@0.41.6: + resolution: {integrity: sha512-aBMX8kxPtjmDSFUdZlAWJkMvsQ4ZMASfee90JWIAV8tweltXLzkWC3q++43ToTelI8ac5iC0B3/S/Cl4Ql1y2g==} rehype-format@5.0.1: resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} @@ -1588,14 +1769,14 @@ packages: remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - remark-mdx@3.1.0: - resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - remark-rehype@11.1.1: - resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} remark-smartypants@3.0.2: resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} @@ -1604,6 +1785,14 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + retext-latin@4.0.0: resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} @@ -1616,86 +1805,97 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rollup@4.34.7: - resolution: {integrity: sha512-8qhyN0oZ4x0H6wmBgfKxJtxM7qS98YJ0k0kNh5ECVtuchIJ7z9IVVvzpmtQyT10PXKMtBxYr1wQ5Apg8RS8kXQ==} + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shiki@1.29.2: - resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} - - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + shiki@3.22.0: + resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - sitemap@8.0.0: - resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==} + sitemap@8.0.2: + resolution: {integrity: sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==} engines: {node: '>=14.0.0', npm: '>=6.0.0'} hasBin: true - smol-toml@1.3.1: - resolution: {integrity: sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + smol-toml@1.6.0: + resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} engines: {node: '>= 18'} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + starlight-kbd@0.3.0: + resolution: {integrity: sha512-bhG1kWGEXCkuV8pkYW6sWEVmwD2bnpQpVIxq4QDJp7tLsprAbIKnD7RKFCP/QtITfwaVgKq3uMNK0+p4TUAgGg==} + engines: {node: '>=18.17.1'} + peerDependencies: + '@astrojs/starlight': '>=0.32.0' - starlight-links-validator@0.18.0: - resolution: {integrity: sha512-R0gLdrKWdpAEqux3DL2B3QvNJM8Zpys8CQu1BGLD9hc+66nt/Q6aJDkvvkvoCVky9JKmBEnmL4PhFkyz13lK5g==} + starlight-links-validator@0.19.2: + resolution: {integrity: sha512-IHeK3R78fsmv53VfRkGbXkwK1CQEUBHM9QPzBEyoAxjZ/ssi5gjV+F4oNNUppTR48iPp+lEY0MTAmvkX7yNnkw==} engines: {node: '>=18.17.1'} peerDependencies: '@astrojs/starlight': '>=0.32.0' + astro: '>=5.1.5' + + starlight-scroll-to-top@0.4.0: + resolution: {integrity: sha512-lxsW5Sv+oKCI8CYZQ6Ue957cExiHMozK73LmmbsvpBKWryW+AKU4OXmX/1bTQNx+mVLZcpm2qTwKa1KX5VdEaQ==} + engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} + peerDependencies: + '@astrojs/starlight': '>=0.35' + + starlight-to-pdf@1.4.0: + resolution: {integrity: sha512-J2Pw3EG1B2WuaHHpvVmg45O5jgDj5YAKurRd8gS8vVju2ge5ZRGEN1MKLs+Ov4Cmjv9RCqpn/RI1v7IQDm87kw==} + hasBin: true + peerDependencies: + puppeteer: ^23.10.4 + puppeteer-autoscroll-down: ^2.0.0 stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} - streamx@2.22.0: - resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -1705,9 +1905,6 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -1715,38 +1912,31 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} - style-to-object@1.0.8: - resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} supports-color@10.2.2: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} - supports-hyperlinks@4.3.0: - resolution: {integrity: sha512-i6sWEzuwadSlcr2mOnb0ktlIl+K5FVxsPXmoPfknDd2gyw4ZBIAZ5coc0NQzYqDdEYXMHy8NaY9rWwa1Q1myiQ==} + supports-hyperlinks@4.4.0: + resolution: {integrity: sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==} engines: {node: '>=20'} - tar-fs@2.1.2: - resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + svgo@4.0.0: + resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} + engines: {node: '>=16'} + hasBin: true - tar-fs@3.0.8: - resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-fs@3.1.1: + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -1758,12 +1948,19 @@ packages: text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -1771,8 +1968,8 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - tsconfck@3.1.5: - resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -1784,35 +1981,44 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - type-fest@4.34.1: - resolution: {integrity: sha512-6kSc32kT0rbwxD6QL1CYe8IqdzN/J/ILMrNK+HMQCKH3insCDRY/3ITb0vcBss0a3t72fzh2YSzj8ko1HgwT3g==} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + typed-query-selector@2.12.0: + resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + typescript@5.7.3: resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} - ultrahtml@1.5.3: - resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unifont@0.7.3: + resolution: {integrity: sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA==} + unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} unist-util-modify-children@4.0.0: resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} @@ -1832,33 +2038,34 @@ packages: unist-util-visit-children@3.0.0: resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - unstorage@1.14.4: - resolution: {integrity: sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg==} + unstorage@1.17.4: + resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 '@azure/data-tables': ^13.3.0 - '@azure/identity': ^4.5.0 + '@azure/identity': ^4.6.0 '@azure/keyvault-secrets': ^4.9.0 '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6.0.3 - '@deno/kv': '>=0.8.4' - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 '@planetscale/database': ^1.19.0 '@upstash/redis': ^1.34.3 - '@vercel/blob': '>=0.27.0' - '@vercel/kv': ^1.0.1 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 aws4fetch: ^1.0.20 db0: '>=0.2.1' idb-keyval: ^6.2.1 ioredis: ^5.4.2 - uploadthing: ^7.4.1 + uploadthing: ^7.4.4 peerDependenciesMeta: '@azure/app-configuration': optional: true @@ -1884,6 +2091,8 @@ packages: optional: true '@vercel/blob': optional: true + '@vercel/functions': + optional: true '@vercel/kv': optional: true aws4fetch: @@ -1903,14 +2112,14 @@ packages: vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@6.1.0: - resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1949,10 +2158,10 @@ packages: yaml: optional: true - vitefu@1.0.5: - resolution: {integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==} + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 peerDependenciesMeta: vite: optional: true @@ -1964,49 +2173,76 @@ packages: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} - which-pm@3.0.1: - resolution: {integrity: sha512-v2JrMq0waAI4ju1xU5x3blsxBBMgdgZve580iYMN5frDaLGjbA24fok7wKCsya8KLVO19Ju4XDc5+zTZCJkQfg==} - engines: {node: '>=18.12'} - widest-line@5.0.0: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + 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 + xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} - yocto-spinner@0.2.0: - resolution: {integrity: sha512-Qu6WAqNLGleB687CCGcmgHIo8l+J19MX/32UrSMfbf/4L8gLoxjpOYoiHT1asiWyqvjRZbgvOhLlvne6E5Tbdw==} + yocto-spinner@0.1.2: + resolution: {integrity: sha512-VfmLIh/ZSZOJnVRQZc/dvpPP90lWL4G0bmxQMP0+U/2vKBA8GSpcBuWv17y7F+CZItRuO97HN1wdbb4p10uhOg==} + engines: {node: '>=18.19'} + + yocto-spinner@0.2.3: + resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} engines: {node: '>=18.19'} - yoctocolors@2.1.1: - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - zod-to-json-schema@3.24.1: - resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: - zod: ^3.24.1 + zod: ^3.25 || ^4 zod-to-ts@1.2.0: resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} @@ -2014,107 +2250,114 @@ packages: typescript: ^4.9.4 || ^5.0.2 zod: ^3 - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@astrojs/compiler@2.10.4': {} + '@astrojs/compiler@2.13.0': {} - '@astrojs/internal-helpers@0.5.1': {} + '@astrojs/internal-helpers@0.7.5': {} - '@astrojs/markdown-remark@6.1.0': + '@astrojs/markdown-remark@6.3.10': dependencies: - '@astrojs/prism': 3.2.0 + '@astrojs/internal-helpers': 0.7.5 + '@astrojs/prism': 3.3.0 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 hast-util-to-text: 4.0.2 - import-meta-resolve: 4.1.0 - js-yaml: 4.1.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.1 mdast-util-definitions: 6.0.0 rehype-raw: 7.0.0 rehype-stringify: 10.0.1 remark-gfm: 4.0.1 remark-parse: 11.0.0 - remark-rehype: 11.1.1 + remark-rehype: 11.1.2 remark-smartypants: 3.0.2 - shiki: 1.29.2 - smol-toml: 1.3.1 + shiki: 3.22.0 + smol-toml: 1.6.0 unified: 11.0.5 unist-util-remove-position: 5.0.0 - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.0.8(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0))': + '@astrojs/mdx@4.3.13(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2))': dependencies: - '@astrojs/markdown-remark': 6.1.0 - '@mdx-js/mdx': 3.1.0(acorn@8.14.0) - acorn: 8.14.0 - astro: 5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0) - es-module-lexer: 1.6.0 + '@astrojs/markdown-remark': 6.3.10 + '@mdx-js/mdx': 3.1.1 + acorn: 8.15.0 + astro: 5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2) + es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 - hast-util-to-html: 9.0.4 - kleur: 4.1.5 + hast-util-to-html: 9.0.5 + piccolore: 0.1.3 rehype-raw: 7.0.0 remark-gfm: 4.0.1 remark-smartypants: 3.0.2 - source-map: 0.7.4 - unist-util-visit: 5.0.0 + source-map: 0.7.6 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@astrojs/prism@3.2.0': + '@astrojs/prism@3.3.0': dependencies: - prismjs: 1.29.0 + prismjs: 1.30.0 - '@astrojs/sitemap@3.2.1': + '@astrojs/sitemap@3.7.0': dependencies: - sitemap: 8.0.0 + sitemap: 8.0.2 stream-replace-string: 2.0.0 - zod: 3.24.2 + zod: 3.25.76 - '@astrojs/starlight@0.32.0(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0))': + '@astrojs/starlight@0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2))': dependencies: - '@astrojs/mdx': 4.0.8(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0)) - '@astrojs/sitemap': 3.2.1 - '@pagefind/default-ui': 1.3.0 + '@astrojs/markdown-remark': 6.3.10 + '@astrojs/mdx': 4.3.13(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)) + '@astrojs/sitemap': 3.7.0 + '@pagefind/default-ui': 1.4.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0) - astro-expressive-code: 0.40.2(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0)) + astro: 5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2) + astro-expressive-code: 0.41.6(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 - hast-util-select: 6.0.3 + hast-util-select: 6.0.4 hast-util-to-string: 3.0.1 - hastscript: 9.0.0 + hastscript: 9.0.1 i18next: 23.16.8 - js-yaml: 4.1.0 + js-yaml: 4.1.1 klona: 2.0.6 + magic-string: 0.30.21 mdast-util-directive: 3.1.0 mdast-util-to-markdown: 2.1.2 mdast-util-to-string: 4.0.0 - pagefind: 1.3.0 + pagefind: 1.4.0 rehype: 13.0.2 rehype-format: 5.0.1 remark-directive: 3.0.1 + ultrahtml: 1.6.0 unified: 11.0.5 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@astrojs/telemetry@3.2.0': + '@astrojs/telemetry@3.3.0': dependencies: - ci-info: 4.1.0 - debug: 4.4.0 + ci-info: 4.4.0 + debug: 4.4.3 dlv: 1.1.3 dset: 3.1.4 is-docker: 3.0.0 @@ -2123,373 +2366,424 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.25.9': {} + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.26.9': + '@babel/parser@7.29.0': dependencies: - '@babel/types': 7.26.9 + '@babel/types': 7.29.0 + + '@babel/runtime@7.28.6': {} - '@babel/runtime@7.26.9': + '@babel/types@7.29.0': dependencies: - regenerator-runtime: 0.14.1 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.26.9': + '@capsizecss/unpack@4.0.0': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + fontkitten: 1.0.2 - '@ctrl/tinycolor@4.1.0': {} + '@ctrl/tinycolor@4.2.0': {} - '@emnapi/runtime@1.3.1': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-ia32@0.25.12': optional: true - '@expressive-code/core@0.40.2': + '@esbuild/win32-x64@0.25.12': + optional: true + + '@expressive-code/core@0.41.6': dependencies: - '@ctrl/tinycolor': 4.1.0 - hast-util-select: 6.0.3 - hast-util-to-html: 9.0.4 + '@ctrl/tinycolor': 4.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 hast-util-to-text: 4.0.2 - hastscript: 9.0.0 - postcss: 8.5.2 - postcss-nested: 6.2.0(postcss@8.5.2) - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 + hastscript: 9.0.1 + postcss: 8.5.6 + postcss-nested: 6.2.0(postcss@8.5.6) + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 - '@expressive-code/plugin-frames@0.40.2': + '@expressive-code/plugin-frames@0.41.6': dependencies: - '@expressive-code/core': 0.40.2 + '@expressive-code/core': 0.41.6 - '@expressive-code/plugin-shiki@0.40.2': + '@expressive-code/plugin-shiki@0.41.6': dependencies: - '@expressive-code/core': 0.40.2 - shiki: 1.29.2 + '@expressive-code/core': 0.41.6 + shiki: 3.22.0 - '@expressive-code/plugin-text-markers@0.40.2': + '@expressive-code/plugin-text-markers@0.41.6': dependencies: - '@expressive-code/core': 0.40.2 + '@expressive-code/core': 0.41.6 + + '@img/colour@1.0.0': {} - '@img/sharp-darwin-arm64@0.33.5': + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true - '@img/sharp-darwin-x64@0.33.5': + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': + '@img/sharp-libvips-darwin-arm64@1.2.4': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': + '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': + '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': + '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@img/sharp-linux-arm64@0.33.5': + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 optional: true - '@img/sharp-linux-arm@0.33.5': + '@img/sharp-linux-arm@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm': 1.2.4 optional: true - '@img/sharp-linux-s390x@0.33.5': + '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 optional: true - '@img/sharp-linux-x64@0.33.5': + '@img/sharp-linux-riscv64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.33.5': + '@img/sharp-linux-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.2.4 optional: true - '@img/sharp-wasm32@0.33.5': + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.3.1 + '@emnapi/runtime': 1.8.1 optional: true - '@img/sharp-win32-ia32@0.33.5': + '@img/sharp-win32-arm64@0.34.5': optional: true - '@img/sharp-win32-x64@0.33.5': + '@img/sharp-win32-ia32@0.34.5': optional: true - '@jridgewell/sourcemap-codec@1.5.0': {} + '@img/sharp-win32-x64@0.34.5': + optional: true - '@mdx-js/mdx@3.1.0(acorn@8.14.0)': + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@mdx-js/mdx@3.1.1': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 + acorn: 8.15.0 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 estree-util-scope: 1.0.0 estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.2 + hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.14.0) + recma-jsx: 1.0.1(acorn@8.15.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 - remark-mdx: 3.1.0 + remark-mdx: 3.1.1 remark-parse: 11.0.0 - remark-rehype: 11.1.1 - source-map: 0.7.4 + remark-rehype: 11.1.2 + source-map: 0.7.6 unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - - acorn - supports-color - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.0 - '@oslojs/encoding@1.1.0': {} - '@pagefind/darwin-arm64@1.3.0': + '@pagefind/darwin-arm64@1.4.0': optional: true - '@pagefind/darwin-x64@1.3.0': + '@pagefind/darwin-x64@1.4.0': optional: true - '@pagefind/default-ui@1.3.0': {} + '@pagefind/default-ui@1.4.0': {} + + '@pagefind/freebsd-x64@1.4.0': + optional: true - '@pagefind/linux-arm64@1.3.0': + '@pagefind/linux-arm64@1.4.0': optional: true - '@pagefind/linux-x64@1.3.0': + '@pagefind/linux-x64@1.4.0': optional: true - '@pagefind/windows-x64@1.3.0': + '@pagefind/windows-x64@1.4.0': optional: true - '@rollup/pluginutils@5.1.4(rollup@4.34.7)': + '@puppeteer/browsers@2.6.1': dependencies: - '@types/estree': 1.0.6 + debug: 4.4.3 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.7.3 + tar-fs: 3.1.1 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': + dependencies: + '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.34.7 + rollup: 4.57.1 + + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.34.7': + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@rollup/rollup-android-arm64@4.34.7': + '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@rollup/rollup-darwin-arm64@4.34.7': + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@rollup/rollup-darwin-x64@4.34.7': + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@rollup/rollup-freebsd-arm64@4.34.7': + '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - '@rollup/rollup-freebsd-x64@4.34.7': + '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.7': + '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.7': + '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.7': + '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.7': + '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.7': + '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.7': + '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.7': + '@rollup/rollup-linux-x64-musl@4.57.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.7': + '@rollup/rollup-openbsd-x64@4.57.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.7': + '@rollup/rollup-openharmony-arm64@4.57.1': optional: true - '@rollup/rollup-linux-x64-musl@4.34.7': + '@rollup/rollup-win32-arm64-msvc@4.57.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.7': + '@rollup/rollup-win32-ia32-msvc@4.57.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.7': + '@rollup/rollup-win32-x64-gnu@4.57.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.7': + '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true - '@shikijs/core@1.29.2': + '@shikijs/core@3.22.0': dependencies: - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - hast-util-to-html: 9.0.4 + hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@1.29.2': + '@shikijs/engine-javascript@3.22.0': dependencies: - '@shikijs/types': 1.29.2 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 2.3.0 + oniguruma-to-es: 4.3.4 - '@shikijs/engine-oniguruma@1.29.2': + '@shikijs/engine-oniguruma@3.22.0': dependencies: - '@shikijs/types': 1.29.2 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@1.29.2': + '@shikijs/langs@3.22.0': dependencies: - '@shikijs/types': 1.29.2 + '@shikijs/types': 3.22.0 - '@shikijs/themes@1.29.2': + '@shikijs/themes@3.22.0': dependencies: - '@shikijs/types': 1.29.2 + '@shikijs/types': 3.22.0 - '@shikijs/types@1.29.2': + '@shikijs/types@3.22.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@10.0.2': {} - '@types/acorn@4.0.6': - dependencies: - '@types/estree': 1.0.6 - - '@types/cookie@0.6.0': {} + '@tootallnate/quickjs-emscripten@0.23.0': {} '@types/debug@4.1.12': dependencies: @@ -2497,9 +2791,9 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 - '@types/estree@1.0.6': {} + '@types/estree@1.0.8': {} '@types/hast@3.0.4': dependencies: @@ -2521,6 +2815,11 @@ snapshots: '@types/node@17.0.45': {} + '@types/node@25.1.0': + dependencies: + undici-types: 7.16.0 + optional: true + '@types/picomatch@3.0.2': {} '@types/sax@1.2.7': @@ -2531,27 +2830,38 @@ snapshots: '@types/unist@3.0.3': {} + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 25.1.0 + optional: true + '@ungap/structured-clone@1.3.0': {} - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.0 + acorn: 8.15.0 + + acorn@8.15.0: {} - acorn@8.14.0: {} + agent-base@7.1.4: {} ansi-align@3.0.1: dependencies: string-width: 4.2.3 - ansi-escapes@7.1.1: + ansi-escapes@7.2.0: dependencies: environment: 1.1.0 ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} - ansi-styles@6.2.1: {} + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} anymatch@3.1.3: dependencies: @@ -2560,86 +2870,90 @@ snapshots: arg@5.0.2: {} - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - argparse@2.0.1: {} aria-query@5.3.2: {} array-iterate@2.0.1: {} + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + astring@1.9.0: {} - astro-expressive-code@0.40.2(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0)): + astro-expressive-code@0.41.6(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)): dependencies: - astro: 5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0) - rehype-expressive-code: 0.40.2 + astro: 5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2) + rehype-expressive-code: 0.41.6 - astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0): + astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2): dependencies: - '@astrojs/compiler': 2.10.4 - '@astrojs/internal-helpers': 0.5.1 - '@astrojs/markdown-remark': 6.1.0 - '@astrojs/telemetry': 3.2.0 + '@astrojs/compiler': 2.13.0 + '@astrojs/internal-helpers': 0.7.5 + '@astrojs/markdown-remark': 6.3.10 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 4.0.0 '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.1.4(rollup@4.34.7) - '@types/cookie': 0.6.0 - acorn: 8.14.0 + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + acorn: 8.15.0 aria-query: 5.3.2 axobject-query: 4.1.0 boxen: 8.0.1 - ci-info: 4.1.0 + ci-info: 4.4.0 clsx: 2.1.1 common-ancestor-path: 1.0.1 - cookie: 0.7.2 + cookie: 1.1.1 cssesc: 3.0.0 - debug: 4.4.0 + debug: 4.4.3 deterministic-object-hash: 2.0.2 - devalue: 5.1.1 - diff: 5.2.0 + devalue: 5.6.2 + diff: 8.0.3 dlv: 1.1.3 dset: 3.1.4 - es-module-lexer: 1.6.0 - esbuild: 0.24.2 + es-module-lexer: 1.7.0 + esbuild: 0.25.12 estree-walker: 3.0.3 - fast-glob: 3.3.3 flattie: 1.1.1 + fontace: 0.4.0 github-slugger: 2.0.0 html-escaper: 3.0.3 - http-cache-semantics: 4.1.1 - js-yaml: 4.1.0 - kleur: 4.1.5 - magic-string: 0.30.17 - magicast: 0.3.5 - micromatch: 4.0.8 - mrmime: 2.0.0 + http-cache-semantics: 4.2.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.1 + magic-string: 0.30.21 + magicast: 0.5.1 + mrmime: 2.0.1 neotraverse: 0.6.18 p-limit: 6.2.0 - p-queue: 8.1.0 - preferred-pm: 4.1.1 + p-queue: 8.1.1 + package-manager-detector: 1.6.0 + piccolore: 0.1.3 + picomatch: 4.0.3 prompts: 2.4.2 rehype: 13.0.2 - semver: 7.7.1 - shiki: 1.29.2 - tinyexec: 0.3.2 - tsconfck: 3.1.5(typescript@5.7.3) - ultrahtml: 1.5.3 - unist-util-visit: 5.0.0 - unstorage: 1.14.4 + semver: 7.7.3 + shiki: 3.22.0 + smol-toml: 1.6.0 + svgo: 4.0.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tsconfck: 3.1.6(typescript@5.7.3) + ultrahtml: 1.6.0 + unifont: 0.7.3 + unist-util-visit: 5.1.0 + unstorage: 1.17.4 vfile: 6.0.3 - vite: 6.1.0(yaml@2.7.0) - vitefu: 1.0.5(vite@6.1.0(yaml@2.7.0)) - which-pm: 3.0.1 + vite: 6.4.1(@types/node@25.1.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.1.0)(yaml@2.8.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 - yocto-spinner: 0.2.0 - zod: 3.24.2 - zod-to-json-schema: 3.24.1(zod@3.24.2) - zod-to-ts: 1.2.0(typescript@5.7.3)(zod@3.24.2) + yocto-spinner: 0.2.3 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.7.3)(zod@3.25.76) optionalDependencies: - sharp: 0.33.5 + sharp: 0.34.5 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -2654,6 +2968,7 @@ snapshots: - '@types/node' - '@upstash/redis' - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' - aws4fetch - db0 @@ -2676,41 +2991,53 @@ snapshots: axobject-query@4.1.0: {} - b4a@1.6.7: {} + b4a@1.7.3: {} bail@2.0.2: {} - bare-events@2.5.4: - optional: true + bare-events@2.8.2: {} - bare-fs@4.0.1: + bare-fs@4.5.3: dependencies: - bare-events: 2.5.4 + bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.6.5(bare-events@2.5.4) + bare-stream: 2.7.0(bare-events@2.8.2) + bare-url: 2.3.2 + fast-fifo: 1.3.2 transitivePeerDependencies: - - bare-buffer + - bare-abort-controller + - react-native-b4a optional: true - bare-os@3.4.0: + bare-os@3.6.2: optional: true bare-path@3.0.0: dependencies: - bare-os: 3.4.0 + bare-os: 3.6.2 optional: true - bare-stream@2.6.5(bare-events@2.5.4): + bare-stream@2.7.0(bare-events@2.8.2): dependencies: - streamx: 2.22.0 + streamx: 2.23.0 optionalDependencies: - bare-events: 2.5.4 + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + bare-url@2.3.2: + dependencies: + bare-path: 3.0.0 optional: true base-64@1.0.0: {} base64-js@1.5.1: {} + basic-ftp@5.1.0: {} + bcp-47-match@2.0.3: {} bcp-47@2.1.0: @@ -2719,41 +3046,33 @@ snapshots: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 - binary-extensions@2.3.0: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - boolbase@1.0.0: {} boxen@8.0.1: dependencies: ansi-align: 3.0.1 camelcase: 8.0.0 - chalk: 5.4.1 + chalk: 5.6.2 cli-boxes: 3.0.0 string-width: 7.2.0 - type-fest: 4.34.1 + type-fest: 4.41.0 widest-line: 5.0.0 - wrap-ansi: 9.0.0 + wrap-ansi: 9.0.2 - braces@3.0.3: - dependencies: - fill-range: 7.1.1 + buffer-crc32@0.2.13: {} buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + callsites@3.1.0: {} + camelcase@8.0.0: {} ccount@2.0.1: {} - chalk@5.4.1: {} + chalk@5.6.2: {} character-entities-html4@2.1.0: {} @@ -2763,24 +3082,26 @@ snapshots: character-reference-invalid@2.0.1: {} - chokidar@3.6.0: + chokidar@5.0.0: dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 + readdirp: 5.0.0 - chownr@1.1.4: {} + chromium-bidi@0.11.0(devtools-protocol@0.0.1367902): + dependencies: + devtools-protocol: 0.0.1367902 + mitt: 3.0.1 + zod: 3.23.8 - ci-info@4.1.0: {} + ci-info@4.4.0: {} cli-boxes@3.0.0: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clsx@2.1.1: {} collapse-white-space@2.1.0: {} @@ -2791,87 +3112,140 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - comma-separated-tokens@2.0.3: {} + commander@11.1.0: {} + common-ancestor-path@1.0.1: {} cookie-es@1.2.2: {} - cookie@0.7.2: {} + cookie@1.1.1: {} + + cosmiconfig@9.0.0(typescript@5.7.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.7.3 - crossws@0.3.4: + crossws@0.3.5: dependencies: uncrypto: 0.1.3 - css-selector-parser@3.0.5: {} + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 - cssesc@3.0.0: {} + css-selector-parser@3.3.0: {} - debug@4.4.0: + css-tree@2.2.1: dependencies: - ms: 2.1.3 + mdn-data: 2.0.28 + source-map-js: 1.2.1 - decode-named-character-reference@1.0.2: + css-tree@3.1.0: dependencies: - character-entities: 2.0.2 + mdn-data: 2.12.2 + source-map-js: 1.2.1 - decompress-response@6.0.0: + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + data-uri-to-buffer@6.0.2: {} + + debug@4.4.3: dependencies: - mimic-response: 3.1.0 + ms: 2.1.3 - deep-extend@0.6.0: {} + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 defu@6.1.4: {} + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + dequal@2.0.3: {} - destr@2.0.3: {} + destr@2.0.5: {} - detect-libc@2.0.3: {} + detect-libc@2.1.2: {} deterministic-object-hash@2.0.2: dependencies: base-64: 1.0.0 - devalue@5.1.1: {} + devalue@5.6.2: {} devlop@1.1.0: dependencies: dequal: 2.0.3 - diff@5.2.0: {} + devtools-protocol@0.0.1367902: {} + + diff@8.0.3: {} direction@2.0.1: {} dlv@1.1.3: {} - dset@3.1.4: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 - emoji-regex-xs@1.0.0: {} + domelementtype@2.3.0: {} - emoji-regex@10.4.0: {} + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dset@3.1.4: {} + + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 entities@4.5.0: {} + entities@6.0.1: {} + + env-paths@2.2.1: {} + environment@1.1.0: {} - es-module-lexer@1.6.0: {} + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-module-lexer@1.7.0: {} esast-util-from-estree@2.0.0: dependencies: @@ -2883,45 +3257,58 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.14.0 + acorn: 8.15.0 esast-util-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 - esbuild@0.24.2: + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + escalade@3.2.0: {} escape-string-regexp@5.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + esprima@4.0.1: {} + estraverse@5.3.0: {} + estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-util-build-jsx@3.0.1: dependencies: @@ -2934,14 +3321,14 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-to-js@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 astring: 1.9.0 - source-map: 0.7.4 + source-map: 0.7.6 estree-util-visit@2.0.0: dependencies: @@ -2952,81 +3339,88 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 - eventemitter3@5.0.1: {} + esutils@2.0.3: {} - expand-template@2.0.3: {} + eventemitter3@5.0.4: {} - expressive-code@0.40.2: + events-universal@1.0.1: dependencies: - '@expressive-code/core': 0.40.2 - '@expressive-code/plugin-frames': 0.40.2 - '@expressive-code/plugin-shiki': 0.40.2 - '@expressive-code/plugin-text-markers': 0.40.2 - - extend@3.0.2: {} - - fast-fifo@1.3.2: {} + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller - fast-glob@3.3.3: + expressive-code@0.41.6: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 + '@expressive-code/core': 0.41.6 + '@expressive-code/plugin-frames': 0.41.6 + '@expressive-code/plugin-shiki': 0.41.6 + '@expressive-code/plugin-text-markers': 0.41.6 - fastq@1.19.0: - dependencies: - reusify: 1.0.4 + extend@3.0.2: {} - fill-range@7.1.1: + extract-zip@2.0.1: dependencies: - to-regex-range: 5.0.1 + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color - find-up-simple@1.0.0: {} + fast-fifo@1.3.2: {} - find-up@4.1.0: + fd-slicer@1.1.0: dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 + pend: 1.2.0 - find-yarn-workspace-root2@1.2.16: - dependencies: - micromatch: 4.0.8 - pkg-dir: 4.2.0 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 flattie@1.1.1: {} - fs-constants@1.0.0: {} + fontace@0.4.0: + dependencies: + fontkitten: 1.0.2 + + fontkitten@1.0.2: + dependencies: + tiny-inflate: 1.0.3 fsevents@2.3.3: optional: true - get-east-asian-width@1.3.0: {} + get-caller-file@2.0.5: {} - github-from-package@0.0.0: {} + get-east-asian-width@1.4.0: {} - github-slugger@2.0.0: {} + get-stream@5.2.0: + dependencies: + pump: 3.0.3 - glob-parent@5.1.2: + get-uri@6.0.5: dependencies: - is-glob: 4.0.3 + basic-ftp: 5.1.0 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color - graceful-fs@4.2.11: {} + github-slugger@2.0.0: {} - h3@1.15.0: + h3@1.15.5: dependencies: cookie-es: 1.2.2 - crossws: 0.3.4 + crossws: 0.3.5 defu: 6.1.4 - destr: 2.0.3 + destr: 2.0.5 iron-webcrypto: 1.2.1 - node-mock-http: 1.0.0 - ohash: 1.1.4 + node-mock-http: 1.0.4 radix3: 1.1.2 - ufo: 1.5.4 + ufo: 1.6.3 uncrypto: 0.1.3 has-flag@5.0.1: {} @@ -3044,24 +3438,24 @@ snapshots: hast-util-phrasing: 3.0.1 hast-util-whitespace: 3.0.0 html-whitespace-sensitive-tag-names: 3.0.1 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 6.0.2 hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 - hast-util-from-parse5: 8.0.2 - parse5: 7.2.1 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 vfile: 6.0.3 - vfile-message: 4.0.2 + vfile-message: 4.0.3 - hast-util-from-parse5@8.0.2: + hast-util-from-parse5@8.0.3: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 devlop: 1.1.0 - hastscript: 9.0.0 - property-information: 6.5.0 + hastscript: 9.0.1 + property-information: 7.1.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -3084,7 +3478,7 @@ snapshots: hast-util-embedded: 3.0.0 hast-util-is-element: 3.0.0 hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 hast-util-parse-selector@4.0.0: dependencies: @@ -3103,38 +3497,38 @@ snapshots: '@types/hast': 3.0.4 '@types/unist': 3.0.3 '@ungap/structured-clone': 1.3.0 - hast-util-from-parse5: 8.0.2 - hast-util-to-parse5: 8.0.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - parse5: 7.2.1 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-select@6.0.3: + hast-util-select@6.0.4: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 bcp-47-match: 2.0.3 comma-separated-tokens: 2.0.3 - css-selector-parser: 3.0.5 + css-selector-parser: 3.3.0 devlop: 1.1.0 direction: 2.0.1 hast-util-has-property: 3.0.0 hast-util-to-string: 3.0.1 hast-util-whitespace: 3.0.0 nth-check: 2.1.1 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 zwitch: 2.0.4 - hast-util-to-estree@3.1.1: + hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -3145,15 +3539,15 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.8 + style-to-js: 1.1.21 unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: - supports-color - hast-util-to-html@9.0.4: + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 @@ -3161,15 +3555,15 @@ snapshots: comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.2: + hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -3179,20 +3573,20 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.8 + style-to-js: 1.1.21 unist-util-position: 5.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color - hast-util-to-parse5@8.0.0: + hast-util-to-parse5@8.0.1: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -3212,12 +3606,12 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hastscript@9.0.0: + hastscript@9.0.1: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 html-escaper@3.0.3: {} @@ -3226,21 +3620,38 @@ snapshots: html-whitespace-sensitive-tag-names@3.0.1: {} - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color i18next@23.16.8: dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.28.6 ieee754@1.2.1: {} - import-meta-resolve@4.1.0: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 - inherits@2.0.4: {} + import-meta-resolve@4.2.0: {} - ini@1.3.8: {} + inline-style-parser@0.2.7: {} - inline-style-parser@0.2.4: {} + ip-address@10.1.0: {} iron-webcrypto@1.2.1: {} @@ -3253,76 +3664,56 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-arrayish@0.3.2: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 + is-arrayish@0.2.1: {} is-decimal@2.0.1: {} is-docker@3.0.0: {} - is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - is-hexadecimal@2.0.1: {} is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - is-number@7.0.0: {} - is-plain-obj@4.1.0: {} is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + js-tokens@4.0.0: {} - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 + json-parse-even-better-errors@2.3.1: {} + kleur@3.0.3: {} kleur@4.1.5: {} klona@2.0.6: {} - load-yaml-file@0.2.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 + lines-and-columns@1.2.4: {} longest-streak@3.1.0: {} - lru-cache@10.4.3: {} + lru-cache@11.2.5: {} + + lru-cache@7.18.3: {} - magic-string@0.30.17: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.5: + magicast@0.5.1: dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 source-map-js: 1.2.1 markdown-extensions@2.0.0: {} @@ -3333,7 +3724,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 mdast-util-directive@3.1.0: dependencies: @@ -3345,7 +3736,7 @@ snapshots: mdast-util-to-markdown: 2.1.2 parse-entities: 4.0.2 stringify-entities: 4.0.4 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 6.0.2 transitivePeerDependencies: - supports-color @@ -3353,22 +3744,22 @@ snapshots: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.1 + micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -3454,7 +3845,7 @@ snapshots: parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color @@ -3482,9 +3873,9 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 - mdast-util-to-hast@13.2.0: + mdast-util-to-hast@13.2.1: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -3493,7 +3884,7 @@ snapshots: micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 mdast-util-to-markdown@2.1.2: @@ -3505,18 +3896,20 @@ snapshots: mdast-util-to-string: 4.0.0 micromark-util-classify-character: 2.0.1 micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 zwitch: 2.0.4 mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 - merge2@1.4.1: {} + mdn-data@2.0.28: {} - micromark-core-commonmark@2.0.2: + mdn-data@2.12.2: {} + + micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -3529,9 +3922,9 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.0.4 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-directive@3.0.2: dependencies: @@ -3540,7 +3933,7 @@ snapshots: micromark-factory-whitespace: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 parse-entities: 4.0.2 micromark-extension-gfm-autolink-literal@2.1.0: @@ -3548,18 +3941,18 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-sanitize-uri: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-footnote@2.1.0: dependencies: devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-sanitize-uri: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-strikethrough@2.1.0: dependencies: @@ -3568,7 +3961,7 @@ snapshots: micromark-util-classify-character: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-table@2.1.1: dependencies: @@ -3576,11 +3969,11 @@ snapshots: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-tagfilter@2.0.0: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-task-list-item@2.1.0: dependencies: @@ -3588,7 +3981,7 @@ snapshots: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm@3.0.0: dependencies: @@ -3599,108 +3992,107 @@ snapshots: micromark-extension-gfm-tagfilter: 2.0.0 micromark-extension-gfm-task-list-item: 2.1.0 micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-mdx-expression@3.0.0: + micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.2 + micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.2 + micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-mdx-jsx@3.0.1: + micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.2 + micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.2 + micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - vfile-message: 4.0.2 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 micromark-extension-mdx-md@2.0.0: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.2 + micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.1 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 micromark-extension-mdxjs-esm: 3.0.0 micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-mdx-expression@2.0.2: + micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.2 + micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: @@ -3710,12 +4102,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -3723,23 +4115,22 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.3.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 micromark-util-encode@2.0.1: {} - micromark-util-events-to-acorn@2.0.2: + micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - vfile-message: 4.0.2 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 micromark-util-html-tag-name@2.0.1: {} @@ -3749,7 +4140,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -3757,24 +4148,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.4: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} + micromark-util-types@2.0.2: {} - micromark@4.0.1: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0 - decode-named-character-reference: 1.0.2 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -3784,46 +4175,31 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.4 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mimic-response@3.1.0: {} - - minimist@1.2.8: {} - - mkdirp-classic@0.5.3: {} + mitt@3.0.1: {} - mrmime@2.0.0: {} + mrmime@2.0.1: {} ms@2.1.3: {} - nanoid@3.3.8: {} - - napi-build-utils@2.0.0: {} + nanoid@3.3.11: {} neotraverse@0.6.18: {} + netmask@2.0.2: {} + nlcst-to-string@4.0.0: dependencies: '@types/nlcst': 2.0.3 - node-abi@3.74.0: - dependencies: - semver: 7.7.1 - - node-addon-api@6.1.0: {} + node-fetch-native@1.6.7: {} - node-fetch-native@1.6.6: {} - - node-mock-http@1.0.0: {} + node-mock-http@1.0.4: {} normalize-path@3.0.0: {} @@ -3831,63 +4207,87 @@ snapshots: dependencies: boolbase: 1.0.0 - ofetch@1.4.1: + ofetch@1.5.1: dependencies: - destr: 2.0.3 - node-fetch-native: 1.6.6 - ufo: 1.5.4 + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.3 - ohash@1.1.4: {} + ohash@2.0.11: {} once@1.4.0: dependencies: wrappy: 1.0.2 - oniguruma-to-es@2.3.0: - dependencies: - emoji-regex-xs: 1.0.0 - regex: 5.1.1 - regex-recursion: 5.1.1 + oniguruma-parser@0.12.1: {} - p-limit@2.3.0: + oniguruma-to-es@4.3.4: dependencies: - p-try: 2.2.0 + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 p-limit@6.2.0: dependencies: - yocto-queue: 1.1.1 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 + yocto-queue: 1.2.2 - p-queue@8.1.0: + p-queue@8.1.1: dependencies: - eventemitter3: 5.0.1 + eventemitter3: 5.0.4 p-timeout: 6.1.4 p-timeout@6.1.4: {} - p-try@2.2.0: {} + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + + package-manager-detector@1.6.0: {} - pagefind@1.3.0: + pagefind@1.4.0: optionalDependencies: - '@pagefind/darwin-arm64': 1.3.0 - '@pagefind/darwin-x64': 1.3.0 - '@pagefind/linux-arm64': 1.3.0 - '@pagefind/linux-x64': 1.3.0 - '@pagefind/windows-x64': 1.3.0 + '@pagefind/darwin-arm64': 1.4.0 + '@pagefind/darwin-x64': 1.4.0 + '@pagefind/freebsd-x64': 1.4.0 + '@pagefind/linux-arm64': 1.4.0 + '@pagefind/linux-x64': 1.4.0 + '@pagefind/windows-x64': 1.4.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.3.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parse-latin@7.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -3897,27 +4297,23 @@ snapshots: unist-util-visit-children: 3.0.0 vfile: 6.0.3 - parse5@7.2.1: + parse5@7.3.0: dependencies: - entities: 4.5.0 + entities: 6.0.1 + + pend@1.2.0: {} - path-exists@4.0.0: {} + piccolore@0.1.3: {} picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} - pify@4.0.1: {} - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - postcss-nested@6.2.0(postcss@8.5.2): + postcss-nested@6.2.0(postcss@8.5.6): dependencies: - postcss: 8.5.2 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -3925,114 +4321,124 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.2: + postcss@8.5.6: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.3: - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.74.0 - pump: 3.0.2 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.2 - tunnel-agent: 0.6.0 - - preferred-pm@4.1.1: - dependencies: - find-up-simple: 1.0.0 - find-yarn-workspace-root2: 1.2.16 - which-pm: 3.0.1 + prismjs@1.30.0: {} - prismjs@1.29.0: {} + progress@2.0.3: {} prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - property-information@6.5.0: {} + property-information@7.1.0: {} - pump@3.0.2: + proxy-agent@6.5.0: dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - queue-microtask@1.2.3: {} + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color - radix3@1.1.2: {} + proxy-from-env@1.1.0: {} - rc@1.2.8: + pump@3.0.3: dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 + end-of-stream: 1.4.5 + once: 1.4.0 - readable-stream@3.6.2: + puppeteer-autoscroll-down@2.0.1: {} + + puppeteer-core@23.11.1: dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 + '@puppeteer/browsers': 2.6.1 + chromium-bidi: 0.11.0(devtools-protocol@0.0.1367902) + debug: 4.4.3 + devtools-protocol: 0.0.1367902 + typed-query-selector: 2.12.0 + ws: 8.19.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate - readdirp@3.6.0: + puppeteer@23.11.1(typescript@5.7.3): dependencies: - picomatch: 2.3.1 + '@puppeteer/browsers': 2.6.1 + chromium-bidi: 0.11.0(devtools-protocol@0.0.1367902) + cosmiconfig: 9.0.0(typescript@5.7.3) + devtools-protocol: 0.0.1367902 + puppeteer-core: 23.11.1 + typed-query-selector: 2.12.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - typescript + - utf-8-validate + + radix3@1.1.2: {} + + readdirp@5.0.0: {} recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.0(acorn@8.14.0): + recma-jsx@1.0.1(acorn@8.15.0): dependencies: - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 unified: 11.0.5 - transitivePeerDependencies: - - acorn recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 - regenerator-runtime@0.14.1: {} - - regex-recursion@5.1.1: + regex-recursion@6.0.2: dependencies: - regex: 5.1.1 regex-utilities: 2.3.0 regex-utilities@2.3.0: {} - regex@5.1.1: + regex@6.1.0: dependencies: regex-utilities: 2.3.0 - rehype-expressive-code@0.40.2: + rehype-expressive-code@0.41.6: dependencies: - expressive-code: 0.40.2 + expressive-code: 0.41.6 rehype-format@5.0.1: dependencies: @@ -4053,16 +4459,16 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 - hast-util-to-estree: 3.1.1 + hast-util-to-estree: 3.1.3 transitivePeerDependencies: - supports-color rehype-stringify@10.0.1: dependencies: '@types/hast': 3.0.4 - hast-util-to-html: 9.0.4 + hast-util-to-html: 9.0.5 unified: 11.0.5 rehype@13.0.2: @@ -4092,7 +4498,7 @@ snapshots: transitivePeerDependencies: - supports-color - remark-mdx@3.1.0: + remark-mdx@3.1.1: dependencies: mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 @@ -4103,16 +4509,16 @@ snapshots: dependencies: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-rehype@11.1.1: + remark-rehype@11.1.2: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.2.0 + mdast-util-to-hast: 13.2.1 unified: 11.0.5 vfile: 6.0.3 @@ -4121,7 +4527,7 @@ snapshots: retext: 9.0.0 retext-smartypants: 6.2.0 unified: 11.0.5 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 remark-stringify@11.0.0: dependencies: @@ -4129,6 +4535,10 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} + retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -4139,7 +4549,7 @@ snapshots: dependencies: '@types/nlcst': 2.0.3 nlcst-to-string: 4.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 retext-stringify@4.0.0: dependencies: @@ -4154,129 +4564,127 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - reusify@1.0.4: {} - - rollup@4.34.7: + rollup@4.57.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.7 - '@rollup/rollup-android-arm64': 4.34.7 - '@rollup/rollup-darwin-arm64': 4.34.7 - '@rollup/rollup-darwin-x64': 4.34.7 - '@rollup/rollup-freebsd-arm64': 4.34.7 - '@rollup/rollup-freebsd-x64': 4.34.7 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.7 - '@rollup/rollup-linux-arm-musleabihf': 4.34.7 - '@rollup/rollup-linux-arm64-gnu': 4.34.7 - '@rollup/rollup-linux-arm64-musl': 4.34.7 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.7 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.7 - '@rollup/rollup-linux-riscv64-gnu': 4.34.7 - '@rollup/rollup-linux-s390x-gnu': 4.34.7 - '@rollup/rollup-linux-x64-gnu': 4.34.7 - '@rollup/rollup-linux-x64-musl': 4.34.7 - '@rollup/rollup-win32-arm64-msvc': 4.34.7 - '@rollup/rollup-win32-ia32-msvc': 4.34.7 - '@rollup/rollup-win32-x64-msvc': 4.34.7 + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-buffer@5.2.1: {} + sax@1.4.4: {} - sax@1.4.1: {} - - semver@7.7.1: {} - - sharp@0.32.6: - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - node-addon-api: 6.1.0 - prebuild-install: 7.1.3 - semver: 7.7.1 - simple-get: 4.0.1 - tar-fs: 3.0.8 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - bare-buffer + semver@7.7.3: {} - sharp@0.33.5: + sharp@0.34.5: dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.7.1 + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 - optional: true - - shiki@1.29.2: - dependencies: - '@shikijs/core': 1.29.2 - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/langs': 1.29.2 - '@shikijs/themes': 1.29.2 - '@shikijs/types': 1.29.2 + '@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 + + shiki@3.22.0: + dependencies: + '@shikijs/core': 3.22.0 + '@shikijs/engine-javascript': 3.22.0 + '@shikijs/engine-oniguruma': 3.22.0 + '@shikijs/langs': 3.22.0 + '@shikijs/themes': 3.22.0 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - simple-concat@1.0.1: {} - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - sisteransi@1.0.5: {} - sitemap@8.0.0: + sitemap@8.0.2: dependencies: '@types/node': 17.0.45 '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.4.1 + sax: 1.4.4 + + smart-buffer@4.2.0: {} + + smol-toml@1.6.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color - smol-toml@1.3.1: {} + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 source-map-js@1.2.1: {} - source-map@0.7.4: {} + source-map@0.6.1: + optional: true + + source-map@0.7.6: {} space-separated-tokens@2.0.2: {} - sprintf-js@1.0.3: {} + starlight-kbd@0.3.0(@astrojs/starlight@0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2))): + dependencies: + '@astrojs/starlight': 0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)) - starlight-links-validator@0.18.0(@astrojs/starlight@0.32.0(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0))): + starlight-links-validator@0.19.2(@astrojs/starlight@0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)))(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)): dependencies: - '@astrojs/starlight': 0.32.0(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0)) + '@astrojs/starlight': 0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)) '@types/picomatch': 3.0.2 + astro: 5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2) github-slugger: 2.0.0 hast-util-from-html: 2.0.3 hast-util-has-property: 3.0.0 @@ -4284,20 +4692,32 @@ snapshots: kleur: 4.1.5 mdast-util-mdx-jsx: 3.2.0 mdast-util-to-string: 4.0.0 - picomatch: 4.0.2 + picomatch: 4.0.3 terminal-link: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 transitivePeerDependencies: - supports-color + starlight-scroll-to-top@0.4.0(@astrojs/starlight@0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2))): + dependencies: + '@astrojs/starlight': 0.37.5(astro@5.17.1(@types/node@25.1.0)(rollup@4.57.1)(typescript@5.7.3)(yaml@2.8.2)) + + starlight-to-pdf@1.4.0(puppeteer-autoscroll-down@2.0.1)(puppeteer@23.11.1(typescript@5.7.3)): + dependencies: + puppeteer: 23.11.1(typescript@5.7.3) + puppeteer-autoscroll-down: 2.0.1 + yocto-spinner: 0.1.2 + stream-replace-string@2.0.0: {} - streamx@2.22.0: + streamx@2.23.0: dependencies: + events-universal: 1.0.1 fast-fifo: 1.3.2 text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.5.4 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a string-width@4.2.3: dependencies: @@ -4307,13 +4727,9 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 stringify-entities@4.0.4: dependencies: @@ -4324,96 +4740,108 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 - strip-bom@3.0.0: {} - - strip-json-comments@2.0.1: {} + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 - style-to-object@1.0.8: + style-to-object@1.0.14: dependencies: - inline-style-parser: 0.2.4 + inline-style-parser: 0.2.7 supports-color@10.2.2: {} - supports-hyperlinks@4.3.0: + supports-hyperlinks@4.4.0: dependencies: has-flag: 5.0.1 supports-color: 10.2.2 - tar-fs@2.1.2: + svgo@4.0.0: dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.2 - tar-stream: 2.2.0 + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.1.0 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.4.4 - tar-fs@3.0.8: + tar-fs@3.1.1: dependencies: - pump: 3.0.2 + pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.0.1 + bare-fs: 4.5.3 bare-path: 3.0.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 + - react-native-b4a tar-stream@3.1.7: dependencies: - b4a: 1.6.7 + b4a: 1.7.3 fast-fifo: 1.3.2 - streamx: 2.22.0 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a terminal-link@5.0.0: dependencies: - ansi-escapes: 7.1.1 - supports-hyperlinks: 4.3.0 + ansi-escapes: 7.2.0 + supports-hyperlinks: 4.4.0 text-decoder@1.2.3: dependencies: - b4a: 1.6.7 + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a + + through@2.3.8: {} - tinyexec@0.3.2: {} + tiny-inflate@1.0.3: {} - to-regex-range@5.0.1: + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: dependencies: - is-number: 7.0.0 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 trim-lines@3.0.1: {} trough@2.2.0: {} - tsconfck@3.1.5(typescript@5.7.3): + tsconfck@3.1.6(typescript@5.7.3): optionalDependencies: typescript: 5.7.3 - tslib@2.8.1: - optional: true + tslib@2.8.1: {} - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 + type-fest@4.41.0: {} - type-fest@4.34.1: {} + typed-query-selector@2.12.0: {} typescript@5.7.3: {} - ufo@1.5.4: {} + ufo@1.6.3: {} - ultrahtml@1.5.3: {} + ultrahtml@1.6.0: {} + + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 uncrypto@0.1.3: {} + undici-types@7.16.0: + optional: true + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -4424,12 +4852,18 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unifont@0.7.3: + dependencies: + css-tree: 3.1.0 + ofetch: 1.5.1 + ohash: 2.0.11 + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 - unist-util-is@6.0.0: + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -4449,7 +4883,7 @@ snapshots: unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 unist-util-stringify-position@4.0.0: dependencies: @@ -4459,27 +4893,27 @@ snapshots: dependencies: '@types/unist': 3.0.3 - unist-util-visit-parents@6.0.1: + unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 - unist-util-visit@5.0.0: + unist-util-visit@5.1.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 - unstorage@1.14.4: + unstorage@1.17.4: dependencies: anymatch: 3.1.3 - chokidar: 3.6.0 - destr: 2.0.3 - h3: 1.15.0 - lru-cache: 10.4.3 - node-fetch-native: 1.6.6 - ofetch: 1.4.1 - ufo: 1.5.4 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.5 + lru-cache: 11.2.5 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.3 util-deprecate@1.0.2: {} @@ -4488,7 +4922,7 @@ snapshots: '@types/unist': 3.0.3 vfile: 6.0.3 - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 @@ -4496,64 +4930,95 @@ snapshots: vfile@6.0.3: dependencies: '@types/unist': 3.0.3 - vfile-message: 4.0.2 + vfile-message: 4.0.3 - vite@6.1.0(yaml@2.7.0): + vite@6.4.1(@types/node@25.1.0)(yaml@2.8.2): dependencies: - esbuild: 0.24.2 - postcss: 8.5.2 - rollup: 4.34.7 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 optionalDependencies: + '@types/node': 25.1.0 fsevents: 2.3.3 - yaml: 2.7.0 + yaml: 2.8.2 - vitefu@1.0.5(vite@6.1.0(yaml@2.7.0)): + vitefu@1.1.1(vite@6.4.1(@types/node@25.1.0)(yaml@2.8.2)): optionalDependencies: - vite: 6.1.0(yaml@2.7.0) + vite: 6.4.1(@types/node@25.1.0)(yaml@2.8.2) web-namespaces@2.0.1: {} which-pm-runs@1.1.0: {} - which-pm@3.0.1: - dependencies: - load-yaml-file: 0.2.0 - widest-line@5.0.0: dependencies: string-width: 7.2.0 - wrap-ansi@9.0.0: + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} + ws@8.19.0: {} + xxhash-wasm@1.1.0: {} - yaml@2.7.0: {} + y18n@5.0.8: {} + + yaml@2.8.2: {} yargs-parser@21.1.1: {} - yocto-queue@1.1.1: {} + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@1.2.2: {} + + yocto-spinner@0.1.2: + dependencies: + yoctocolors: 2.1.2 - yocto-spinner@0.2.0: + yocto-spinner@0.2.3: dependencies: - yoctocolors: 2.1.1 + yoctocolors: 2.1.2 - yoctocolors@2.1.1: {} + yoctocolors@2.1.2: {} - zod-to-json-schema@3.24.1(zod@3.24.2): + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: - zod: 3.24.2 + zod: 3.25.76 - zod-to-ts@1.2.0(typescript@5.7.3)(zod@3.24.2): + zod-to-ts@1.2.0(typescript@5.7.3)(zod@3.25.76): dependencies: typescript: 5.7.3 - zod: 3.24.2 + zod: 3.25.76 + + zod@3.23.8: {} - zod@3.24.2: {} + zod@3.25.76: {} zwitch@2.0.4: {}