From a93c9825bdf92efa76ca5a5ac0c742c44d963c12 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Thu, 18 Jun 2026 23:00:44 +1000 Subject: [PATCH 01/20] Refine release process tagging --- docs/contributing/release-process.md | 38 ++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/docs/contributing/release-process.md b/docs/contributing/release-process.md index 8ef3deb..5fd7014 100644 --- a/docs/contributing/release-process.md +++ b/docs/contributing/release-process.md @@ -28,7 +28,9 @@ When in doubt, use `minor` — it signals new functionality without breaking exi ### When to assign the version -Version assignment happens **in the feature branch**, before the PR is opened. This makes the version bump part of the reviewed change, keeps the main branch clean of direct commits, and ensures the release pipeline only triggers after the change has been reviewed and approved. +Version assignment happens **in the feature branch**, before the PR is opened. This makes the version bump part of the reviewed change and keeps it visible in the PR diff. + +> **Important — squash merges**: GitHub squash-merges a PR into a single new commit on `main`. The version bump commit from the feature branch is **not** the commit that lands on `main`; the squash commit is. The release tag must point to the squash commit (a `main` commit), not the original feature branch commit. Step 5 below handles this. ### Prerequisites @@ -43,7 +45,7 @@ Version assignment happens **in the feature branch**, before the PR is opened. T node scripts/version.mjs patch # or minor, or major ``` - This updates `version` in all four `package.json` files, creates a git commit (`chore: release v`), and creates a local `v` tag. The tag stays local — do not push it yet. + This updates `version` in all four `package.json` files and creates a git commit (`chore: release v`). A local `v` tag is also created — you will re-create it after the squash merge in step 5. 2. **Push only the branch** (not the tag): @@ -55,7 +57,7 @@ Version assignment happens **in the feature branch**, before the PR is opened. T 3. **Open a pull request** targeting `main`. The PR must pass the quality gate CI and receive at least one maintainer approval before it can be merged (enforced by branch protection). -4. **After the PR is merged**, fetch and switch to main: +4. **After the PR is squash-merged**, fetch and switch to main: ```bash git fetch origin main @@ -63,21 +65,28 @@ Version assignment happens **in the feature branch**, before the PR is opened. T git pull origin main ``` -5. **Push the tag** to trigger the release pipeline: +5. **Re-create the tag** pointing to the squash merge commit (the current `HEAD` of `main`): + + ```bash + git tag -d v # delete the local tag that points to the feature branch commit + git tag v # create a fresh tag at the squash merge commit (current HEAD) + ``` + +6. **Push the tag** to trigger the release pipeline: ```bash git push origin v ``` - Pushing the tag triggers `.github/workflows/release.yml`. The pipeline first verifies that the tagged commit is on `main`; it will fail immediately if it is not. + Pushing the tag triggers `.github/workflows/release.yml`. The pipeline first verifies that the tagged commit is reachable from `main`; it will fail immediately if it is not. -6. **Approve the deployment** in GitHub Actions: +7. **Approve the deployment** in GitHub Actions: - Go to **Actions → Release** → the running workflow. - Under **Environments**, click **Review deployments** → **Approve**. -7. **Monitor the pipeline** — the workflow runs six quality gate stages (audit, lint, typecheck, coverage × 4, build), then publishes all four packages in dependency order, then creates a GitHub Release with notes generated from commit messages. +8. **Monitor the pipeline** — the workflow runs six quality gate stages (audit, lint, typecheck, coverage × 4, build), then publishes all four packages in dependency order, then creates a GitHub Release with notes generated from commit messages. -8. **Verify** the packages appear on npmjs.com under the `@dawmatt` scope and the GitHub Release description lists the changes. +9. **Verify** the packages appear on npmjs.com under the `@dawmatt` scope and the GitHub Release description lists the changes. --- @@ -92,6 +101,18 @@ Version assignment happens **in the feature branch**, before the PR is opened. T ## Recovery from a Failed Release +### Tag not on main (failed main-branch verification) + +The pipeline failed at "Verify tag is on main branch". This happens when the tag points to a feature branch commit that was not included in the squash merge. Delete the tag and re-create it at the squash merge commit: + +```bash +git tag -d v # delete local tag (points to wrong commit) +git push origin --delete v # delete remote tag +git checkout main && git pull origin main +git tag v # create fresh tag at squash merge commit +git push origin v # push to trigger release +``` + ### Pipeline failed before any packages published The quality gate caught a problem. No packages were published. Delete the tag, fix the issue in a new or updated branch, and re-release: @@ -104,6 +125,7 @@ node scripts/version.mjs patch # re-bump on the branch git push origin # push branch (not tag) # after PR is reviewed, approved, and merged: git checkout main && git pull origin main +git tag -d v 2>/dev/null; git tag v # re-create tag at squash merge commit git push origin v # push tag to trigger release ``` From beb8e0d46e04c1bb8bd8b7d6b34478f6ae67dbbb Mon Sep 17 00:00:00 2001 From: DawMatt Date: Thu, 18 Jun 2026 23:49:07 +1000 Subject: [PATCH 02/20] MCP server feature scoped and implementation planned --- .specify/feature.json | 2 +- .specify/memory/constitution.md | 33 +- CLAUDE.md | 2 +- GOAL.md | 1 + .../007-ai-support/checklists/requirements.md | 39 ++ specs/007-ai-support/contracts/mcp-tools.md | 334 ++++++++++++++++++ specs/007-ai-support/data-model.md | 165 +++++++++ specs/007-ai-support/plan.md | 125 +++++++ specs/007-ai-support/quickstart.md | 221 ++++++++++++ specs/007-ai-support/research.md | 218 ++++++++++++ specs/007-ai-support/spec.md | 146 ++++++++ specs/007-ai-support/tasks.md | 207 +++++++++++ 12 files changed, 1478 insertions(+), 15 deletions(-) create mode 100644 specs/007-ai-support/checklists/requirements.md create mode 100644 specs/007-ai-support/contracts/mcp-tools.md create mode 100644 specs/007-ai-support/data-model.md create mode 100644 specs/007-ai-support/plan.md create mode 100644 specs/007-ai-support/quickstart.md create mode 100644 specs/007-ai-support/research.md create mode 100644 specs/007-ai-support/spec.md create mode 100644 specs/007-ai-support/tasks.md diff --git a/.specify/feature.json b/.specify/feature.json index 50e7c2e..632bf0f 100644 --- a/.specify/feature.json +++ b/.specify/feature.json @@ -1,3 +1,3 @@ { - "feature_directory": "specs/006-publish-npmjs" + "feature_directory": "specs/007-ai-support" } diff --git a/.specify/memory/constitution.md b/.specify/memory/constitution.md index 17bdbc3..0656ab4 100644 --- a/.specify/memory/constitution.md +++ b/.specify/memory/constitution.md @@ -1,28 +1,24 @@ @@ -117,6 +113,17 @@ Diagnostic output MUST explain *why* a finding matters, not just *what* was foun **Rationale**: A tool that only scores an API without explaining the reasoning does not help developers improve their practice. +## AI Integration Requirements + +The following constraints apply to any feature that delivers AI tooling integration: + +- Any AI integration capability MUST be explicitly verified to function with **Claude Code**, **GitHub Copilot (VS Code Agent mode)**, and **GitHub Copilot Studio** as the three primary supported targets. +- An implementation that functions in only a subset of these three environments does not satisfy this requirement. +- MCP tool definitions MUST be self-describing: any capable MCP host MUST be able to discover and invoke all tools using only the tool definitions, with no additional documentation or configuration required beyond registering the server. +- All prerequisites for AI integration MUST have zero monetary cost, consistent with Principle V. + +**Rationale**: AI tooling is rapidly diversifying across agentic IDEs, coding assistants, and enterprise agent platforms. Anchoring verification to a concrete set of three tools (covering CLI/agentic, IDE, and enterprise Copilot scenarios) prevents narrow implementations that work only in the tool the author happened to test against. + ## CI/CD Integration Requirements The CLI MUST be usable in CI/CD pipelines. The following constraints apply to any @@ -168,4 +175,4 @@ All pull requests and code reviews MUST verify compliance with the principles ab Complexity violations MUST be recorded in the plan's Complexity Tracking table with explicit justification. -**Version**: 1.3.0 | **Ratified**: 2026-06-12 | **Last Amended**: 2026-06-18 +**Version**: 1.4.0 | **Ratified**: 2026-06-12 | **Last Amended**: 2026-06-18 diff --git a/CLAUDE.md b/CLAUDE.md index f413af7..7bc5146 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,5 +1,5 @@ For additional context about technologies to be used, project structure, shell commands, and other important information, read the current plan -at specs/006-publish-npmjs/plan.md +at specs/007-ai-support/plan.md diff --git a/GOAL.md b/GOAL.md index 4dee2ca..b842cd2 100644 --- a/GOAL.md +++ b/GOAL.md @@ -63,6 +63,7 @@ Feature 7 - AI support - Support all of the standard functions of the api-grade CLI, including: grading an API (both overall and detailed levels), and asserting whether an API is at or above a particular grade (e.g. >= C) - Use the api-grade's JSON format output so the AI is able to process and reformat the information in a way that suits its requirements - Leverage the AI support to not just grade the API, but also resolve the "non-breaking change" issues highlighted by the grading that are bringing down the result +- Any AI tooling support must explicitly include Claude Code, GitHub Copilot and Copilot Studio ## Constitution diff --git a/specs/007-ai-support/checklists/requirements.md b/specs/007-ai-support/checklists/requirements.md new file mode 100644 index 0000000..938174b --- /dev/null +++ b/specs/007-ai-support/checklists/requirements.md @@ -0,0 +1,39 @@ +# Specification Quality Checklist: AI Support for LLMs and Agentic Tooling + +**Purpose**: Validate specification completeness and quality before proceeding to planning +**Created**: 2026-06-18 +**Feature**: [spec.md](../spec.md) + +## Content Quality + +- [x] No implementation details (languages, frameworks, APIs) +- [x] Focused on user value and business needs +- [x] Written for non-technical stakeholders +- [x] All mandatory sections completed + +## Requirement Completeness + +- [x] No [NEEDS CLARIFICATION] markers remain +- [x] Requirements are testable and unambiguous +- [x] Success criteria are measurable +- [x] Success criteria are technology-agnostic (no implementation details) +- [x] All acceptance scenarios are defined +- [x] Edge cases are identified +- [x] Scope is clearly bounded +- [x] Dependencies and assumptions identified + +## Feature Readiness + +- [x] All functional requirements have clear acceptance criteria +- [x] User scenarios cover primary flows +- [x] Feature meets measurable outcomes defined in Success Criteria +- [x] No implementation details leak into specification + +## Notes + +- All items passed on first validation pass (2026-06-18). +- All items remain passing after clarification session (2026-06-18) — 16/16. +- MCP (Model Context Protocol) is named throughout the spec as a deliberate architectural decision (clarified in session), consistent with the project pattern of naming integration targets (e.g., Backstage in Feature 4). +- "Non-breaking violation" is now precisely defined in FR-007: any fix that does not alter paths, methods, required parameters, schema types, or response structures. +- Large spec handling defined: best-effort grading with a warning field when threshold is exceeded (FR-013). +- Concurrent requests: explicitly supported, bounded by system resources (Assumptions). diff --git a/specs/007-ai-support/contracts/mcp-tools.md b/specs/007-ai-support/contracts/mcp-tools.md new file mode 100644 index 0000000..6bcec31 --- /dev/null +++ b/specs/007-ai-support/contracts/mcp-tools.md @@ -0,0 +1,334 @@ +# MCP Tool Contracts: api-grade + +**Server name**: `api-grade` +**Package**: `@dawmatt/api-grade-mcp` +**Transport**: stdio (local) +**Date**: 2026-06-18 + +--- + +## Tool 1: `grade-api` + +**Purpose**: Grade an API specification and return an overall quality score, letter grade, and diagnostic summary. Returns a token-efficient summary without the full violations list. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "specPath": { + "type": "string", + "description": "Absolute or relative path to the OpenAPI or AsyncAPI specification file (YAML or JSON)" + }, + "rulesetPath": { + "type": "string", + "description": "Optional path to a custom Spectral-compatible ruleset file. If omitted, the default api-grade ruleset is used." + } + }, + "required": ["specPath"] +} +``` + +**Output** (JSON serialised into MCP text content): + +```json +{ + "specPath": "/path/to/petstore.yaml", + "format": "openapi-3", + "letterGrade": "C", + "gradeLabel": "Fair", + "numericScore": 67, + "summary": { + "tone": "Needs attention", + "severityLevel": "warn", + "errorCount": 0, + "warnCount": 14, + "infoCount": 3, + "hintCount": 0, + "commentary": "14 warnings across the specification. Operations and schemas are the primary areas needing work.", + "text": "Grade C (67%) — Needs attention. 14 warnings found. Focus on operations first.", + "focusRules": ["operation-description", "operation-summary"], + "recommendations": [ + "Add descriptions to all operations", + "Add summaries to the 8 operations missing them" + ] + }, + "rulesetSource": "default" +} +``` + +**Error response** (returned as MCP error with `isError: true`): + +```json +{ + "error": "SPEC_NOT_FOUND", + "message": "The specification file '/path/to/missing.yaml' does not exist. Check the path and try again.", + "input": { "specPath": "/path/to/missing.yaml" } +} +``` + +**Example invocation** (for AI tool documentation): + +> Grade the API at `/workspace/api/openapi.yaml` using the default ruleset. + +--- + +## Tool 2: `grade-api-detailed` + +**Purpose**: Grade an API specification and return the full result including all individual violations, per-category breakdowns, and prioritised recommendations. Use this when the AI needs to analyse specific violations or present detailed findings to the user. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "specPath": { + "type": "string", + "description": "Absolute or relative path to the OpenAPI or AsyncAPI specification file (YAML or JSON)" + }, + "rulesetPath": { + "type": "string", + "description": "Optional path to a custom Spectral-compatible ruleset file" + } + }, + "required": ["specPath"] +} +``` + +**Output** (full `GradeResult` with diagnostics): + +```json +{ + "specPath": "/path/to/petstore.yaml", + "format": "openapi-3", + "letterGrade": "C", + "gradeLabel": "Fair", + "numericScore": 67, + "summary": { "...": "same as grade-api summary" }, + "diagnostics": [ + { + "ruleId": "operation-description", + "message": "Operation must have a description", + "severity": 1, + "path": ["paths", "/pets", "get"], + "range": { "start": { "line": 12, "character": 4 }, "end": { "line": 12, "character": 7 } }, + "source": "/path/to/petstore.yaml" + } + ], + "rulesetSource": "default", + "truncated": false +} +``` + +**Large spec behaviour**: When the specification exceeds 500KB, `diagnostics` is truncated to the first 100 entries and `truncated: true` is set. A `largeSpecWarning` field is added to the response. + +**Error responses**: Same error codes as `grade-api`. + +--- + +## Tool 3: `assert-api-grade` + +**Purpose**: Assert that an API specification meets a minimum grade threshold. Returns a structured pass/fail result. Use this in AI-assisted code review workflows or quality gates. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "specPath": { + "type": "string", + "description": "Absolute or relative path to the OpenAPI or AsyncAPI specification file" + }, + "minimumGrade": { + "type": "string", + "enum": ["A", "B", "C", "D", "F"], + "description": "The minimum acceptable grade. The assertion passes if the actual grade is equal to or better than this value (A > B > C > D > F)." + }, + "rulesetPath": { + "type": "string", + "description": "Optional path to a custom Spectral-compatible ruleset file" + } + }, + "required": ["specPath", "minimumGrade"] +} +``` + +**Output**: + +```json +{ + "passed": false, + "actual": "D", + "minimum": "B", + "specPath": "/path/to/petstore.yaml", + "numericScore": 54 +} +``` + +**Grade ordering**: A (best) > B > C > D > F (worst). An assertion for minimum C passes if actual is A, B, or C. + +**Error responses**: + +```json +{ + "error": "INVALID_GRADE", + "message": "Invalid minimumGrade 'X'. Must be one of: A, B, C, D, F.", + "input": { "minimumGrade": "X" } +} +``` + +**Example invocations**: + +> Assert that `/workspace/api/openapi.yaml` is at least grade C. +> +> Check whether the API at `/project/api.yaml` meets the minimum grade B requirement. + +--- + +## Tool 4: `get-non-breaking-violations` + +**Purpose**: Return a classified, AI-actionable list of non-breaking violations in an API specification. Non-breaking violations are those whose fixes do not alter the API's interface contract (paths, methods, required parameters, schema types, or response structures). Use this tool to obtain the list of issues for the AI to resolve — the AI then generates the corrected specification content. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "specPath": { + "type": "string", + "description": "Absolute or relative path to the OpenAPI or AsyncAPI specification file" + }, + "rulesetPath": { + "type": "string", + "description": "Optional path to a custom Spectral-compatible ruleset file" + } + }, + "required": ["specPath"] +} +``` + +**Output**: + +```json +{ + "specPath": "/path/to/petstore.yaml", + "format": "openapi-3", + "totalViolations": 17, + "nonBreakingCount": 11, + "nonBreakingViolations": [ + { + "ruleId": "operation-description", + "message": "Operation must have a description", + "severity": "warn", + "path": ["paths", "/pets", "get"], + "location": "paths./pets.get", + "currentValue": null, + "expectedImprovement": "Add a `description` field that explains what this GET /pets operation does and when to use it" + }, + { + "ruleId": "info-description", + "message": "Info must have a description", + "severity": "warn", + "path": ["info"], + "location": "info", + "currentValue": null, + "expectedImprovement": "Add a `description` field to the info block that describes the purpose and audience of this API" + } + ] +} +``` + +**When no non-breaking violations exist**: + +```json +{ + "specPath": "/path/to/museum.yaml", + "format": "openapi-3", + "totalViolations": 2, + "nonBreakingCount": 0, + "nonBreakingViolations": [] +} +``` + +**Large spec behaviour**: Same as `grade-api-detailed` — best-effort result with `largeSpecWarning` field. + +**Error responses**: Same error codes as `grade-api`. + +**Two-step workflow note** (for AI tool documentation): + +> This tool identifies and classifies non-breaking violations. After calling this tool, the AI model generates corrections to the specification content based on the returned list. The MCP server does not modify the specification file; the AI applies the changes. + +--- + +## MCP Host Configuration + +To use this server in a supported MCP host, add the following to its configuration: + +**Claude Code** (terminal — registers globally): + +```sh +claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp +``` + +Or add to `.claude/settings.json`: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +**Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json`): + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +**GitHub Copilot — VS Code** (`.vscode/mcp.json` in project root, requires VS Code 1.99+): + +```json +{ + "servers": { + "api-grade": { + "type": "stdio", + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +Tools are available in Copilot Chat **Agent mode** only (not inline completions). + +**GitHub Copilot Studio**: Add as a custom MCP Action with command `npx`, arguments `-y @dawmatt/api-grade-mcp`, and transport `stdio`. See the [quickstart](../quickstart.md) for details. + +**Cursor** (`.cursor/mcp.json` in project root, or `~/.cursor/mcp.json` globally): + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +Once configured and restarted, the AI tool will discover all four tools automatically via MCP's tool-listing protocol (SC-006). diff --git a/specs/007-ai-support/data-model.md b/specs/007-ai-support/data-model.md new file mode 100644 index 0000000..3c8d771 --- /dev/null +++ b/specs/007-ai-support/data-model.md @@ -0,0 +1,165 @@ +# Data Model: AI Support for LLMs and Agentic Tooling + +**Phase**: 1 | **Date**: 2026-06-18 | **Plan**: [plan.md](./plan.md) + +## Overview + +The MCP server introduces no new persistent entities. All domain types originate in `@dawmatt/api-grade-core` and are either passed through directly or projected into MCP-specific response shapes. This document defines the projections and the one net-new type (`NonBreakingViolation`). + +--- + +## Entities from `api-grade-core` (pass-through) + +These types are defined in `packages/api-grade-core/src/types.ts` and consumed unchanged by the MCP server. The MCP server does **not** redefine them. + +### GradeResult + +The primary output of a grade operation. + +| Field | Type | Description | +|---|---|---| +| `specPath` | `string` | Absolute path of the graded specification | +| `format` | `ApiFormat` | Detected format: `openapi-2`, `openapi-3`, `asyncapi-2`, `asyncapi-3` | +| `letterGrade` | `LetterGrade` | A / B / C / D / F | +| `gradeLabel` | `string` | Human label: "Excellent", "Good", "Fair", "Poor", "Critical" | +| `numericScore` | `number` | 0–100 percentage | +| `summary` | `DiagnosticSummary` | Tone, severity level, counts, commentary, recommendations | +| `diagnostics` | `Diagnostic[]` | Full violation list (all severities) | +| `rulesetSource` | `string` | Which ruleset was applied | +| `rulesetPath?` | `string` | Custom ruleset path if provided | + +### Diagnostic + +An individual violation from the Spectral linter. + +| Field | Type | Description | +|---|---|---| +| `ruleId` | `string` | Spectral rule ID (e.g. `operation-description`) | +| `message` | `string` | Human-readable violation message | +| `severity` | `0 \| 1 \| 2 \| 3` | 0=error, 1=warn, 2=info, 3=hint | +| `path` | `string[]` | JSON pointer segments to the offending location | +| `range` | `object` | Source line/column range | +| `source` | `string \| undefined` | Source file reference | + +### DiagnosticSummary + +The processed interpretation of the full diagnostic set. + +| Field | Type | Description | +|---|---|---| +| `tone` | `string` | Overall tone descriptor (e.g. "Critical condition") | +| `severityLevel` | `string` | Primary concern severity | +| `errorCount` | `number` | Count of severity-0 violations | +| `warnCount` | `number` | Count of severity-1 violations | +| `infoCount` | `number` | Count of severity-2 violations | +| `hintCount` | `number` | Count of severity-3 violations | +| `commentary` | `string` | Volume-aware narrative about findings | +| `text` | `string` | Combined human-readable summary | +| `focusRules` | `string[]` | Rule IDs with the highest impact | +| `recommendations` | `string[]` | Prioritised next steps | + +### GradeRequest (input to core) + +| Field | Type | Description | +|---|---|---| +| `specPath` | `string` | Path to the specification file | +| `rulesetPath?` | `string` | Optional path to custom Spectral ruleset | + +--- + +## Net-New Types (defined in `api-grade-mcp`) + +### NonBreakingViolation + +A single non-breaking violation, enriched with AI-actionable context (per FR-012). + +| Field | Type | Required | Description | +|---|---|---|---| +| `ruleId` | `string` | ✅ | Spectral rule that triggered this violation | +| `message` | `string` | ✅ | Original violation message from Spectral | +| `severity` | `"error" \| "warn" \| "info" \| "hint"` | ✅ | Severity label (mapped from numeric Spectral severity) | +| `path` | `string[]` | ✅ | JSON pointer segments: `["paths", "/pets", "get", "description"]` | +| `location` | `string` | ✅ | Dot-joined path for human readability: `paths./pets.get.description` | +| `currentValue` | `string \| null` | ✅ | Current value at the path if readable, else `null` | +| `expectedImprovement` | `string` | ✅ | Instruction for the AI: what to add or change | + +**Validation rules**: +- `path` must have at least one segment +- `currentValue` is `null` when the field is absent (missing field violations), not when the value is empty string +- `expectedImprovement` is derived by the classifier; never empty + +### NonBreakingViolationResult + +The top-level response shape for the `get-non-breaking-violations` tool. + +| Field | Type | Required | Description | +|---|---|---|---| +| `specPath` | `string` | ✅ | Path of the analysed specification | +| `format` | `ApiFormat` | ✅ | Detected specification format | +| `totalViolations` | `number` | ✅ | Total violations found (all severities) | +| `nonBreakingCount` | `number` | ✅ | Count of non-breaking violations in the result | +| `nonBreakingViolations` | `NonBreakingViolation[]` | ✅ | Classified, AI-actionable list | +| `largeSpecWarning?` | `string` | — | Present when spec exceeds 500KB threshold | + +--- + +## MCP Tool Response Projections + +### GradeSummaryResponse (used by `grade-api`) + +Projected from `GradeResult`; diagnostics array excluded to reduce token usage. + +| Field | Source | Description | +|---|---|---| +| `specPath` | `GradeResult.specPath` | | +| `format` | `GradeResult.format` | | +| `letterGrade` | `GradeResult.letterGrade` | | +| `gradeLabel` | `GradeResult.gradeLabel` | | +| `numericScore` | `GradeResult.numericScore` | | +| `summary` | `GradeResult.summary` | Full DiagnosticSummary | +| `rulesetSource` | `GradeResult.rulesetSource` | | +| `largeSpecWarning?` | computed | Present when spec > 500KB | + +### AssertionResult (used by `assert-api-grade`) + +| Field | Type | Description | +|---|---|---| +| `passed` | `boolean` | Whether `actual >= minimum` (using LETTER_GRADE_ORDER) | +| `actual` | `LetterGrade` | Grade the specification achieved | +| `minimum` | `LetterGrade` | Grade that was asserted as the minimum | +| `specPath` | `string` | Path of the specification | +| `numericScore` | `number` | Numeric score for additional context | + +--- + +## State Model + +All operations are stateless. There is no session, no cache, and no file written by the MCP server. Each tool invocation: + +1. Receives input via MCP stdio +2. Constructs a `GradeRequest` +3. Instantiates `GradeEngine` (or reuses a singleton — TBD in implementation; either is valid given statelesness) +4. Returns a projected JSON response +5. Retains nothing after the response is sent + +--- + +## Error Shapes + +Structured errors are returned as MCP tool errors (not thrown exceptions). All error responses include: + +| Field | Type | Description | +|---|---|---| +| `error` | `string` | Machine-readable error code (e.g. `SPEC_NOT_FOUND`) | +| `message` | `string` | Human-readable explanation for the AI to relay | +| `input` | `object` | Echo of the invalid input (for debugging) | + +**Error codes**: + +| Code | Trigger condition | +|---|---| +| `SPEC_NOT_FOUND` | `specPath` does not exist on the filesystem | +| `SPEC_PARSE_ERROR` | Specification is syntactically invalid (unparseable) | +| `RULESET_NOT_FOUND` | `rulesetPath` was provided but does not exist | +| `INVALID_GRADE` | `minimumGrade` is not one of A/B/C/D/F | +| `GRADE_ENGINE_ERROR` | Unexpected error from GradeEngine (wrapped with details) | diff --git a/specs/007-ai-support/plan.md b/specs/007-ai-support/plan.md new file mode 100644 index 0000000..a000bf8 --- /dev/null +++ b/specs/007-ai-support/plan.md @@ -0,0 +1,125 @@ +# Implementation Plan: AI Support for LLMs and Agentic Tooling + +**Branch**: `007-ai-support` | **Date**: 2026-06-18 | **Spec**: [spec.md](./spec.md) + +**Input**: Feature specification from `specs/007-ai-support/spec.md` + +## Summary + +Deliver a new npm package (`@dawmatt/api-grade-mcp`) that exposes api-grade capabilities as an MCP (Model Context Protocol) server, allowing LLMs and agentic AI tooling to grade API specifications, retrieve detailed diagnostics, assert grade thresholds, and obtain a classified list of non-breaking violations — all by calling the existing `@dawmatt/api-grade-core` package. The three explicitly required and verified target environments are **Claude Code**, **GitHub Copilot (VS Code Agent mode)**, and **GitHub Copilot Studio**. The MCP server runs locally via stdio transport, satisfies the zero-cost prerequisite constraint, and supports concurrent requests without stateful coupling between them. + +## Technical Context + +**Language/Version**: TypeScript 5.4, Node.js ≥ 20.0.0 (ESM) + +**Package Manager**: Yarn 1.22 (classic workspaces); new package added at `packages/api-grade-mcp` + +**Primary Dependencies**: +- `@modelcontextprotocol/sdk` — official MCP server SDK; provides `McpServer`, `StdioServerTransport`, and Zod-based tool registration +- `@dawmatt/api-grade-core` — consumed as a workspace dependency; provides `GradeEngine`, all types, and `gradeToNumber` / `LETTER_GRADE_ORDER` utilities +- `zod` — schema definition for MCP tool input validation (used by MCP SDK) + +**Storage**: N/A — stateless per-request; no database or file storage + +**Testing**: Vitest + `@vitest/coverage-v8` (consistent with existing packages) + +**Target Platform**: Node.js 20+ local execution (started by MCP host via `npx` or direct binary) + +**Project Type**: MCP server — new fourth package in the monorepo, published to npmjs as `@dawmatt/api-grade-mcp` + +**Performance Goals**: End-to-end grade request completes in under 10 seconds for a typical API specification (per SC-001); consistent with existing CLI performance on the same input + +**Constraints**: All prerequisites free (constitution V); stateless concurrent requests; no outbound network calls from the MCP protocol layer (local stdio transport) + +**Verified AI Targets**: Claude Code, GitHub Copilot (VS Code Agent mode), GitHub Copilot Studio — all three must be explicitly verified (FR-014) + +**Scale/Scope**: Local developer tooling; single developer per session; concurrent requests bounded only by available system resources + +## Constitution Check + +*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.* + +| Principle | Status | Notes | +|-----------|--------|-------| +| I. Multi-Format API Support | ✅ Pass | Delegates entirely to `api-grade-core`; OpenAPI and AsyncAPI support is inherited, not reimplemented | +| II. Core-First Architecture | ✅ Pass | MCP server wraps `GradeEngine` from `api-grade-core`; zero logic duplication | +| III. Spectral-Ruleset Based Grading | ✅ Pass | Custom ruleset path forwarded to `GradeEngine` via FR-006; default ruleset behaviour unchanged | +| IV. Test-Driven Quality | ✅ Pass | Vitest suite required; must cover all four tools, both API formats, error paths, and non-breaking classification | +| V. Cross-Platform & Zero-Cost Prerequisites | ✅ Pass | MCP protocol is free; `@modelcontextprotocol/sdk` is MIT-licensed; local stdio transport requires no network | +| VI. Educational Excellence | ✅ Pass | FR-010 requires complete tool descriptions so AI tools understand *why* findings matter; SC-006 requires self-describing tool definitions | +| CI/CD Integration | ✅ Pass | New package added to existing CI quality gate; coverage threshold applied consistently | +| YAGNI | ✅ Pass | No remote URL spec fetching (stretch goal per spec Assumptions); no SSE transport; no resource/prompt MCP surfaces — only the four required tools | +| AI Integration Requirements | ✅ Pass | FR-014 requires explicit verification in Claude Code, GitHub Copilot (VS Code), and Copilot Studio; all three are in-scope targets | +| Development Workflow | ✅ Pass | Feature branch + PR; new package integrated into quality gate | + +**Post-Phase-1 re-check**: Confirm tool contracts align with `GradeResult` and `Diagnostic` types from `api-grade-core` without requiring changes to the core package. + +## Project Structure + +### Documentation (this feature) + +```text +specs/007-ai-support/ +├── plan.md # This file +├── research.md # Phase 0 decisions +├── data-model.md # Entity definitions and type mappings +├── quickstart.md # MCP server setup and AI tool configuration +├── contracts/ +│ └── mcp-tools.md # All four MCP tool definitions (schemas + examples) +└── tasks.md # Generated by /speckit-tasks +``` + +### Source Code (additions this feature) + +```text +packages/api-grade-mcp/ +├── src/ +│ ├── index.ts # Entry point: creates McpServer, registers tools, connects stdio transport +│ ├── server.ts # McpServer factory (exported for testing) +│ ├── tools/ +│ │ ├── grade.ts # grade-api tool +│ │ ├── grade-detailed.ts # grade-api-detailed tool +│ │ ├── assert-grade.ts # assert-api-grade tool +│ │ └── non-breaking.ts # get-non-breaking-violations tool +│ └── utils/ +│ ├── classify.ts # Non-breaking violation classifier +│ └── errors.ts # Structured MCP error response helpers +├── tests/ +│ ├── unit/ +│ │ └── classify.test.ts # Classifier unit tests +│ └── integration/ +│ ├── grade.test.ts +│ ├── grade-detailed.test.ts +│ ├── assert-grade.test.ts +│ └── non-breaking.test.ts +├── package.json # @dawmatt/api-grade-mcp; bin: api-grade-mcp +└── tsconfig.json +``` + +**Structure Decision**: New package follows the existing monorepo pattern at `packages/api-grade-mcp`. Each of the four MCP tools is isolated in its own file. The non-breaking classifier lives in `utils/classify.ts` — the only net-new business logic (all grading logic stays in `api-grade-core`). Server instantiation is extracted to `server.ts` so integration tests can construct the server without starting stdio transport. + +## Quality Gate Requirement (Constitution Constraint — Automatically Enforced) + +This constraint is enforced by a **mandatory `after_implement` hook** registered in +`.specify/extensions.yml` (`speckit.quality-gate`). After every `/speckit-implement` +invocation, the hook runs automatically and blocks the Completion Report if any stage +fails. + +Per the constitution's Development Workflow section, `/speckit-implement` MUST NOT +report any task or phase complete until all CI quality gate stages pass locally: + +```sh +npm audit --audit-level=high --omit=dev +npm run lint +npm run typecheck --workspaces --if-present +npm run test:coverage +yarn workspace api-grade-mcp run test:coverage +npm run build --workspaces --if-present +``` + +If any stage exits non-zero, the task is **not done**. Fix the failure, re-run the +gate, and only then mark the task complete and commit. + +## Complexity Tracking + +No constitution violations. New package is the minimum required to expose MCP tools without duplicating core logic; no premature abstractions introduced. diff --git a/specs/007-ai-support/quickstart.md b/specs/007-ai-support/quickstart.md new file mode 100644 index 0000000..680ab00 --- /dev/null +++ b/specs/007-ai-support/quickstart.md @@ -0,0 +1,221 @@ +# Quickstart: AI Support (MCP Server) + +This guide explains how to install and configure the `@dawmatt/api-grade-mcp` server so +AI tools (Claude Desktop, Cursor, Windsurf, etc.) can grade API specifications directly. + +--- + +## Prerequisites + +- **Node.js 20 or later** — [nodejs.org](https://nodejs.org) +- An MCP-compatible AI tool (Claude Desktop, Cursor, Windsurf, or any tool supporting MCP) +- An OpenAPI or AsyncAPI specification file to grade + +All prerequisites are free (zero monetary cost). + +--- + +## Installation + +No global install is required. The server runs via `npx`: + +```sh +npx @dawmatt/api-grade-mcp +``` + +Or install globally if you prefer: + +```sh +npm install -g @dawmatt/api-grade-mcp +``` + +--- + +## Configure Your AI Tool + +### Claude Desktop + +1. Open the configuration file at: + - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` + - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` + +2. Add the `api-grade` server entry: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +3. Restart Claude Desktop. The four api-grade tools will appear in the tools panel. + +### Claude Code + +1. Register the server from the terminal: + +```sh +claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp +``` + + Or add it to `.claude/settings.json` manually: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +2. The tools are available immediately in your Claude Code session. Ask Claude to grade an API and it will invoke the server automatically. + +### GitHub Copilot (VS Code) + +Requires VS Code 1.99 or later with the GitHub Copilot extension. + +1. Create or open `.vscode/mcp.json` in your project root (for project-scoped setup) or add to your VS Code user settings (for global setup): + +```json +{ + "servers": { + "api-grade": { + "type": "stdio", + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +2. Open the Copilot Chat panel and switch to **Agent mode** (`@workspace` or the agent picker). + +3. The api-grade tools are now available to Copilot in agent mode. Ask Copilot to grade an API and it will invoke the tools automatically. + +### GitHub Copilot Studio + +Copilot Studio supports MCP servers as custom actions. Use this approach to expose api-grade capabilities in a Copilot Studio agent or declarative agent. + +1. In your Copilot Studio agent, add a new **Action** of type **MCP Server**. + +2. Configure the action with: + - **Name**: `api-grade` + - **Command**: `npx` + - **Arguments**: `-y @dawmatt/api-grade-mcp` + - **Transport**: stdio + +3. Publish the agent. The four api-grade tools will be available as callable actions within the agent's skill set. + +> For Copilot Studio agents deployed to Microsoft 365 Copilot, ensure the environment running the agent has Node.js 20+ available and network access to npmjs if using `npx`. For air-gapped environments, install `@dawmatt/api-grade-mcp` locally and reference the binary path directly. + +### Cursor + +1. Open Cursor Settings → MCP, or add a file at: + - **Project-level**: `.cursor/mcp.json` in your project root + - **Global**: `~/.cursor/mcp.json` + +2. Add the entry: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +3. Reload Cursor. + +### Windsurf + +Follow Windsurf's MCP configuration guide and add the same `api-grade` server entry shown above. + +--- + +## Available Tools + +Once configured, the AI tool has access to four api-grade capabilities: + +| Tool | What it does | +|---|---| +| `grade-api` | Quick grade: letter grade, score, and summary | +| `grade-api-detailed` | Full grade with all violations and recommendations | +| `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | +| `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | + +--- + +## Usage Examples + +Once your AI tool is configured, ask it naturally: + +### Grade an API + +> Grade the API at `/workspace/my-api/openapi.yaml` + +The AI calls `grade-api` and presents the result — letter grade, score, and what to improve. + +### Get detailed diagnostics + +> Show me all the violations in `/workspace/my-api/openapi.yaml` with recommendations + +The AI calls `grade-api-detailed` and summarises the findings. + +### Assert a minimum grade + +> Check whether `/workspace/my-api/openapi.yaml` meets a minimum grade of B + +The AI calls `assert-api-grade` with `minimumGrade: "B"` and reports pass or fail. + +### AI-assisted fix of non-breaking issues + +> Fix the non-breaking issues in `/workspace/my-api/openapi.yaml` + +The AI calls `get-non-breaking-violations`, receives the classified list, and generates +corrections for the fixable issues — adding missing descriptions, summaries, and metadata +without altering the API's interface contract (paths, methods, parameters, schemas). + +--- + +## Using a Custom Ruleset + +All four tools accept an optional `rulesetPath` parameter. Ask your AI tool: + +> Grade `/workspace/my-api/openapi.yaml` using the ruleset at `/workspace/rulesets/company-standards.yaml` + +--- + +## Verifying the Setup + +To verify the server starts correctly, run: + +```sh +echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | npx @dawmatt/api-grade-mcp +``` + +You should see a JSON response listing all four tools. + +--- + +## Troubleshooting + +**Tools don't appear in the AI tool** +- Ensure Node.js 20+ is installed: `node --version` +- Confirm the config file is valid JSON (no trailing commas) +- Restart the AI tool after editing the config + +**`SPEC_NOT_FOUND` error** +- Use an absolute path to the spec file, or ensure the relative path is correct from the directory where the AI tool is running + +**Large spec warning** +- Specifications over 500KB trigger a warning; grading still proceeds but detailed results may be truncated. Consider splitting large specs before grading. diff --git a/specs/007-ai-support/research.md b/specs/007-ai-support/research.md new file mode 100644 index 0000000..9a10cb3 --- /dev/null +++ b/specs/007-ai-support/research.md @@ -0,0 +1,218 @@ +# Research: AI Support for LLMs and Agentic Tooling + +**Phase**: 0 | **Date**: 2026-06-18 | **Plan**: [plan.md](./plan.md) + +## MCP SDK Patterns for Node.js/TypeScript + +### Decision: Use the high-level `McpServer` API with Zod schemas + +**Rationale**: `@modelcontextprotocol/sdk` exposes two tiers: the lower-level `Server` class (manual request handler registration) and the higher-level `McpServer` class (declarative tool registration via `server.tool()`). The high-level API reduces boilerplate, aligns with official SDK examples, and makes tool contracts self-documenting. The lower-level `Server` is only needed for non-tool MCP surfaces (resources, prompts), which are out of scope for this feature. + +**Alternatives considered**: Lower-level `Server` class — rejected because it requires manual JSON Schema construction and request/response plumbing that `McpServer` handles automatically. + +### Transport: StdioServerTransport + +**Decision**: Use `StdioServerTransport` exclusively. + +**Rationale**: The spec requires local-only operation (FR-011). MCP hosts (Claude Desktop, Cursor, Windsurf, etc.) start the server as a subprocess and communicate via stdin/stdout. No network port is opened. This satisfies constitution principle V (zero-cost, no network service to run or maintain) and matches how all published MCP servers are deployed. + +**Alternatives considered**: `SSEServerTransport` (HTTP server-sent events) — out of scope; would require a running HTTP server and introduces network cost and configuration complexity. + +### Tool registration pattern + +```typescript +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { z } from "zod"; + +const server = new McpServer({ name: "api-grade", version: "0.1.0" }); + +server.tool( + "grade-api", + "Grade an API specification file and return quality score, letter grade, and diagnostic summary.", + { + specPath: z.string().describe("Absolute or relative path to the OpenAPI or AsyncAPI specification file"), + rulesetPath: z.string().optional().describe("Path to a custom Spectral-compatible ruleset file") + }, + async ({ specPath, rulesetPath }) => { + // ... call GradeEngine, return result + return { content: [{ type: "text", text: JSON.stringify(result) }] }; + } +); + +const transport = new StdioServerTransport(); +await server.connect(transport); +``` + +### Tool response format + +MCP tool responses use `{ content: [{ type: "text", text: string }] }`. For structured data, the convention is to serialize JSON into the `text` field. This is consistent with how MCP servers expose JSON-returning tools across the ecosystem. + +**Error responses**: For invalid inputs or unhandled errors, return `{ content: [...], isError: true }` or throw an `McpError` with an appropriate `ErrorCode`. This ensures the calling AI tool receives a structured error message rather than an unhandled exception trace. + +--- + +## Package Structure in the Monorepo + +### Decision: New package at `packages/api-grade-mcp` + +**Name**: `@dawmatt/api-grade-mcp` +**Binary**: `api-grade-mcp` (entry point for MCP host configuration) +**Workspace reference**: `"@dawmatt/api-grade-core": "*"` in `dependencies` (resolved to published version on npm publish, same pattern as other packages) + +**Rationale**: Follows the existing monorepo pattern (`packages/api-grade-core`, `packages/backstage-plugin-api-grade`). The MCP server is a distinct published artifact with its own lifecycle and consumers. Embedding it in the CLI package would couple MCP-specific dependencies to the CLI install. + +**package.json shape**: +```json +{ + "name": "@dawmatt/api-grade-mcp", + "type": "module", + "bin": { "api-grade-mcp": "./dist/index.js" }, + "exports": { ".": { "types": "./dist/server.d.ts", "default": "./dist/server.js" } }, + "dependencies": { + "@dawmatt/api-grade-core": "*", + "@modelcontextprotocol/sdk": "^1.0.0", + "zod": "^3.22.0" + } +} +``` + +The `exports` field exposes `server.ts` (not `index.ts`) so integration tests can import `createServer()` without triggering the stdio transport connection. + +--- + +## GradeEngine to MCP Tool Mapping + +### Available GradeEngine methods + +```typescript +class GradeEngine { + grade(req: GradeRequest): Promise + // GradeRequest: { specPath: string; rulesetPath?: string } + + gradeContent(req: GradeContentRequest): Promise + // GradeContentRequest: { content: string; rulesetPath?: string; rulesetUrl?: string; rulesetToken?: string } +} +``` + +All four MCP tools use `grade(GradeRequest)` with a file path. `gradeContent` is reserved for future URL-based input (stretch goal in spec Assumptions). + +### Tool → GradeEngine mapping + +| MCP Tool | GradeEngine call | Response content | +|---|---|---| +| `grade-api` | `engine.grade({ specPath, rulesetPath })` | `{ specPath, format, letterGrade, gradeLabel, numericScore, summary }` — diagnostics array omitted | +| `grade-api-detailed` | `engine.grade({ specPath, rulesetPath })` | Full `GradeResult` including `diagnostics[]` | +| `assert-api-grade` | `engine.grade({ specPath, rulesetPath })` | `{ passed, actual, minimum, specPath }` | +| `get-non-breaking-violations` | `engine.grade({ specPath, rulesetPath })` | `{ specPath, totalViolations, nonBreakingViolations[] }` | + +`grade-api` omits the `diagnostics` array to keep the response token-efficient for the common case (AI wants a summary, not full detail). `grade-api-detailed` returns the full result. + +--- + +## Non-Breaking Violation Classification + +### Decision: Path-based classification with rule ID override list + +**Rationale**: Spectral diagnostics include a `path` array (JSON pointer segments to the offending location) and a `ruleId` string. Classification uses the path first — if the path points to a documentation or metadata location, the violation is non-breaking. Rule ID overrides handle cases where path inspection alone is ambiguous. + +**Non-breaking path patterns** (violation is non-breaking if path includes ANY of these at any level): + +| Path segment | Example location | Non-breaking because | +|---|---|---| +| `description` | `paths./pets.get.description` | Adding/improving a description never changes the contract | +| `summary` | `paths./pets.get.summary` | Summaries are informational only | +| `title` | `info.title` | Metadata | +| `contact` | `info.contact` | Metadata | +| `license` | `info.license` | Metadata | +| `termsOfService` | `info.termsOfService` | Metadata | +| `externalDocs` | `paths./pets.get.externalDocs` | Documentation link | +| `example` / `examples` | `components.schemas.Pet.example` | Examples are illustrative, not contractual | +| `tags` (at operation level) | `paths./pets.get.tags` | Tags are grouping metadata | +| `x-` (extension prefix) | `info.x-logo` | OAS extensions are non-contractual | +| `info` (top-level only) | `info` | Info block is metadata | + +**Breaking path patterns** (violation is always breaking if path includes ANY of these): + +| Path segment | Why breaking | +|---|---| +| `paths` (followed by a method verb) | Changing path/method changes the endpoint | +| `required` | Changing required parameters is a breaking contract change | +| `type` | Schema type change breaks clients | +| `format` | Changing format may break clients | +| `responses` → `content` → `schema` → `type` | Response schema type change | +| `parameters` (at path item or operation level, not description) | Parameter presence/type | + +**Classification algorithm**: +1. Check if any path segment matches a breaking pattern → `breaking` +2. Else check if any path segment matches a non-breaking pattern → `nonBreaking` +3. Else → `unknown` (not included in `get-non-breaking-violations` output; surfaced separately) + +**Rule ID overrides** (applied before path inspection): + +| Rule ID prefix | Classification | Reason | +|---|---|---| +| `operation-description` | nonBreaking | Always about adding missing description | +| `operation-summary` | nonBreaking | Always about adding missing summary | +| `info-contact` | nonBreaking | Info metadata | +| `info-description` | nonBreaking | Info metadata | +| `info-license` | nonBreaking | Info metadata | +| `oas3-examples-*` | nonBreaking | Examples only | +| `tag-description` | nonBreaking | Tag metadata | + +**FR-012 context fields** (returned per non-breaking violation): +```typescript +interface NonBreakingViolation { + ruleId: string; // e.g. "operation-description" + message: string; // e.g. "Operation must have a description" + severity: string; // "error" | "warn" | "info" | "hint" + path: string[]; // JSON path segments: ["paths", "/pets", "get", "description"] + location: string; // Human-readable: "paths./pets.get.description" + currentValue: string | null; // Current value at path if present, else null + expectedImprovement: string; // What the AI should add/change +} +``` + +The `expectedImprovement` is derived from the rule message and the rule's known intent. For most documentation rules it is: "Add a `` that describes the purpose of this ." + +--- + +## Large Spec Handling (FR-013) + +### Decision: 500KB threshold, best-effort grading, warning field + +**Rationale**: Spectral handles large files but token limits in MCP tool responses are a real constraint. A 500KB spec produces a large diagnostics array that may exceed the practical context window of the calling AI. The threshold is a practical limit, not a Spectral limit. + +**Implementation**: +1. Read spec file size before calling `GradeEngine` +2. If `fileSize > LARGE_SPEC_THRESHOLD_BYTES` (default: 500_000): + - Proceed with grading (best-effort per spec) + - Add `largeSpecWarning: "Specification exceeds 500KB; diagnostic results may be truncated"` to the response +3. For `grade-api-detailed`, truncate `diagnostics[]` to first 100 entries and add a `truncated: true` field + +--- + +## Concurrent Request Support + +### Decision: No explicit concurrency management; rely on GradeEngine statelesness + +**Rationale**: `GradeEngine` is stateless per-request (confirmed in spec Assumptions). Each MCP tool call creates a new `GradeEngine` instance or calls it with independent inputs; there is no shared mutable state. The MCP SDK handles multiple concurrent stdio requests transparently. No mutex, queue, or rate-limiting logic is needed. + +--- + +## MCP Host Configuration Pattern + +AI tools (Claude Desktop, Cursor, etc.) require a config entry to register the MCP server. The standard config format: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +This is documented in `quickstart.md`. diff --git a/specs/007-ai-support/spec.md b/specs/007-ai-support/spec.md new file mode 100644 index 0000000..902e19f --- /dev/null +++ b/specs/007-ai-support/spec.md @@ -0,0 +1,146 @@ +# Feature Specification: AI Support for LLMs and Agentic Tooling + +**Feature Branch**: `007-ai-support` + +**Created**: 2026-06-18 + +**Status**: Draft + +**Input**: User description: "Allow API grading to be performed directly from LLMs and agentic AI tooling" + +## Clarifications + +### Session 2026-06-18 + +- Q: What integration mechanism should be used to expose api-grade capabilities to AI tools? → A: MCP server (Model Context Protocol) +- Q: What constitutes a "non-breaking" violation eligible for AI-assisted auto-fix? → A: Any violation that doesn't alter the API's interface contract (includes documentation, metadata, optional fields, examples, and extensions) +- Q: What does the MCP tool return when an AI tool requests resolution of non-breaking issues? → A: A structured list of non-breaking issues for the AI to resolve (the AI model performs the content generation; the MCP tool identifies and classifies the violations) +- Q: How should the MCP server handle very large API specifications? → A: Best-effort — grade and return results, but include a warning in the response when the spec exceeds a defined size threshold +- Q: Should the MCP server support concurrent grading requests? → A: Yes — multiple simultaneous requests are supported, bounded only by available system resources + +--- + +## User Scenarios & Testing *(mandatory)* + +### User Story 1 - Grade an API from an AI Assistant (Priority: P1) + +A developer using Claude Code, GitHub Copilot (VS Code), or GitHub Copilot Studio asks their AI tool to grade an API specification file. The AI tool invokes the api-grade capability, receives structured results, and presents a human-readable summary to the user — all without the user needing to leave their AI environment or run CLI commands manually. + +**Why this priority**: This is the core value proposition of the feature. Without the ability to grade an API from an AI context, no other AI-support scenarios are possible. It unblocks all other stories and makes the tool accessible to a new class of users. + +**Independent Test**: Can be fully tested by having an AI assistant request an overall API grade for a sample OpenAPI or AsyncAPI file and confirming structured grade results (letter, percentage, label) are returned and usable by the AI. + +**Acceptance Scenarios**: + +1. **Given** an AI assistant has access to the api-grade capability, **When** it requests an overall grade for a valid OpenAPI specification, **Then** it receives a structured result containing grade letter, numeric percentage, label, and diagnostic summary. +2. **Given** an AI assistant has access to the api-grade capability, **When** it requests a grade for a valid AsyncAPI specification, **Then** it receives equivalent structured results demonstrating multi-format support. +3. **Given** an AI assistant requests a grade for a file path that does not exist, **When** the capability is invoked, **Then** it returns a clear, structured error message the AI can relay to the user. +4. **Given** the MCP server is configured in Claude Code, GitHub Copilot (VS Code Agent mode), or GitHub Copilot Studio, **When** an API specification grade is requested in each tool, **Then** the grading capability is successfully invoked and returns a structured result in all three environments. + +--- + +### User Story 2 - Assert Minimum Grade from an AI Context (Priority: P2) + +A developer using an AI coding assistant wants to verify that their API specification meets a minimum quality threshold (e.g., at or above grade C) as part of an AI-assisted code review or automated workflow. The AI tool asserts the grade and returns a pass/fail result. + +**Why this priority**: Grade assertion is a key CI/CD-oriented use case already supported by the CLI. Exposing it to AI tooling extends that workflow into AI-assisted development environments, enabling quality gates without leaving the AI context. + +**Independent Test**: Can be fully tested by having an AI tool assert a minimum grade (e.g., >= C) on both a passing and a failing API specification, and confirming a structured boolean pass/fail result is returned. + +**Acceptance Scenarios**: + +1. **Given** an AI tool asserts a minimum grade of C on an API that achieves grade B, **When** the assertion is evaluated, **Then** the result indicates the assertion passed. +2. **Given** an AI tool asserts a minimum grade of B on an API that achieves grade D, **When** the assertion is evaluated, **Then** the result indicates the assertion failed with the actual grade included. +3. **Given** an AI tool requests an assertion with an invalid grade value, **When** the assertion is evaluated, **Then** a structured error is returned describing the invalid input. + +--- + +### User Story 3 - Retrieve Detailed Diagnostic Information from an AI Context (Priority: P2) + +A developer working with an AI assistant wants detailed diagnostic information about their API specification — including category breakdowns (operations, schemas, etc.), specific violations, and prioritised recommendations — so the AI can help them understand and act on the findings. + +**Why this priority**: Detailed diagnostics allow AI tools to do more than report a grade; they enable the AI to explain findings, prioritise fixes, and guide the developer. This unlocks the full value of api-grade's diagnostic pipeline within an AI context. + +**Independent Test**: Can be fully tested by having an AI tool request detailed diagnostics for a low-quality API sample and confirming the response includes category-level breakdowns, individual violations, and prioritised recommendations in a structured format. + +**Acceptance Scenarios**: + +1. **Given** an AI tool requests detailed diagnostics for an API with multiple violations, **When** the capability is invoked, **Then** a structured result is returned that includes: overall grade, per-category violation counts, individual violations with severity, and prioritised recommendations. +2. **Given** an AI tool requests detailed diagnostics for a high-quality API, **When** the capability is invoked, **Then** the result reflects a high grade with minimal or no violations and appropriate positive commentary. + +--- + +### User Story 4 - AI-Assisted Resolution of Non-Breaking Issues (Priority: P3) + +A developer using an AI assistant not only wants to know which issues are affecting their API grade, but wants the AI to automatically resolve the non-breaking, fixable issues identified by the grading — improving the API specification without introducing breaking changes. The MCP server provides the classified list of fixable violations; the AI model generates the actual corrections. + +**Why this priority**: This is the most advanced use of the feature and builds directly on User Stories 1 and 3. It requires grading and diagnostic information to be available first. Delivering this independently of the basic grading scenarios is possible but delivers less standalone value. + +**Independent Test**: Can be tested independently by providing an AI tool with an API specification containing known non-breaking issues (e.g., missing descriptions, incomplete metadata, absent examples), having it invoke the resolve capability, and confirming the output specification has those issues fixed while the API's interface contract (paths, methods, required parameters, schema types, response structures) is unchanged. + +**Acceptance Scenarios**: + +1. **Given** an API specification with non-breaking violations (e.g., missing operation descriptions, incomplete info block), **When** an AI tool invokes the resolve capability, **Then** the AI produces a corrected specification where those violations are addressed and no breaking changes are introduced. +2. **Given** an API specification where all violations are breaking changes, **When** an AI tool invokes the resolve capability, **Then** the result indicates no automatic fixes were applied and the original specification is unchanged. +3. **Given** an AI tool resolves non-breaking issues on a specification, **When** the corrected specification is re-graded, **Then** the grade is equal to or higher than the original grade. + +--- + +### Edge Cases + +- What happens when the API specification is syntactically invalid (unparseable)? +- What happens when the AI tool supplies a URL to a remote specification rather than a local file path? +- When an API specification exceeds a defined size threshold, the system returns a best-effort result (grading proceeds) with a warning field in the response indicating the spec is large and results may be truncated. +- What happens when the AI tool requests a grade using a custom ruleset path that does not exist or is inaccessible? +- How does the system behave when the AI environment has no network access and the default ruleset requires a remote fetch? + +## Requirements *(mandatory)* + +### Functional Requirements + +- **FR-001**: The system MUST expose all standard api-grade grading functions (overall grade, detailed diagnostics, grade assertion) as MCP tools consumable by LLMs and agentic AI tooling. +- **FR-002**: The system MUST return all results in the api-grade JSON output format so AI tools can process and reformat results according to their requirements. +- **FR-003**: The system MUST support grading both OpenAPI and AsyncAPI specification formats when invoked from an AI context. +- **FR-004**: The system MUST support a grade assertion capability that accepts a minimum grade level and returns a structured pass/fail result with the actual grade. +- **FR-005**: The system MUST provide detailed diagnostic output including per-category violation counts, individual violations with severity, and prioritised recommendations when requested by an AI tool. +- **FR-006**: The system MUST allow AI tools to supply a custom spectral ruleset path as the basis for grading, consistent with the CLI's custom ruleset support. +- **FR-007**: The system MUST provide a capability that returns a structured list of non-breaking violations in an API specification — classified, located, and described — so that an AI tool can use that information to generate and apply fixes. A non-breaking violation is any violation whose fix does not alter the API's interface contract (i.e., does not change paths, methods, required parameters, schema types, or response structures); eligible fixes include adding or improving descriptions, summaries, tags, info block fields, optional fields, examples, and extensions. +- **FR-012**: For each non-breaking violation returned, the system MUST include sufficient context (violation rule, affected location, current value if present, expected improvement) for the AI to generate a correct fix without needing to re-parse the specification. +- **FR-008**: The system MUST return structured error responses (not unhandled exceptions) when invoked with invalid inputs such as missing files, invalid grade values, or inaccessible rulesets. +- **FR-013**: When an API specification exceeds a defined size threshold, the system MUST still attempt grading and return a best-effort result with a warning field indicating the specification is large and that results may be incomplete. +- **FR-009**: The AI integration MUST leverage the shared core grading package (api-grade-core) and MUST NOT duplicate core grading logic. +- **FR-010**: All MCP tool definitions MUST include complete descriptions, parameter documentation, and example invocations so that AI tools can discover and correctly invoke them without additional configuration. +- **FR-011**: The MCP server MUST operate entirely locally (no outbound network calls required for the MCP protocol layer itself) to satisfy the zero-cost prerequisite constraint. +- **FR-014**: The MCP server MUST be explicitly verified to function correctly with Claude Code, GitHub Copilot (VS Code Agent mode), and GitHub Copilot Studio as primary supported AI tool targets. An implementation that functions in only a subset of these three environments does not satisfy this requirement. + +### Key Entities + +- **API Specification**: The file (OpenAPI or AsyncAPI) being graded; identified by a file path or URL supplied by the AI tool. +- **Grade Result**: The structured output of a grading operation, including grade letter, numeric percentage, label, tone, and diagnostic summary. +- **Diagnostic Detail**: The full structured output including per-category breakdowns, individual violations, severities, and prioritised recommendations. +- **Assertion Result**: A structured pass/fail outcome indicating whether an API meets a specified minimum grade, including the actual grade achieved. +- **Non-Breaking Issue List**: The structured output of the resolve-assist capability — a classified, located list of non-breaking violations with sufficient context (rule, location, current value, expected improvement) for an AI model to generate corrections. +- **Resolved Specification**: The corrected API specification produced by an AI model after it processes the Non-Breaking Issue List and applies fixes. Non-breaking fixes include improvements to descriptions, summaries, tags, info blocks, optional fields, examples, and extensions — any change that leaves the API's interface contract (paths, methods, required parameters, schema types, response structures) unaltered. +- **Custom Ruleset**: An optional spectral-compatible ruleset file path provided by the AI tool to customise grading behaviour. + +## Success Criteria *(mandatory)* + +### Measurable Outcomes + +- **SC-001**: An AI tool can complete an end-to-end API grading request (from invocation to structured result) in under 10 seconds for a typical API specification. +- **SC-002**: All three grading functions (overall grade, detailed diagnostics, grade assertion) are accessible from Claude Code, GitHub Copilot (VS Code), and GitHub Copilot Studio without any additional configuration beyond supplying the API specification path. +- **SC-003**: 100% of supported API specification formats (OpenAPI and AsyncAPI) can be graded successfully when invoked from an AI context. +- **SC-004**: Grade assertion correctly identifies pass/fail for all valid grade levels (A through F) with 100% accuracy. +- **SC-005**: An AI tool applying non-breaking fixes produces a corrected specification where all targeted violations are resolved and no breaking changes are introduced, as verified by re-grading. +- **SC-006**: All MCP tool definitions are self-describing — a capable AI tool can discover and invoke all grading capabilities correctly using only the tool definitions, with no additional documentation required. + +## Assumptions + +- The AI integration is delivered as an MCP (Model Context Protocol) server. The three explicitly required and verified target environments are Claude Code, GitHub Copilot (VS Code Agent mode), and GitHub Copilot Studio. The server is expected to work with other MCP-compatible hosts, but only these three are required for acceptance. +- Remote URL-based API specification fetching is treated as a stretch goal; the primary supported input is a local file path. +- The AI tool is responsible for presenting the structured JSON output to its end user in a human-readable form; api-grade provides the data, not the final presentation. +- The "resolve non-breaking issues" capability is a two-step workflow: the MCP server identifies, classifies, and returns non-breaking violations as a structured list; the calling AI model uses that list to generate the corrected specification content. The MCP server does not generate specification content. +- Custom ruleset support mirrors the existing CLI capability; rulesets sourced from secured remote locations (as in the Backstage feature) are out of scope for this feature. +- All prerequisites for AI integration (e.g., tool registration, model access) have zero monetary cost, consistent with the project's cross-platform zero-cost prerequisite principle. +- The MCP server supports concurrent requests; multiple grading operations may run simultaneously, bounded only by available system resources. The core grading logic is stateless with respect to individual requests. +- The feature builds on the existing api-grade-core package and does not require changes to the core grading algorithm. diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md new file mode 100644 index 0000000..1479e4e --- /dev/null +++ b/specs/007-ai-support/tasks.md @@ -0,0 +1,207 @@ +# Tasks: AI Support for LLMs and Agentic Tooling + +**Input**: Design documents from `specs/007-ai-support/` + +**Prerequisites**: plan.md ✅ spec.md ✅ research.md ✅ data-model.md ✅ contracts/mcp-tools.md ✅ quickstart.md ✅ + +**Organization**: Tasks are grouped by user story to enable independent implementation and testing of each story. + +## Format: `[ID] [P?] [Story] Description` + +- **[P]**: Can run in parallel (different files, no dependencies on incomplete tasks in this phase) +- **[Story]**: Which user story this task belongs to (US1, US2, US3, US4) + +--- + +## Phase 1: Setup + +**Purpose**: Scaffold the `@dawmatt/api-grade-mcp` package in the monorepo and wire it into the workspace build, lint, and test infrastructure. + +- [ ] T001 Create `packages/api-grade-mcp/src/tools/`, `packages/api-grade-mcp/src/utils/`, and `packages/api-grade-mcp/tests/unit/` and `packages/api-grade-mcp/tests/integration/` directory structure per plan.md +- [ ] T002 Create `packages/api-grade-mcp/package.json` with name `@dawmatt/api-grade-mcp`, `type: "module"`, `bin`, `exports`, `scripts` (build/test/test:coverage/lint/typecheck), and dependencies `@modelcontextprotocol/sdk`, `@dawmatt/api-grade-core: "*"`, `zod`; devDependencies `vitest`, `@vitest/coverage-v8`, `typescript` +- [ ] T003 [P] Create `packages/api-grade-mcp/tsconfig.json` following the pattern from `packages/api-grade-core/tsconfig.json` (ESM, `NodeNext` module resolution, `outDir: dist`) +- [ ] T004 [P] Create `packages/api-grade-mcp/vitest.config.ts` following the pattern from `packages/api-grade-core/vitest.config.ts` +- [ ] T005 [P] Verify `packages/api-grade-mcp` is picked up by the root `workspaces: ["packages/*"]` declaration in root `package.json` and run `yarn install` to register the workspace + +**Checkpoint**: `yarn workspace api-grade-mcp run build` resolves (even with empty src) and `yarn workspaces info` lists `api-grade-mcp` + +--- + +## Phase 2: Foundational (Blocking Prerequisites) + +**Purpose**: Shared infrastructure that ALL tool implementations depend on. Must be complete before any user story phase begins. + +**⚠️ CRITICAL**: No user story work can begin until this phase is complete. + +- [ ] T006 Implement `packages/api-grade-mcp/src/utils/errors.ts` — exports `mcpError(code, message, input)` returning the structured `{ error, message, input }` shape defined in data-model.md, and the `ERROR_CODES` const object (`SPEC_NOT_FOUND`, `SPEC_PARSE_ERROR`, `RULESET_NOT_FOUND`, `INVALID_GRADE`, `GRADE_ENGINE_ERROR`) +- [ ] T007 [P] Implement stub `packages/api-grade-mcp/src/server.ts` — imports `McpServer` from `@modelcontextprotocol/sdk/server/mcp.js`, exports `createServer()` that constructs and returns a named `McpServer` instance (`name: "api-grade"`, version from package.json); no tools registered yet +- [ ] T008 Implement `packages/api-grade-mcp/src/index.ts` — imports `createServer` from `./server.js`, imports `StdioServerTransport` from `@modelcontextprotocol/sdk/server/stdio.js`, calls `server.connect(transport)` and exports nothing (stdio entry point only) +- [ ] T009 [P] Write a smoke test in `packages/api-grade-mcp/tests/unit/server.test.ts` that imports `createServer`, calls it, and asserts the returned object has a `connect` method — confirms the server factory is importable and the test runner works + +**Checkpoint**: `yarn workspace api-grade-mcp run typecheck` passes; `yarn workspace api-grade-mcp run test` finds and runs the smoke test + +--- + +## Phase 3: User Story 1 — Grade an API from an AI Assistant (Priority: P1) 🎯 MVP + +**Goal**: Expose the `grade-api` MCP tool so Claude Code, GitHub Copilot, and Copilot Studio can request a summary grade for any OpenAPI or AsyncAPI specification. + +**Independent Test**: Configure the MCP server in one supported AI tool, ask it to grade a sample OpenAPI spec (e.g. `packages/api-grade-core/tests/fixtures/`), and confirm a structured response is returned with `letterGrade`, `numericScore`, and `summary`. + +### Implementation for User Story 1 + +- [ ] T010 [P] [US1] Implement `packages/api-grade-mcp/src/tools/grade.ts` — exports `registerGradeTool(server: McpServer)` that calls `server.tool("grade-api", description, zodSchema, handler)`; handler instantiates `GradeEngine`, calls `engine.grade({ specPath, rulesetPath })`, projects the result to `GradeSummaryResponse` (omitting `diagnostics[]`), checks file size for the 500KB warning, and returns `{ content: [{ type: "text", text: JSON.stringify(result) }] }` +- [ ] T011 [US1] Wire `registerGradeTool` into `packages/api-grade-mcp/src/server.ts` — import and call after server construction +- [ ] T012 [P] [US1] Write integration tests in `packages/api-grade-mcp/tests/integration/grade.test.ts` — test: (a) valid OpenAPI spec returns correct shape; (b) valid AsyncAPI spec returns correct shape; (c) non-existent path returns `SPEC_NOT_FOUND` error; (d) spec over 500KB returns `largeSpecWarning` field; use `createServer()` directly without starting the stdio transport +- [ ] T013 [US1] Add error handling in `packages/api-grade-mcp/src/tools/grade.ts` for missing file (`SPEC_NOT_FOUND`), inaccessible ruleset (`RULESET_NOT_FOUND`), and unexpected GradeEngine errors (`GRADE_ENGINE_ERROR`) using helpers from `utils/errors.ts` + +**Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes with all four grade.test.ts scenarios green; `grade-api` tool is callable via `createServer()` in tests + +--- + +## Phase 4: User Story 2 — Assert Minimum Grade from an AI Context (Priority: P2) + +**Goal**: Expose the `assert-api-grade` MCP tool so AI tools can run a pass/fail grade assertion against a minimum threshold. + +**Independent Test**: Ask an AI tool to assert a minimum grade of C on both a passing and a failing sample spec and confirm a `{ passed, actual, minimum, numericScore }` response is returned in each case. + +### Implementation for User Story 2 + +- [ ] T014 [P] [US2] Implement `packages/api-grade-mcp/src/tools/assert-grade.ts` — exports `registerAssertGradeTool(server: McpServer)`; Zod schema includes `specPath`, `minimumGrade` (z.enum(["A","B","C","D","F"])), optional `rulesetPath`; handler validates `minimumGrade` against `LETTER_GRADE_ORDER` from `api-grade-core`, calls `engine.grade(...)`, compares using `gradeToNumber`, returns `AssertionResult` shape from data-model.md +- [ ] T015 [US2] Wire `registerAssertGradeTool` into `packages/api-grade-mcp/src/server.ts` +- [ ] T016 [P] [US2] Write integration tests in `packages/api-grade-mcp/tests/integration/assert-grade.test.ts` — test: (a) actual B vs minimum C → `passed: true`; (b) actual D vs minimum B → `passed: false` with correct `actual`; (c) invalid grade value → `INVALID_GRADE` error; (d) non-existent spec → `SPEC_NOT_FOUND` error + +**Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes with all assert-grade.test.ts scenarios green + +--- + +## Phase 5: User Story 3 — Retrieve Detailed Diagnostic Information from an AI Context (Priority: P2) + +**Goal**: Expose the `grade-api-detailed` MCP tool returning the full `GradeResult` including the complete `diagnostics[]` array, so AI tools can present per-violation findings to developers. + +**Independent Test**: Ask an AI tool for detailed diagnostics on a low-quality sample spec and confirm the response includes `diagnostics[]` with `ruleId`, `message`, `severity`, and `path` on each entry. + +### Implementation for User Story 3 + +- [ ] T017 [P] [US3] Implement `packages/api-grade-mcp/src/tools/grade-detailed.ts` — exports `registerGradeDetailedTool(server: McpServer)`; handler calls `engine.grade(...)` and returns the full `GradeResult` serialised; applies 500KB large-spec warning and truncates `diagnostics[]` to 100 entries with `truncated: true` when exceeded +- [ ] T018 [US3] Wire `registerGradeDetailedTool` into `packages/api-grade-mcp/src/server.ts` +- [ ] T019 [P] [US3] Write integration tests in `packages/api-grade-mcp/tests/integration/grade-detailed.test.ts` — test: (a) response includes `diagnostics[]` array; (b) each diagnostic has required fields (`ruleId`, `message`, `severity`, `path`); (c) non-existent spec → `SPEC_NOT_FOUND` error; (d) AsyncAPI spec is graded successfully (multi-format check) + +**Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes with all grade-detailed.test.ts scenarios green + +--- + +## Phase 6: User Story 4 — AI-Assisted Resolution of Non-Breaking Issues (Priority: P3) + +**Goal**: Expose the `get-non-breaking-violations` MCP tool returning a classified, AI-actionable list of non-breaking violations with full context per violation (FR-007, FR-012), enabling the two-step resolve workflow. + +**Independent Test**: Ask an AI tool for non-breaking violations on a spec with known documentation gaps; confirm each returned violation has `ruleId`, `path`, `location`, `currentValue`, and `expectedImprovement`; confirm no interface-contract violations (missing required fields, schema type changes) are included. + +### Implementation for User Story 4 + +- [ ] T020 [P] [US4] Implement `packages/api-grade-mcp/src/utils/classify.ts` — exports `classifyViolation(diagnostic: Diagnostic): "nonBreaking" | "breaking" | "unknown"` using the path-segment inspection and rule ID override logic from research.md; exports `buildNonBreakingViolation(diagnostic: Diagnostic, specContent: string): NonBreakingViolation` that populates all fields from data-model.md including `currentValue` (extracted from parsed spec at `path`) and `expectedImprovement` (derived from rule message) +- [ ] T021 [P] [US4] Write unit tests in `packages/api-grade-mcp/tests/unit/classify.test.ts` — test: (a) `operation-description` at `paths./pets.get` → `nonBreaking`; (b) violation at `paths./pets.get.parameters[0].required` → `breaking`; (c) `info-contact` → `nonBreaking`; (d) rule with `x-` extension path → `nonBreaking`; (e) unknown path with no recognised segments → `unknown` +- [ ] T022 [US4] Implement `packages/api-grade-mcp/src/tools/non-breaking.ts` — exports `registerNonBreakingTool(server: McpServer)`; handler calls `engine.grade(...)`, filters diagnostics to `nonBreaking` classification, maps each to `NonBreakingViolation` via `buildNonBreakingViolation`, returns `NonBreakingViolationResult` shape from data-model.md +- [ ] T023 [US4] Wire `registerNonBreakingTool` into `packages/api-grade-mcp/src/server.ts` +- [ ] T024 [P] [US4] Write integration tests in `packages/api-grade-mcp/tests/integration/non-breaking.test.ts` — test: (a) spec with known documentation gaps returns non-empty `nonBreakingViolations[]`; (b) each violation has all required fields; (c) no breaking-change violations are included in the list; (d) spec with only breaking violations returns `nonBreakingCount: 0`; (e) non-existent spec → `SPEC_NOT_FOUND` error + +**Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes; `classifyViolation` unit tests all green; non-breaking integration tests all green + +--- + +## Phase 7: Polish & Cross-Cutting Concerns + +**Purpose**: Quality gate compliance, FR-014 verification across all three required AI tool targets, and documentation. + +- [ ] T025 Run the full quality gate locally and resolve any failures: `npm audit --audit-level=high --omit=dev`, `npm run lint`, `npm run typecheck --workspaces --if-present`, `yarn workspace api-grade-mcp run test:coverage`, `npm run build --workspaces --if-present` +- [ ] T026 [P] Verify `grade-api` in **Claude Code**: register the built server via `claude mcp add`, ask Claude to grade a sample spec, confirm structured response (FR-014) +- [ ] T027 [P] Verify `grade-api` in **GitHub Copilot (VS Code)**: add `.vscode/mcp.json` with the server entry, switch Copilot Chat to Agent mode, ask it to grade a sample spec, confirm structured response (FR-014) +- [ ] T028 Verify all four tools in **GitHub Copilot Studio**: add the server as a custom MCP Action, invoke each tool, confirm all four capabilities work end-to-end (FR-014) +- [ ] T029 [P] Add `packages/api-grade-mcp` to `docs/package/` — brief package README covering install, MCP host config snippet, and the four available tools; update `docs/getting-started.md` with the MCP server as an option alongside CLI + +**Checkpoint**: Quality gate passes; all three AI tool environments verified; `@dawmatt/api-grade-mcp` is publishable + +--- + +## Dependencies & Execution Order + +### Phase Dependencies + +- **Setup (Phase 1)**: No dependencies — start immediately +- **Foundational (Phase 2)**: Depends on Phase 1 completion — **blocks all user story phases** +- **US1 (Phase 3)**: Depends on Phase 2; no dependency on US2/US3/US4 +- **US2 (Phase 4)**: Depends on Phase 2; no dependency on US1/US3/US4 +- **US3 (Phase 5)**: Depends on Phase 2; no dependency on US1/US2/US4 +- **US4 (Phase 6)**: Depends on Phase 2; logically follows US1/US3 (relies on grading working) but can be implemented independently +- **Polish (Phase 7)**: Depends on all user story phases complete + +### User Story Dependencies + +- **US1 (P1)**: Can start after Phase 2 — no cross-story dependencies +- **US2 (P2)**: Can start after Phase 2 — shares `GradeEngine` usage pattern with US1 but independent implementation +- **US3 (P2)**: Can start after Phase 2 — same as US2; US2 and US3 can be worked in parallel +- **US4 (P3)**: Can start after Phase 2 — classifier in `classify.ts` is the only new net logic; all other tools can be complete or in-progress + +### Within Each User Story + +- Tool implementation (`tools/*.ts`) before wiring into `server.ts` +- Unit/integration tests can be written in parallel with (or before) implementation +- Wiring task (`server.ts` update) before end-to-end testing of that tool +- Story complete before FR-014 verification in Phase 7 + +--- + +## Parallel Execution Examples + +### Phase 1 — all tasks parallelisable after T001/T002: + +``` +T001 → T002 → [T003, T004, T005 in parallel] +``` + +### Phase 2: + +``` +T006 → [T007, T009 in parallel] → T008 +``` + +### User story phases after Phase 2 completes: + +``` +Phase 3 (US1): T010 [P] + T012 [P] in parallel → T011 → T013 +Phase 4 (US2): T014 [P] + T016 [P] in parallel → T015 +Phase 5 (US3): T017 [P] + T019 [P] in parallel → T018 +Phase 6 (US4): T020 [P] + T021 [P] in parallel → T022 → T023 → T024 +``` + +US1, US2, US3 phases can all run in parallel once Phase 2 is complete. + +--- + +## Implementation Strategy + +### MVP First (User Story 1 Only) + +1. Complete Phase 1: Setup +2. Complete Phase 2: Foundational (blocks everything) +3. Complete Phase 3: US1 — `grade-api` tool only +4. **STOP and VALIDATE**: Configure in Claude Code and ask it to grade a sample spec +5. If it works end-to-end: ship the MVP + +### Incremental Delivery + +1. Setup + Foundational → package compiles, smoke test passes +2. Phase 3 (US1) → `grade-api` usable in all three AI tools → MVP +3. Phase 4+5 (US2+US3) → assertion and detailed diagnostics → full grading capability +4. Phase 6 (US4) → non-breaking classifier → AI-assisted fix workflow +5. Phase 7 → quality gate + FR-014 verification → publishable + +--- + +## Notes + +- Constitution IV requires tests written before or alongside implementation; test tasks in each phase reflect this +- `server.ts` is intentionally kept as an aggregator so each story phase only modifies it via a `registerXxxTool` call — no phase overwrites another phase's changes +- FR-014 verification tasks (T026–T028) are manual integration checks, not automated tests; record results in the PR description +- The non-breaking classifier (`classify.ts`) is the only net-new business logic in this feature; all grading stays in `api-grade-core` +- Each `server.ts` wiring task (T011, T015, T018, T023) adds one import and one `register` call — these are intentionally small to reduce merge conflict risk From 0d3ac31647904e06a138ea907774f77428c586a8 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Fri, 19 Jun 2026 07:38:17 +1000 Subject: [PATCH 03/20] api-grade MCP initial build --- docs/getting-started.md | 13 + docs/package/api-grade-mcp.md | 135 ++++++++ packages/api-grade-mcp/package.json | 60 ++++ packages/api-grade-mcp/src/index.ts | 6 + packages/api-grade-mcp/src/server.ts | 28 ++ .../api-grade-mcp/src/tools/assert-grade.ts | 84 +++++ .../api-grade-mcp/src/tools/grade-detailed.ts | 91 ++++++ packages/api-grade-mcp/src/tools/grade.ts | 83 +++++ .../api-grade-mcp/src/tools/non-breaking.ts | 86 +++++ packages/api-grade-mcp/src/utils/classify.ts | 150 +++++++++ packages/api-grade-mcp/src/utils/errors.ts | 27 ++ .../tests/integration/assert-grade.test.ts | 60 ++++ .../tests/integration/grade-detailed.test.ts | 59 ++++ .../tests/integration/grade.test.ts | 69 ++++ .../tests/integration/non-breaking.test.ts | 77 +++++ .../api-grade-mcp/tests/unit/classify.test.ts | 57 ++++ .../api-grade-mcp/tests/unit/server.test.ts | 15 + packages/api-grade-mcp/tsconfig.json | 19 ++ packages/api-grade-mcp/vitest.config.ts | 16 + specs/007-ai-support/tasks.md | 52 +-- yarn.lock | 296 ++++++++++++++++-- 21 files changed, 1435 insertions(+), 48 deletions(-) create mode 100644 docs/package/api-grade-mcp.md create mode 100644 packages/api-grade-mcp/package.json create mode 100644 packages/api-grade-mcp/src/index.ts create mode 100644 packages/api-grade-mcp/src/server.ts create mode 100644 packages/api-grade-mcp/src/tools/assert-grade.ts create mode 100644 packages/api-grade-mcp/src/tools/grade-detailed.ts create mode 100644 packages/api-grade-mcp/src/tools/grade.ts create mode 100644 packages/api-grade-mcp/src/tools/non-breaking.ts create mode 100644 packages/api-grade-mcp/src/utils/classify.ts create mode 100644 packages/api-grade-mcp/src/utils/errors.ts create mode 100644 packages/api-grade-mcp/tests/integration/assert-grade.test.ts create mode 100644 packages/api-grade-mcp/tests/integration/grade-detailed.test.ts create mode 100644 packages/api-grade-mcp/tests/integration/grade.test.ts create mode 100644 packages/api-grade-mcp/tests/integration/non-breaking.test.ts create mode 100644 packages/api-grade-mcp/tests/unit/classify.test.ts create mode 100644 packages/api-grade-mcp/tests/unit/server.test.ts create mode 100644 packages/api-grade-mcp/tsconfig.json create mode 100644 packages/api-grade-mcp/vitest.config.ts diff --git a/docs/getting-started.md b/docs/getting-started.md index 9f09599..2357741 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -53,6 +53,18 @@ Two Backstage plugin packages that display API grades directly on your Backstage --- +### MCP Server (`@dawmatt/api-grade-mcp`) + +An MCP (Model Context Protocol) server that exposes api-grade as four AI tools: `grade-api`, `grade-api-detailed`, `assert-api-grade`, and `get-non-breaking-violations`. Register it in Claude Code, GitHub Copilot (VS Code Agent mode), or any MCP-compatible AI host and let the AI grade specs directly. + +```bash +claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp +``` + +→ [MCP Server documentation](package/api-grade-mcp.md) + +--- + ## Choose Your Path | I want to… | Start here | @@ -60,6 +72,7 @@ Two Backstage plugin packages that display API grades directly on your Backstage | Grade a spec from the terminal | [CLI Tool](cli/README.md) | | Set up a CI/CD grade gate | [CLI Commands → CI/CD example](cli/commands.md) | | Integrate grading into my own code | [Core Package (`@dawmatt/api-grade-core`)](package/README.md) | +| Grade specs from an AI assistant | [MCP Server (`@dawmatt/api-grade-mcp`)](package/api-grade-mcp.md) | | Show grades in Backstage | [Backstage Quick Start](backstage-plugins/quick-start.md) | | Understand the full documentation | [Documentation Index](index.md) | diff --git a/docs/package/api-grade-mcp.md b/docs/package/api-grade-mcp.md new file mode 100644 index 0000000..b6b9c8a --- /dev/null +++ b/docs/package/api-grade-mcp.md @@ -0,0 +1,135 @@ +[← Back to Documentation Index](../index.md) + +# MCP Server (`@dawmatt/api-grade-mcp`) + +> Expose api-grade capabilities to LLMs and agentic AI tooling via the Model Context Protocol. + +--- + +## Overview + +`@dawmatt/api-grade-mcp` is an MCP (Model Context Protocol) server that wraps the `@dawmatt/api-grade-core` grading engine and exposes it as four MCP tools. Once registered in a supported AI host, the AI can grade API specifications, assert grade thresholds, retrieve detailed diagnostics, and obtain a classified list of non-breaking violations — without any manual CLI invocation. + +--- + +## Installation + +The server runs on demand via `npx` — no global install required: + +```bash +npx -y @dawmatt/api-grade-mcp +``` + +Or install globally: + +```bash +npm install -g @dawmatt/api-grade-mcp +``` + +--- + +## MCP Host Configuration + +### Claude Code + +Register globally in the terminal: + +```bash +claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp +``` + +Or add to `.claude/settings.json`: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +### GitHub Copilot — VS Code + +Add `.vscode/mcp.json` to your project (requires VS Code 1.99+): + +```json +{ + "servers": { + "api-grade": { + "type": "stdio", + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +Tools are available in Copilot Chat **Agent mode** only. + +### Claude Desktop + +Add to `~/Library/Application Support/Claude/claude_desktop_config.json`: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +--- + +## Available Tools + +### `grade-api` + +Grade an API specification and return a token-efficient summary (letter grade, score, and diagnostic overview — no full violations list). + +**Input**: `specPath` (required), `rulesetPath` (optional) + +**Use when**: You want a quick quality overview without overwhelming the context window. + +--- + +### `grade-api-detailed` + +Grade an API specification and return the full result including all individual violations. Truncates to 100 diagnostics with `truncated: true` for large specs. + +**Input**: `specPath` (required), `rulesetPath` (optional) + +**Use when**: You need to analyse specific violations or present detailed findings. + +--- + +### `assert-api-grade` + +Assert that an API specification meets a minimum grade threshold (A > B > C > D > F). Returns `{ passed, actual, minimum, numericScore }`. + +**Input**: `specPath` (required), `minimumGrade` (required: A/B/C/D/F), `rulesetPath` (optional) + +**Use when**: Running AI-assisted code review or quality gates. + +--- + +### `get-non-breaking-violations` + +Return a classified, AI-actionable list of non-breaking violations — those whose fixes do not alter paths, methods, required parameters, schema types, or response structures. Each violation includes `ruleId`, `path`, `location`, `currentValue`, and `expectedImprovement`. + +**Input**: `specPath` (required), `rulesetPath` (optional) + +**Use when**: Asking the AI to generate fixes for documentation and metadata issues without risking breaking changes. + +--- + +## Further Reading + +- [Full quickstart and AI tool configuration](../../specs/007-ai-support/quickstart.md) +- [MCP tool contracts and response shapes](../../specs/007-ai-support/contracts/mcp-tools.md) +- [Core Package (`@dawmatt/api-grade-core`)](README.md) diff --git a/packages/api-grade-mcp/package.json b/packages/api-grade-mcp/package.json new file mode 100644 index 0000000..b0afe38 --- /dev/null +++ b/packages/api-grade-mcp/package.json @@ -0,0 +1,60 @@ +{ + "name": "@dawmatt/api-grade-mcp", + "version": "0.1.0", + "description": "MCP server exposing api-grade capabilities for LLMs and agentic AI tooling", + "keywords": [ + "api", + "openapi", + "asyncapi", + "spectral", + "quality", + "grading", + "mcp", + "model-context-protocol", + "ai" + ], + "repository": { + "type": "git", + "url": "https://github.com/DawMatt/api-grade.git" + }, + "homepage": "https://github.com/DawMatt/api-grade/tree/main/packages/api-grade-mcp#readme", + "bugs": { + "url": "https://github.com/DawMatt/api-grade/issues" + }, + "license": "MIT", + "type": "module", + "bin": { + "api-grade-mcp": "./dist/index.js" + }, + "exports": { + ".": { + "types": "./dist/server.d.ts", + "default": "./dist/server.js" + } + }, + "scripts": { + "build": "tsc", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "lint": "eslint src", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@dawmatt/api-grade-core": "*", + "@modelcontextprotocol/sdk": "^1.0.0", + "zod": "^3.22.0" + }, + "devDependencies": { + "@types/node": "^20.12.0", + "@vitest/coverage-v8": "^1.6.0", + "typescript": "^5.4.5", + "vitest": "^1.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/packages/api-grade-mcp/src/index.ts b/packages/api-grade-mcp/src/index.ts new file mode 100644 index 0000000..7ab9681 --- /dev/null +++ b/packages/api-grade-mcp/src/index.ts @@ -0,0 +1,6 @@ +import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; +import { createServer } from './server.js'; + +const server = createServer(); +const transport = new StdioServerTransport(); +await server.connect(transport); diff --git a/packages/api-grade-mcp/src/server.ts b/packages/api-grade-mcp/src/server.ts new file mode 100644 index 0000000..a853677 --- /dev/null +++ b/packages/api-grade-mcp/src/server.ts @@ -0,0 +1,28 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { createRequire } from 'node:module'; +import { fileURLToPath } from 'node:url'; +import { resolve, dirname } from 'node:path'; +import { registerGradeTool } from './tools/grade.js'; +import { registerAssertGradeTool } from './tools/assert-grade.js'; +import { registerGradeDetailedTool } from './tools/grade-detailed.js'; +import { registerNonBreakingTool } from './tools/non-breaking.js'; + +function getVersion(): string { + try { + const require = createRequire(import.meta.url); + const __dirname = dirname(fileURLToPath(import.meta.url)); + const pkg = require(resolve(__dirname, '../package.json')) as { version: string }; + return pkg.version; + } catch { + return '0.1.0'; + } +} + +export function createServer(): McpServer { + const server = new McpServer({ name: 'api-grade', version: getVersion() }); + registerGradeTool(server); + registerAssertGradeTool(server); + registerGradeDetailedTool(server); + registerNonBreakingTool(server); + return server; +} diff --git a/packages/api-grade-mcp/src/tools/assert-grade.ts b/packages/api-grade-mcp/src/tools/assert-grade.ts new file mode 100644 index 0000000..dd095cd --- /dev/null +++ b/packages/api-grade-mcp/src/tools/assert-grade.ts @@ -0,0 +1,84 @@ +import { statSync } from 'node:fs'; +import { z } from 'zod'; +import { GradeEngine, gradeToNumber, LETTER_GRADE_ORDER } from '@dawmatt/api-grade-core'; +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { mcpError, ERROR_CODES } from '../utils/errors.js'; + +export function registerAssertGradeTool(server: McpServer): void { + server.tool( + 'assert-api-grade', + 'Assert that an API specification meets a minimum grade threshold. Returns a structured pass/fail result. Use this in AI-assisted code review workflows or quality gates. Grade ordering: A (best) > B > C > D > F (worst).', + { + specPath: z + .string() + .describe( + 'Absolute or relative path to the OpenAPI or AsyncAPI specification file (YAML or JSON)' + ), + minimumGrade: z + .enum(['A', 'B', 'C', 'D', 'F']) + .describe( + 'The minimum acceptable grade. The assertion passes if the actual grade is equal to or better than this value (A > B > C > D > F).' + ), + rulesetPath: z + .string() + .optional() + .describe('Optional path to a custom Spectral-compatible ruleset file'), + }, + async ({ specPath, minimumGrade, rulesetPath }) => { + if (!LETTER_GRADE_ORDER.includes(minimumGrade as (typeof LETTER_GRADE_ORDER)[number])) { + return mcpError( + ERROR_CODES.INVALID_GRADE, + `Invalid minimumGrade '${minimumGrade}'. Must be one of: A, B, C, D, F.`, + { minimumGrade } + ); + } + + try { + statSync(specPath); + } catch { + return mcpError( + ERROR_CODES.SPEC_NOT_FOUND, + `The specification file '${specPath}' does not exist. Check the path and try again.`, + { specPath } + ); + } + + if (rulesetPath) { + try { + statSync(rulesetPath); + } catch { + return mcpError( + ERROR_CODES.RULESET_NOT_FOUND, + `The ruleset file '${rulesetPath}' does not exist. Check the path and try again.`, + { rulesetPath } + ); + } + } + + try { + const engine = new GradeEngine(); + const result = await engine.grade({ specPath, rulesetPath }); + + const actual = result.letterGrade; + const passed = gradeToNumber(actual) <= gradeToNumber(minimumGrade as (typeof LETTER_GRADE_ORDER)[number]); + + const response = { + passed, + actual, + minimum: minimumGrade, + specPath: result.specPath, + numericScore: result.numericScore, + }; + + return { content: [{ type: 'text', text: JSON.stringify(response) }] }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return mcpError( + ERROR_CODES.GRADE_ENGINE_ERROR, + `GradeEngine error: ${message}`, + { specPath } + ); + } + } + ); +} diff --git a/packages/api-grade-mcp/src/tools/grade-detailed.ts b/packages/api-grade-mcp/src/tools/grade-detailed.ts new file mode 100644 index 0000000..4b6fe34 --- /dev/null +++ b/packages/api-grade-mcp/src/tools/grade-detailed.ts @@ -0,0 +1,91 @@ +import { statSync } from 'node:fs'; +import { z } from 'zod'; +import { GradeEngine } from '@dawmatt/api-grade-core'; +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { mcpError, ERROR_CODES } from '../utils/errors.js'; + +const LARGE_SPEC_THRESHOLD_BYTES = 500_000; +const MAX_DIAGNOSTICS = 100; + +export function registerGradeDetailedTool(server: McpServer): void { + server.tool( + 'grade-api-detailed', + 'Grade an API specification and return the full result including all individual violations, per-category breakdowns, and prioritised recommendations. Use this when you need to analyse specific violations or present detailed findings to the user. Supports OpenAPI (2.x, 3.x) and AsyncAPI (2.x, 3.x).', + { + specPath: z + .string() + .describe( + 'Absolute or relative path to the OpenAPI or AsyncAPI specification file (YAML or JSON)' + ), + rulesetPath: z + .string() + .optional() + .describe('Optional path to a custom Spectral-compatible ruleset file'), + }, + async ({ specPath, rulesetPath }) => { + let largeSpecWarning: string | undefined; + + try { + const stat = statSync(specPath); + if (stat.size > LARGE_SPEC_THRESHOLD_BYTES) { + largeSpecWarning = `Specification exceeds 500KB (${stat.size} bytes); diagnostic results may be truncated`; + } + } catch { + return mcpError( + ERROR_CODES.SPEC_NOT_FOUND, + `The specification file '${specPath}' does not exist. Check the path and try again.`, + { specPath } + ); + } + + if (rulesetPath) { + try { + statSync(rulesetPath); + } catch { + return mcpError( + ERROR_CODES.RULESET_NOT_FOUND, + `The ruleset file '${rulesetPath}' does not exist. Check the path and try again.`, + { rulesetPath } + ); + } + } + + try { + const engine = new GradeEngine(); + const result = await engine.grade({ specPath, rulesetPath }); + + let truncated = false; + let diagnostics = result.diagnostics; + if (diagnostics.length > MAX_DIAGNOSTICS) { + diagnostics = diagnostics.slice(0, MAX_DIAGNOSTICS); + truncated = true; + } + + const response: Record = { + specPath: result.specPath, + format: result.format, + letterGrade: result.letterGrade, + gradeLabel: result.gradeLabel, + numericScore: result.numericScore, + summary: result.summary, + diagnostics, + rulesetSource: result.rulesetSource, + truncated, + }; + + if (largeSpecWarning) { + response.largeSpecWarning = largeSpecWarning; + } + + return { content: [{ type: 'text', text: JSON.stringify(response) }] }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return mcpError( + ERROR_CODES.GRADE_ENGINE_ERROR, + `GradeEngine error: ${message}`, + { specPath } + ); + } + } + ); +} diff --git a/packages/api-grade-mcp/src/tools/grade.ts b/packages/api-grade-mcp/src/tools/grade.ts new file mode 100644 index 0000000..3e733d6 --- /dev/null +++ b/packages/api-grade-mcp/src/tools/grade.ts @@ -0,0 +1,83 @@ +import { statSync } from 'node:fs'; +import { z } from 'zod'; +import { GradeEngine } from '@dawmatt/api-grade-core'; +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { mcpError, ERROR_CODES } from '../utils/errors.js'; + +const LARGE_SPEC_THRESHOLD_BYTES = 500_000; + +export function registerGradeTool(server: McpServer): void { + server.tool( + 'grade-api', + 'Grade an API specification file and return quality score, letter grade, and diagnostic summary. Use this for a token-efficient overview without the full violations list. Supports OpenAPI (2.x, 3.x) and AsyncAPI (2.x, 3.x) specifications in YAML or JSON.', + { + specPath: z + .string() + .describe( + 'Absolute or relative path to the OpenAPI or AsyncAPI specification file (YAML or JSON)' + ), + rulesetPath: z + .string() + .optional() + .describe( + 'Optional path to a custom Spectral-compatible ruleset file. If omitted, the default api-grade ruleset is used.' + ), + }, + async ({ specPath, rulesetPath }) => { + let largeSpecWarning: string | undefined; + + try { + const stat = statSync(specPath); + if (stat.size > LARGE_SPEC_THRESHOLD_BYTES) { + largeSpecWarning = `Specification exceeds 500KB (${stat.size} bytes); diagnostic results may be truncated`; + } + } catch { + return mcpError( + ERROR_CODES.SPEC_NOT_FOUND, + `The specification file '${specPath}' does not exist. Check the path and try again.`, + { specPath } + ); + } + + if (rulesetPath) { + try { + statSync(rulesetPath); + } catch { + return mcpError( + ERROR_CODES.RULESET_NOT_FOUND, + `The ruleset file '${rulesetPath}' does not exist. Check the path and try again.`, + { rulesetPath } + ); + } + } + + try { + const engine = new GradeEngine(); + const result = await engine.grade({ specPath, rulesetPath }); + + const response: Record = { + specPath: result.specPath, + format: result.format, + letterGrade: result.letterGrade, + gradeLabel: result.gradeLabel, + numericScore: result.numericScore, + summary: result.summary, + rulesetSource: result.rulesetSource, + }; + + if (largeSpecWarning) { + response.largeSpecWarning = largeSpecWarning; + } + + return { content: [{ type: 'text', text: JSON.stringify(response) }] }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return mcpError( + ERROR_CODES.GRADE_ENGINE_ERROR, + `GradeEngine error: ${message}`, + { specPath } + ); + } + } + ); +} diff --git a/packages/api-grade-mcp/src/tools/non-breaking.ts b/packages/api-grade-mcp/src/tools/non-breaking.ts new file mode 100644 index 0000000..e0176a3 --- /dev/null +++ b/packages/api-grade-mcp/src/tools/non-breaking.ts @@ -0,0 +1,86 @@ +import { statSync, readFileSync } from 'node:fs'; +import { z } from 'zod'; +import { GradeEngine } from '@dawmatt/api-grade-core'; +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { mcpError, ERROR_CODES } from '../utils/errors.js'; +import { classifyViolation, buildNonBreakingViolation } from '../utils/classify.js'; + +const LARGE_SPEC_THRESHOLD_BYTES = 500_000; + +export function registerNonBreakingTool(server: McpServer): void { + server.tool( + 'get-non-breaking-violations', + 'Return a classified, AI-actionable list of non-breaking violations in an API specification. Non-breaking violations are those whose fixes do not alter the API interface contract (paths, methods, required parameters, schema types, or response structures). Use this tool to obtain issues the AI can safely resolve — the AI generates the corrected specification content; the MCP server does not modify files.', + { + specPath: z + .string() + .describe( + 'Absolute or relative path to the OpenAPI or AsyncAPI specification file (YAML or JSON)' + ), + rulesetPath: z + .string() + .optional() + .describe('Optional path to a custom Spectral-compatible ruleset file'), + }, + async ({ specPath, rulesetPath }) => { + let largeSpecWarning: string | undefined; + let specContent = ''; + + try { + const stat = statSync(specPath); + if (stat.size > LARGE_SPEC_THRESHOLD_BYTES) { + largeSpecWarning = `Specification exceeds 500KB (${stat.size} bytes); diagnostic results may be truncated`; + } + specContent = readFileSync(specPath, 'utf-8'); + } catch { + return mcpError( + ERROR_CODES.SPEC_NOT_FOUND, + `The specification file '${specPath}' does not exist. Check the path and try again.`, + { specPath } + ); + } + + if (rulesetPath) { + try { + statSync(rulesetPath); + } catch { + return mcpError( + ERROR_CODES.RULESET_NOT_FOUND, + `The ruleset file '${rulesetPath}' does not exist. Check the path and try again.`, + { rulesetPath } + ); + } + } + + try { + const engine = new GradeEngine(); + const result = await engine.grade({ specPath, rulesetPath }); + + const nonBreakingViolations = result.diagnostics + .filter((d) => classifyViolation(d) === 'nonBreaking') + .map((d) => buildNonBreakingViolation(d, specContent)); + + const response: Record = { + specPath: result.specPath, + format: result.format, + totalViolations: result.diagnostics.length, + nonBreakingCount: nonBreakingViolations.length, + nonBreakingViolations, + }; + + if (largeSpecWarning) { + response.largeSpecWarning = largeSpecWarning; + } + + return { content: [{ type: 'text', text: JSON.stringify(response) }] }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return mcpError( + ERROR_CODES.GRADE_ENGINE_ERROR, + `GradeEngine error: ${message}`, + { specPath } + ); + } + } + ); +} diff --git a/packages/api-grade-mcp/src/utils/classify.ts b/packages/api-grade-mcp/src/utils/classify.ts new file mode 100644 index 0000000..8bc88eb --- /dev/null +++ b/packages/api-grade-mcp/src/utils/classify.ts @@ -0,0 +1,150 @@ +import type { Diagnostic } from '@dawmatt/api-grade-core'; + +export type ViolationClass = 'nonBreaking' | 'breaking' | 'unknown'; + +const RULE_ID_NON_BREAKING_PREFIXES = [ + 'operation-description', + 'operation-summary', + 'info-contact', + 'info-description', + 'info-license', + 'oas3-examples-', + 'tag-description', +]; + +const NON_BREAKING_SEGMENTS = new Set([ + 'description', + 'summary', + 'title', + 'contact', + 'license', + 'termsOfService', + 'externalDocs', + 'example', + 'examples', + 'tags', + 'info', +]); + +const BREAKING_SEGMENTS = new Set([ + 'required', + 'type', + 'format', +]); + +function isNonBreakingPath(path: string[]): boolean { + for (const segment of path) { + if (segment.startsWith('x-')) return true; + if (NON_BREAKING_SEGMENTS.has(segment)) return true; + } + return false; +} + +function isBreakingPath(path: string[]): boolean { + for (const segment of path) { + if (BREAKING_SEGMENTS.has(segment)) return true; + if (segment === 'parameters') return true; + } + return false; +} + +export function classifyViolation(diagnostic: Diagnostic): ViolationClass { + // Rule ID overrides take priority + for (const prefix of RULE_ID_NON_BREAKING_PREFIXES) { + if (diagnostic.ruleId.startsWith(prefix)) return 'nonBreaking'; + } + + const path = diagnostic.path ?? []; + + if (isBreakingPath(path)) return 'breaking'; + if (isNonBreakingPath(path)) return 'nonBreaking'; + return 'unknown'; +} + +const SEVERITY_LABELS: Record = { + 0: 'error', + 1: 'warn', + 2: 'info', + 3: 'hint', +}; + +export interface NonBreakingViolation { + ruleId: string; + message: string; + severity: string; + path: string[]; + location: string; + currentValue: string | null; + expectedImprovement: string; +} + +export function buildNonBreakingViolation( + diagnostic: Diagnostic, + specContent: string +): NonBreakingViolation { + const path = (diagnostic.path ?? []) as string[]; + const location = path.join('.'); + + let currentValue: string | null = null; + try { + if (path.length > 0) { + const parsed: unknown = JSON.parse(specContent); + let node: unknown = parsed; + for (const segment of path) { + if (node === null || typeof node !== 'object') { + node = undefined; + break; + } + node = (node as Record)[segment]; + } + if (node !== undefined && node !== null) { + currentValue = typeof node === 'string' ? node : JSON.stringify(node); + } + } + } catch { + // JSON parse failed (e.g. YAML spec) — leave currentValue as null + } + + const lastSegment = path[path.length - 1] ?? 'field'; + const expectedImprovement = deriveExpectedImprovement(diagnostic.ruleId, diagnostic.message, lastSegment, path); + + const severityNum = typeof diagnostic.severity === 'number' ? diagnostic.severity : 1; + + return { + ruleId: diagnostic.ruleId, + message: diagnostic.message, + severity: SEVERITY_LABELS[severityNum] ?? 'warn', + path, + location, + currentValue, + expectedImprovement, + }; +} + +function deriveExpectedImprovement( + ruleId: string, + message: string, + lastSegment: string, + path: string[] +): string { + if (ruleId.includes('description')) { + const entity = path.length > 1 ? path[path.length - 2] : 'item'; + return `Add a \`description\` field that explains the purpose of this ${entity}`; + } + if (ruleId.includes('summary')) { + return `Add a \`summary\` field with a brief one-line description`; + } + if (ruleId.includes('contact')) { + return `Add a \`contact\` object to the info block with name, email, or url`; + } + if (ruleId.includes('license')) { + return `Add a \`license\` object to the info block with name and url`; + } + if (ruleId.includes('example')) { + return `Add an \`example\` or \`examples\` field illustrating expected values`; + } + if (ruleId.includes('tag-description')) { + return `Add a \`description\` field to this tag explaining its purpose`; + } + return `Fix: ${message}. Add or update \`${lastSegment}\` as required`; +} diff --git a/packages/api-grade-mcp/src/utils/errors.ts b/packages/api-grade-mcp/src/utils/errors.ts new file mode 100644 index 0000000..557d7cb --- /dev/null +++ b/packages/api-grade-mcp/src/utils/errors.ts @@ -0,0 +1,27 @@ +export const ERROR_CODES = { + SPEC_NOT_FOUND: 'SPEC_NOT_FOUND', + SPEC_PARSE_ERROR: 'SPEC_PARSE_ERROR', + RULESET_NOT_FOUND: 'RULESET_NOT_FOUND', + INVALID_GRADE: 'INVALID_GRADE', + GRADE_ENGINE_ERROR: 'GRADE_ENGINE_ERROR', +} as const; + +export type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES]; + +export interface McpErrorResponse { + error: ErrorCode; + message: string; + input: Record; +} + +export function mcpError( + code: ErrorCode, + message: string, + input: Record +): { content: [{ type: 'text'; text: string }]; isError: true } { + const body: McpErrorResponse = { error: code, message, input }; + return { + content: [{ type: 'text', text: JSON.stringify(body) }], + isError: true, + }; +} diff --git a/packages/api-grade-mcp/tests/integration/assert-grade.test.ts b/packages/api-grade-mcp/tests/integration/assert-grade.test.ts new file mode 100644 index 0000000..526e34f --- /dev/null +++ b/packages/api-grade-mcp/tests/integration/assert-grade.test.ts @@ -0,0 +1,60 @@ +import { describe, it, expect } from 'vitest'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { createServer } from '../../src/server.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const FIXTURES = resolve(__dirname, '../../../../tests/fixtures'); +const OPENAPI_MUSEUM = resolve(FIXTURES, 'openapi/museum-api.yaml'); +const OPENAPI_POOR = resolve(FIXTURES, 'openapi/poor-quality.yaml'); + +type ToolRegistry = Record, extra: unknown) => Promise }>; + +async function callTool(server: ReturnType, toolName: string, args: Record) { + const tools = (server as unknown as { _registeredTools: ToolRegistry })._registeredTools; + const tool = tools[toolName]; + if (!tool) throw new Error(`${toolName} tool not registered`); + return tool.handler(args, {}) as Promise<{ content: [{ type: string; text: string }]; isError?: boolean }>; +} + +describe('assert-api-grade tool', () => { + it('passes when actual grade meets or exceeds minimum', async () => { + const server = createServer(); + const result = await callTool(server, 'assert-api-grade', { specPath: OPENAPI_MUSEUM, minimumGrade: 'F' }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body.passed).toBe(true); + expect(body).toHaveProperty('actual'); + expect(body).toHaveProperty('minimum'); + expect(body.minimum).toBe('F'); + }); + + it('fails when actual grade is below minimum', async () => { + const server = createServer(); + const result = await callTool(server, 'assert-api-grade', { specPath: OPENAPI_POOR, minimumGrade: 'A' }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body).toHaveProperty('passed'); + expect(body).toHaveProperty('actual'); + if (body.actual !== 'A') { + expect(body.passed).toBe(false); + } + }); + + it('returns INVALID_GRADE error for invalid grade value', async () => { + const server = createServer(); + const result = await callTool(server, 'assert-api-grade', { specPath: OPENAPI_MUSEUM, minimumGrade: 'X' }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('INVALID_GRADE'); + expect(body.message).toContain('X'); + }); + + it('returns SPEC_NOT_FOUND error for non-existent spec', async () => { + const server = createServer(); + const result = await callTool(server, 'assert-api-grade', { specPath: '/no/such/file.yaml', minimumGrade: 'C' }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('SPEC_NOT_FOUND'); + }); +}); diff --git a/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts b/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts new file mode 100644 index 0000000..84e24e0 --- /dev/null +++ b/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts @@ -0,0 +1,59 @@ +import { describe, it, expect } from 'vitest'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { createServer } from '../../src/server.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const FIXTURES = resolve(__dirname, '../../../../tests/fixtures'); +const OPENAPI_POOR = resolve(FIXTURES, 'openapi/poor-quality.yaml'); +const ASYNCAPI_FIXTURE = resolve(FIXTURES, 'asyncapi/poor-quality.yaml'); + +type ToolRegistry = Record, extra: unknown) => Promise }>; + +async function callTool(server: ReturnType, toolName: string, args: Record) { + const tools = (server as unknown as { _registeredTools: ToolRegistry })._registeredTools; + const tool = tools[toolName]; + if (!tool) throw new Error(`${toolName} tool not registered`); + return tool.handler(args, {}) as Promise<{ content: [{ type: string; text: string }]; isError?: boolean }>; +} + +describe('grade-api-detailed tool', () => { + it('response includes diagnostics array', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api-detailed', { specPath: OPENAPI_POOR }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(Array.isArray(body.diagnostics)).toBe(true); + }); + + it('each diagnostic has required fields', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api-detailed', { specPath: OPENAPI_POOR }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + if (body.diagnostics.length > 0) { + const d = body.diagnostics[0]; + expect(d).toHaveProperty('ruleId'); + expect(d).toHaveProperty('message'); + expect(d).toHaveProperty('severity'); + expect(d).toHaveProperty('path'); + } + }); + + it('returns SPEC_NOT_FOUND for non-existent spec', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api-detailed', { specPath: '/no/such/spec.yaml' }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('SPEC_NOT_FOUND'); + }); + + it('grades AsyncAPI spec successfully', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api-detailed', { specPath: ASYNCAPI_FIXTURE }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body.format).toMatch(/^asyncapi/); + expect(Array.isArray(body.diagnostics)).toBe(true); + }); +}); diff --git a/packages/api-grade-mcp/tests/integration/grade.test.ts b/packages/api-grade-mcp/tests/integration/grade.test.ts new file mode 100644 index 0000000..b07f55e --- /dev/null +++ b/packages/api-grade-mcp/tests/integration/grade.test.ts @@ -0,0 +1,69 @@ +import { describe, it, expect } from 'vitest'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { writeFileSync, unlinkSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { createServer } from '../../src/server.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const FIXTURES = resolve(__dirname, '../../../../tests/fixtures'); +const OPENAPI_FIXTURE = resolve(FIXTURES, 'openapi/poor-quality.yaml'); +const ASYNCAPI_FIXTURE = resolve(FIXTURES, 'asyncapi/poor-quality.yaml'); + +type ToolRegistry = Record, extra: unknown) => Promise }>; + +async function callTool(server: ReturnType, toolName: string, args: Record) { + const tools = (server as unknown as { _registeredTools: ToolRegistry })._registeredTools; + const tool = tools[toolName]; + if (!tool) throw new Error(`${toolName} tool not registered`); + return tool.handler(args, {}) as Promise<{ content: [{ type: string; text: string }]; isError?: boolean }>; +} + +describe('grade-api tool', () => { + it('grades a valid OpenAPI spec and returns correct shape', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api', { specPath: OPENAPI_FIXTURE }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body).toHaveProperty('letterGrade'); + expect(['A', 'B', 'C', 'D', 'F']).toContain(body.letterGrade); + expect(body).toHaveProperty('numericScore'); + expect(body).toHaveProperty('summary'); + expect(body).not.toHaveProperty('diagnostics'); + expect(body.format).toMatch(/^openapi/); + }); + + it('grades a valid AsyncAPI spec and returns correct shape', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api', { specPath: ASYNCAPI_FIXTURE }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body).toHaveProperty('letterGrade'); + expect(body.format).toMatch(/^asyncapi/); + }); + + it('returns SPEC_NOT_FOUND error for non-existent path', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api', { specPath: '/does/not/exist.yaml' }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('SPEC_NOT_FOUND'); + expect(body.message).toContain('/does/not/exist.yaml'); + }); + + it('returns largeSpecWarning for spec over 500KB', async () => { + const tmp = resolve(tmpdir(), `large-spec-${Date.now()}.yaml`); + const bigContent = 'openapi: "3.0.0"\ninfo:\n title: Big\n version: "1.0"\npaths: {}\n' + ' '.repeat(500_001); + writeFileSync(tmp, bigContent); + try { + const server = createServer(); + const result = await callTool(server, 'grade-api', { specPath: tmp }); + const body = JSON.parse(result.content[0].text); + if (!result.isError) { + expect(body).toHaveProperty('largeSpecWarning'); + } + } finally { + unlinkSync(tmp); + } + }); +}); diff --git a/packages/api-grade-mcp/tests/integration/non-breaking.test.ts b/packages/api-grade-mcp/tests/integration/non-breaking.test.ts new file mode 100644 index 0000000..0a6c985 --- /dev/null +++ b/packages/api-grade-mcp/tests/integration/non-breaking.test.ts @@ -0,0 +1,77 @@ +import { describe, it, expect } from 'vitest'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { createServer } from '../../src/server.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const FIXTURES = resolve(__dirname, '../../../../tests/fixtures'); +const OPENAPI_POOR = resolve(FIXTURES, 'openapi/poor-quality.yaml'); +const OPENAPI_MUSEUM = resolve(FIXTURES, 'openapi/museum-api.yaml'); + +type ToolRegistry = Record, extra: unknown) => Promise }>; + +async function callTool(server: ReturnType, toolName: string, args: Record) { + const tools = (server as unknown as { _registeredTools: ToolRegistry })._registeredTools; + const tool = tools[toolName]; + if (!tool) throw new Error(`${toolName} tool not registered`); + return tool.handler(args, {}) as Promise<{ content: [{ type: string; text: string }]; isError?: boolean }>; +} + +describe('get-non-breaking-violations tool', () => { + it('returns non-empty nonBreakingViolations for a spec with documentation gaps', async () => { + const server = createServer(); + const result = await callTool(server, 'get-non-breaking-violations', { specPath: OPENAPI_POOR }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body).toHaveProperty('nonBreakingViolations'); + expect(body).toHaveProperty('nonBreakingCount'); + expect(body).toHaveProperty('totalViolations'); + }); + + it('each violation has all required fields', async () => { + const server = createServer(); + const result = await callTool(server, 'get-non-breaking-violations', { specPath: OPENAPI_POOR }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + if (body.nonBreakingViolations.length > 0) { + const v = body.nonBreakingViolations[0]; + expect(v).toHaveProperty('ruleId'); + expect(v).toHaveProperty('message'); + expect(v).toHaveProperty('severity'); + expect(v).toHaveProperty('path'); + expect(v).toHaveProperty('location'); + expect(v).toHaveProperty('currentValue'); + expect(v).toHaveProperty('expectedImprovement'); + expect(typeof v.expectedImprovement).toBe('string'); + expect(v.expectedImprovement.length).toBeGreaterThan(0); + } + }); + + it('no violation in nonBreakingViolations is a breaking change', async () => { + const server = createServer(); + const result = await callTool(server, 'get-non-breaking-violations', { specPath: OPENAPI_POOR }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + for (const v of body.nonBreakingViolations) { + expect(v.path).not.toContain('required'); + expect(v.path).not.toContain('type'); + } + }); + + it('nonBreakingCount matches nonBreakingViolations length', async () => { + const server = createServer(); + const result = await callTool(server, 'get-non-breaking-violations', { specPath: OPENAPI_MUSEUM }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(typeof body.nonBreakingCount).toBe('number'); + expect(body.nonBreakingCount).toBe(body.nonBreakingViolations.length); + }); + + it('returns SPEC_NOT_FOUND for non-existent spec', async () => { + const server = createServer(); + const result = await callTool(server, 'get-non-breaking-violations', { specPath: '/no/such/file.yaml' }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('SPEC_NOT_FOUND'); + }); +}); diff --git a/packages/api-grade-mcp/tests/unit/classify.test.ts b/packages/api-grade-mcp/tests/unit/classify.test.ts new file mode 100644 index 0000000..7a39ea5 --- /dev/null +++ b/packages/api-grade-mcp/tests/unit/classify.test.ts @@ -0,0 +1,57 @@ +import { describe, it, expect } from 'vitest'; +import { classifyViolation } from '../../src/utils/classify.js'; +import type { Diagnostic } from '@dawmatt/api-grade-core'; + +function makeDiagnostic(overrides: Partial): Diagnostic { + return { + ruleId: 'test-rule', + message: 'test message', + severity: 1, + path: [], + range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }, + source: undefined, + ...overrides, + }; +} + +describe('classifyViolation()', () => { + it('classifies operation-description as nonBreaking (rule ID override)', () => { + const d = makeDiagnostic({ ruleId: 'operation-description', path: ['paths', '/pets', 'get'] }); + expect(classifyViolation(d)).toBe('nonBreaking'); + }); + + it('classifies violation at required field as breaking', () => { + const d = makeDiagnostic({ ruleId: 'some-rule', path: ['paths', '/pets', 'get', 'parameters', '0', 'required'] }); + expect(classifyViolation(d)).toBe('breaking'); + }); + + it('classifies info-contact as nonBreaking (rule ID override)', () => { + const d = makeDiagnostic({ ruleId: 'info-contact', path: ['info'] }); + expect(classifyViolation(d)).toBe('nonBreaking'); + }); + + it('classifies violation with x- extension path as nonBreaking', () => { + const d = makeDiagnostic({ ruleId: 'some-rule', path: ['info', 'x-logo'] }); + expect(classifyViolation(d)).toBe('nonBreaking'); + }); + + it('classifies unknown path with no recognised segments as unknown', () => { + const d = makeDiagnostic({ ruleId: 'obscure-rule', path: ['components', 'securitySchemes', 'oauth2'] }); + expect(classifyViolation(d)).toBe('unknown'); + }); + + it('classifies oas3-examples-* rules as nonBreaking', () => { + const d = makeDiagnostic({ ruleId: 'oas3-examples-value-or-externalValue', path: ['paths', '/pets', 'get'] }); + expect(classifyViolation(d)).toBe('nonBreaking'); + }); + + it('classifies description path segment as nonBreaking', () => { + const d = makeDiagnostic({ ruleId: 'some-rule', path: ['info', 'description'] }); + expect(classifyViolation(d)).toBe('nonBreaking'); + }); + + it('classifies type path segment as breaking', () => { + const d = makeDiagnostic({ ruleId: 'some-rule', path: ['components', 'schemas', 'Pet', 'type'] }); + expect(classifyViolation(d)).toBe('breaking'); + }); +}); diff --git a/packages/api-grade-mcp/tests/unit/server.test.ts b/packages/api-grade-mcp/tests/unit/server.test.ts new file mode 100644 index 0000000..fd871f9 --- /dev/null +++ b/packages/api-grade-mcp/tests/unit/server.test.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import { createServer } from '../../src/server.js'; + +describe('createServer()', () => { + it('returns an object with a connect method', () => { + const server = createServer(); + expect(typeof server.connect).toBe('function'); + }); + + it('can be called multiple times independently', () => { + const s1 = createServer(); + const s2 = createServer(); + expect(s1).not.toBe(s2); + }); +}); diff --git a/packages/api-grade-mcp/tsconfig.json b/packages/api-grade-mcp/tsconfig.json new file mode 100644 index 0000000..71aabd5 --- /dev/null +++ b/packages/api-grade-mcp/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["ES2022"], + "outDir": "dist", + "rootDir": "src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "tests"] +} diff --git a/packages/api-grade-mcp/vitest.config.ts b/packages/api-grade-mcp/vitest.config.ts new file mode 100644 index 0000000..e634b42 --- /dev/null +++ b/packages/api-grade-mcp/vitest.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['tests/**/*.test.ts'], + globals: false, + environment: 'node', + coverage: { + provider: 'v8', + include: ['src/**/*.ts'], + thresholds: { + lines: 80, + }, + }, + }, +}); diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index 1479e4e..283b706 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -17,11 +17,11 @@ **Purpose**: Scaffold the `@dawmatt/api-grade-mcp` package in the monorepo and wire it into the workspace build, lint, and test infrastructure. -- [ ] T001 Create `packages/api-grade-mcp/src/tools/`, `packages/api-grade-mcp/src/utils/`, and `packages/api-grade-mcp/tests/unit/` and `packages/api-grade-mcp/tests/integration/` directory structure per plan.md -- [ ] T002 Create `packages/api-grade-mcp/package.json` with name `@dawmatt/api-grade-mcp`, `type: "module"`, `bin`, `exports`, `scripts` (build/test/test:coverage/lint/typecheck), and dependencies `@modelcontextprotocol/sdk`, `@dawmatt/api-grade-core: "*"`, `zod`; devDependencies `vitest`, `@vitest/coverage-v8`, `typescript` -- [ ] T003 [P] Create `packages/api-grade-mcp/tsconfig.json` following the pattern from `packages/api-grade-core/tsconfig.json` (ESM, `NodeNext` module resolution, `outDir: dist`) -- [ ] T004 [P] Create `packages/api-grade-mcp/vitest.config.ts` following the pattern from `packages/api-grade-core/vitest.config.ts` -- [ ] T005 [P] Verify `packages/api-grade-mcp` is picked up by the root `workspaces: ["packages/*"]` declaration in root `package.json` and run `yarn install` to register the workspace +- [X] T001 Create `packages/api-grade-mcp/src/tools/`, `packages/api-grade-mcp/src/utils/`, and `packages/api-grade-mcp/tests/unit/` and `packages/api-grade-mcp/tests/integration/` directory structure per plan.md +- [X] T002 Create `packages/api-grade-mcp/package.json` with name `@dawmatt/api-grade-mcp`, `type: "module"`, `bin`, `exports`, `scripts` (build/test/test:coverage/lint/typecheck), and dependencies `@modelcontextprotocol/sdk`, `@dawmatt/api-grade-core: "*"`, `zod`; devDependencies `vitest`, `@vitest/coverage-v8`, `typescript` +- [X] T003 [P] Create `packages/api-grade-mcp/tsconfig.json` following the pattern from `packages/api-grade-core/tsconfig.json` (ESM, `NodeNext` module resolution, `outDir: dist`) +- [X] T004 [P] Create `packages/api-grade-mcp/vitest.config.ts` following the pattern from `packages/api-grade-core/vitest.config.ts` +- [X] T005 [P] Verify `packages/api-grade-mcp` is picked up by the root `workspaces: ["packages/*"]` declaration in root `package.json` and run `yarn install` to register the workspace **Checkpoint**: `yarn workspace api-grade-mcp run build` resolves (even with empty src) and `yarn workspaces info` lists `api-grade-mcp` @@ -33,10 +33,10 @@ **⚠️ CRITICAL**: No user story work can begin until this phase is complete. -- [ ] T006 Implement `packages/api-grade-mcp/src/utils/errors.ts` — exports `mcpError(code, message, input)` returning the structured `{ error, message, input }` shape defined in data-model.md, and the `ERROR_CODES` const object (`SPEC_NOT_FOUND`, `SPEC_PARSE_ERROR`, `RULESET_NOT_FOUND`, `INVALID_GRADE`, `GRADE_ENGINE_ERROR`) -- [ ] T007 [P] Implement stub `packages/api-grade-mcp/src/server.ts` — imports `McpServer` from `@modelcontextprotocol/sdk/server/mcp.js`, exports `createServer()` that constructs and returns a named `McpServer` instance (`name: "api-grade"`, version from package.json); no tools registered yet -- [ ] T008 Implement `packages/api-grade-mcp/src/index.ts` — imports `createServer` from `./server.js`, imports `StdioServerTransport` from `@modelcontextprotocol/sdk/server/stdio.js`, calls `server.connect(transport)` and exports nothing (stdio entry point only) -- [ ] T009 [P] Write a smoke test in `packages/api-grade-mcp/tests/unit/server.test.ts` that imports `createServer`, calls it, and asserts the returned object has a `connect` method — confirms the server factory is importable and the test runner works +- [X] T006 Implement `packages/api-grade-mcp/src/utils/errors.ts` — exports `mcpError(code, message, input)` returning the structured `{ error, message, input }` shape defined in data-model.md, and the `ERROR_CODES` const object (`SPEC_NOT_FOUND`, `SPEC_PARSE_ERROR`, `RULESET_NOT_FOUND`, `INVALID_GRADE`, `GRADE_ENGINE_ERROR`) +- [X] T007 [P] Implement stub `packages/api-grade-mcp/src/server.ts` — imports `McpServer` from `@modelcontextprotocol/sdk/server/mcp.js`, exports `createServer()` that constructs and returns a named `McpServer` instance (`name: "api-grade"`, version from package.json); no tools registered yet +- [X] T008 Implement `packages/api-grade-mcp/src/index.ts` — imports `createServer` from `./server.js`, imports `StdioServerTransport` from `@modelcontextprotocol/sdk/server/stdio.js`, calls `server.connect(transport)` and exports nothing (stdio entry point only) +- [X] T009 [P] Write a smoke test in `packages/api-grade-mcp/tests/unit/server.test.ts` that imports `createServer`, calls it, and asserts the returned object has a `connect` method — confirms the server factory is importable and the test runner works **Checkpoint**: `yarn workspace api-grade-mcp run typecheck` passes; `yarn workspace api-grade-mcp run test` finds and runs the smoke test @@ -50,10 +50,10 @@ ### Implementation for User Story 1 -- [ ] T010 [P] [US1] Implement `packages/api-grade-mcp/src/tools/grade.ts` — exports `registerGradeTool(server: McpServer)` that calls `server.tool("grade-api", description, zodSchema, handler)`; handler instantiates `GradeEngine`, calls `engine.grade({ specPath, rulesetPath })`, projects the result to `GradeSummaryResponse` (omitting `diagnostics[]`), checks file size for the 500KB warning, and returns `{ content: [{ type: "text", text: JSON.stringify(result) }] }` -- [ ] T011 [US1] Wire `registerGradeTool` into `packages/api-grade-mcp/src/server.ts` — import and call after server construction -- [ ] T012 [P] [US1] Write integration tests in `packages/api-grade-mcp/tests/integration/grade.test.ts` — test: (a) valid OpenAPI spec returns correct shape; (b) valid AsyncAPI spec returns correct shape; (c) non-existent path returns `SPEC_NOT_FOUND` error; (d) spec over 500KB returns `largeSpecWarning` field; use `createServer()` directly without starting the stdio transport -- [ ] T013 [US1] Add error handling in `packages/api-grade-mcp/src/tools/grade.ts` for missing file (`SPEC_NOT_FOUND`), inaccessible ruleset (`RULESET_NOT_FOUND`), and unexpected GradeEngine errors (`GRADE_ENGINE_ERROR`) using helpers from `utils/errors.ts` +- [X] T010 [P] [US1] Implement `packages/api-grade-mcp/src/tools/grade.ts` — exports `registerGradeTool(server: McpServer)` that calls `server.tool("grade-api", description, zodSchema, handler)`; handler instantiates `GradeEngine`, calls `engine.grade({ specPath, rulesetPath })`, projects the result to `GradeSummaryResponse` (omitting `diagnostics[]`), checks file size for the 500KB warning, and returns `{ content: [{ type: "text", text: JSON.stringify(result) }] }` +- [X] T011 [US1] Wire `registerGradeTool` into `packages/api-grade-mcp/src/server.ts` — import and call after server construction +- [X] T012 [P] [US1] Write integration tests in `packages/api-grade-mcp/tests/integration/grade.test.ts` — test: (a) valid OpenAPI spec returns correct shape; (b) valid AsyncAPI spec returns correct shape; (c) non-existent path returns `SPEC_NOT_FOUND` error; (d) spec over 500KB returns `largeSpecWarning` field; use `createServer()` directly without starting the stdio transport +- [X] T013 [US1] Add error handling in `packages/api-grade-mcp/src/tools/grade.ts` for missing file (`SPEC_NOT_FOUND`), inaccessible ruleset (`RULESET_NOT_FOUND`), and unexpected GradeEngine errors (`GRADE_ENGINE_ERROR`) using helpers from `utils/errors.ts` **Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes with all four grade.test.ts scenarios green; `grade-api` tool is callable via `createServer()` in tests @@ -67,9 +67,9 @@ ### Implementation for User Story 2 -- [ ] T014 [P] [US2] Implement `packages/api-grade-mcp/src/tools/assert-grade.ts` — exports `registerAssertGradeTool(server: McpServer)`; Zod schema includes `specPath`, `minimumGrade` (z.enum(["A","B","C","D","F"])), optional `rulesetPath`; handler validates `minimumGrade` against `LETTER_GRADE_ORDER` from `api-grade-core`, calls `engine.grade(...)`, compares using `gradeToNumber`, returns `AssertionResult` shape from data-model.md -- [ ] T015 [US2] Wire `registerAssertGradeTool` into `packages/api-grade-mcp/src/server.ts` -- [ ] T016 [P] [US2] Write integration tests in `packages/api-grade-mcp/tests/integration/assert-grade.test.ts` — test: (a) actual B vs minimum C → `passed: true`; (b) actual D vs minimum B → `passed: false` with correct `actual`; (c) invalid grade value → `INVALID_GRADE` error; (d) non-existent spec → `SPEC_NOT_FOUND` error +- [X] T014 [P] [US2] Implement `packages/api-grade-mcp/src/tools/assert-grade.ts` — exports `registerAssertGradeTool(server: McpServer)`; Zod schema includes `specPath`, `minimumGrade` (z.enum(["A","B","C","D","F"])), optional `rulesetPath`; handler validates `minimumGrade` against `LETTER_GRADE_ORDER` from `api-grade-core`, calls `engine.grade(...)`, compares using `gradeToNumber`, returns `AssertionResult` shape from data-model.md +- [X] T015 [US2] Wire `registerAssertGradeTool` into `packages/api-grade-mcp/src/server.ts` +- [X] T016 [P] [US2] Write integration tests in `packages/api-grade-mcp/tests/integration/assert-grade.test.ts` — test: (a) actual B vs minimum C → `passed: true`; (b) actual D vs minimum B → `passed: false` with correct `actual`; (c) invalid grade value → `INVALID_GRADE` error; (d) non-existent spec → `SPEC_NOT_FOUND` error **Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes with all assert-grade.test.ts scenarios green @@ -83,9 +83,9 @@ ### Implementation for User Story 3 -- [ ] T017 [P] [US3] Implement `packages/api-grade-mcp/src/tools/grade-detailed.ts` — exports `registerGradeDetailedTool(server: McpServer)`; handler calls `engine.grade(...)` and returns the full `GradeResult` serialised; applies 500KB large-spec warning and truncates `diagnostics[]` to 100 entries with `truncated: true` when exceeded -- [ ] T018 [US3] Wire `registerGradeDetailedTool` into `packages/api-grade-mcp/src/server.ts` -- [ ] T019 [P] [US3] Write integration tests in `packages/api-grade-mcp/tests/integration/grade-detailed.test.ts` — test: (a) response includes `diagnostics[]` array; (b) each diagnostic has required fields (`ruleId`, `message`, `severity`, `path`); (c) non-existent spec → `SPEC_NOT_FOUND` error; (d) AsyncAPI spec is graded successfully (multi-format check) +- [X] T017 [P] [US3] Implement `packages/api-grade-mcp/src/tools/grade-detailed.ts` — exports `registerGradeDetailedTool(server: McpServer)`; handler calls `engine.grade(...)` and returns the full `GradeResult` serialised; applies 500KB large-spec warning and truncates `diagnostics[]` to 100 entries with `truncated: true` when exceeded +- [X] T018 [US3] Wire `registerGradeDetailedTool` into `packages/api-grade-mcp/src/server.ts` +- [X] T019 [P] [US3] Write integration tests in `packages/api-grade-mcp/tests/integration/grade-detailed.test.ts` — test: (a) response includes `diagnostics[]` array; (b) each diagnostic has required fields (`ruleId`, `message`, `severity`, `path`); (c) non-existent spec → `SPEC_NOT_FOUND` error; (d) AsyncAPI spec is graded successfully (multi-format check) **Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes with all grade-detailed.test.ts scenarios green @@ -99,11 +99,11 @@ ### Implementation for User Story 4 -- [ ] T020 [P] [US4] Implement `packages/api-grade-mcp/src/utils/classify.ts` — exports `classifyViolation(diagnostic: Diagnostic): "nonBreaking" | "breaking" | "unknown"` using the path-segment inspection and rule ID override logic from research.md; exports `buildNonBreakingViolation(diagnostic: Diagnostic, specContent: string): NonBreakingViolation` that populates all fields from data-model.md including `currentValue` (extracted from parsed spec at `path`) and `expectedImprovement` (derived from rule message) -- [ ] T021 [P] [US4] Write unit tests in `packages/api-grade-mcp/tests/unit/classify.test.ts` — test: (a) `operation-description` at `paths./pets.get` → `nonBreaking`; (b) violation at `paths./pets.get.parameters[0].required` → `breaking`; (c) `info-contact` → `nonBreaking`; (d) rule with `x-` extension path → `nonBreaking`; (e) unknown path with no recognised segments → `unknown` -- [ ] T022 [US4] Implement `packages/api-grade-mcp/src/tools/non-breaking.ts` — exports `registerNonBreakingTool(server: McpServer)`; handler calls `engine.grade(...)`, filters diagnostics to `nonBreaking` classification, maps each to `NonBreakingViolation` via `buildNonBreakingViolation`, returns `NonBreakingViolationResult` shape from data-model.md -- [ ] T023 [US4] Wire `registerNonBreakingTool` into `packages/api-grade-mcp/src/server.ts` -- [ ] T024 [P] [US4] Write integration tests in `packages/api-grade-mcp/tests/integration/non-breaking.test.ts` — test: (a) spec with known documentation gaps returns non-empty `nonBreakingViolations[]`; (b) each violation has all required fields; (c) no breaking-change violations are included in the list; (d) spec with only breaking violations returns `nonBreakingCount: 0`; (e) non-existent spec → `SPEC_NOT_FOUND` error +- [X] T020 [P] [US4] Implement `packages/api-grade-mcp/src/utils/classify.ts` — exports `classifyViolation(diagnostic: Diagnostic): "nonBreaking" | "breaking" | "unknown"` using the path-segment inspection and rule ID override logic from research.md; exports `buildNonBreakingViolation(diagnostic: Diagnostic, specContent: string): NonBreakingViolation` that populates all fields from data-model.md including `currentValue` (extracted from parsed spec at `path`) and `expectedImprovement` (derived from rule message) +- [X] T021 [P] [US4] Write unit tests in `packages/api-grade-mcp/tests/unit/classify.test.ts` — test: (a) `operation-description` at `paths./pets.get` → `nonBreaking`; (b) violation at `paths./pets.get.parameters[0].required` → `breaking`; (c) `info-contact` → `nonBreaking`; (d) rule with `x-` extension path → `nonBreaking`; (e) unknown path with no recognised segments → `unknown` +- [X] T022 [US4] Implement `packages/api-grade-mcp/src/tools/non-breaking.ts` — exports `registerNonBreakingTool(server: McpServer)`; handler calls `engine.grade(...)`, filters diagnostics to `nonBreaking` classification, maps each to `NonBreakingViolation` via `buildNonBreakingViolation`, returns `NonBreakingViolationResult` shape from data-model.md +- [X] T023 [US4] Wire `registerNonBreakingTool` into `packages/api-grade-mcp/src/server.ts` +- [X] T024 [P] [US4] Write integration tests in `packages/api-grade-mcp/tests/integration/non-breaking.test.ts` — test: (a) spec with known documentation gaps returns non-empty `nonBreakingViolations[]`; (b) each violation has all required fields; (c) no breaking-change violations are included in the list; (d) spec with only breaking violations returns `nonBreakingCount: 0`; (e) non-existent spec → `SPEC_NOT_FOUND` error **Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes; `classifyViolation` unit tests all green; non-breaking integration tests all green @@ -113,11 +113,11 @@ **Purpose**: Quality gate compliance, FR-014 verification across all three required AI tool targets, and documentation. -- [ ] T025 Run the full quality gate locally and resolve any failures: `npm audit --audit-level=high --omit=dev`, `npm run lint`, `npm run typecheck --workspaces --if-present`, `yarn workspace api-grade-mcp run test:coverage`, `npm run build --workspaces --if-present` +- [X] T025 Run the full quality gate locally and resolve any failures: `npm audit --audit-level=high --omit=dev`, `npm run lint`, `npm run typecheck --workspaces --if-present`, `yarn workspace api-grade-mcp run test:coverage`, `npm run build --workspaces --if-present` - [ ] T026 [P] Verify `grade-api` in **Claude Code**: register the built server via `claude mcp add`, ask Claude to grade a sample spec, confirm structured response (FR-014) - [ ] T027 [P] Verify `grade-api` in **GitHub Copilot (VS Code)**: add `.vscode/mcp.json` with the server entry, switch Copilot Chat to Agent mode, ask it to grade a sample spec, confirm structured response (FR-014) - [ ] T028 Verify all four tools in **GitHub Copilot Studio**: add the server as a custom MCP Action, invoke each tool, confirm all four capabilities work end-to-end (FR-014) -- [ ] T029 [P] Add `packages/api-grade-mcp` to `docs/package/` — brief package README covering install, MCP host config snippet, and the four available tools; update `docs/getting-started.md` with the MCP server as an option alongside CLI +- [X] T029 [P] Add `packages/api-grade-mcp` to `docs/package/` — brief package README covering install, MCP host config snippet, and the four available tools; update `docs/getting-started.md` with the MCP server as an option alongside CLI **Checkpoint**: Quality gate passes; all three AI tool environments verified; `@dawmatt/api-grade-mcp` is publishable diff --git a/yarn.lock b/yarn.lock index 0e975d4..7863920 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1978,6 +1978,11 @@ protobufjs "^7.5.5" yargs "^17.7.2" +"@hono/node-server@^1.19.9": + version "1.19.14" + resolved "https://registry.yarnpkg.com/@hono/node-server/-/node-server-1.19.14.tgz#e30f844bc77e3ce7be442aac3b1f73ad8b58d181" + integrity sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw== + "@humanfs/core@^0.19.2": version "0.19.2" resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.2.tgz#a8272ca03b2acf492670222b2320b6c421bfde60" @@ -2280,6 +2285,29 @@ prop-types "^15.7.2" react-is "^16.8.0 || ^17.0.0" +"@modelcontextprotocol/sdk@^1.0.0": + version "1.29.0" + resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz#79786d8b525e269de850ac82b1f1f757f3915f44" + integrity sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ== + dependencies: + "@hono/node-server" "^1.19.9" + ajv "^8.17.1" + ajv-formats "^3.0.1" + content-type "^1.0.5" + cors "^2.8.5" + cross-spawn "^7.0.5" + eventsource "^3.0.2" + eventsource-parser "^3.0.0" + express "^5.2.1" + express-rate-limit "^8.2.1" + hono "^4.11.4" + jose "^6.1.3" + json-schema-typed "^8.0.2" + pkce-challenge "^5.0.0" + raw-body "^3.0.0" + zod "^3.25 || ^4.0" + zod-to-json-schema "^3.25.1" + "@mui/core-downloads-tracker@^5.18.0": version "5.18.0" resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz#85019a8704b0f63305fc5600635ee663810f2b66" @@ -3823,6 +3851,14 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -3870,6 +3906,13 @@ ajv-errors@^3.0.0, ajv-errors@~3.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-3.0.0.tgz#e54f299f3a3d30fe144161e5f0d8d51196c527bc" integrity sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ== +ajv-formats@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + ajv-formats@~2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -3887,7 +3930,7 @@ ajv@^6.12.3, ajv@^6.14.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.10.0, ajv@^8.18.0: +ajv@^8.0.0, ajv@^8.10.0, ajv@^8.17.1, ajv@^8.18.0: version "8.20.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== @@ -4240,6 +4283,21 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" +body-parser@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.3.0.tgz#6d8662f4d8c336028b8ac9aa24251b0ca64ba437" + integrity sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw== + dependencies: + bytes "^3.1.2" + content-type "^2.0.0" + debug "^4.4.3" + http-errors "^2.0.1" + iconv-lite "^0.7.2" + on-finished "^2.4.1" + qs "^6.15.2" + raw-body "^3.0.2" + type-is "^2.1.0" + body-parser@~1.20.5: version "1.20.5" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.5.tgz#303c8c34423d1d6fa799bc764e93c1e4dc6ebf64" @@ -4366,7 +4424,7 @@ byline@^5.0.0: resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== -bytes@3.1.2, bytes@~3.1.2: +bytes@3.1.2, bytes@^3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== @@ -4685,6 +4743,11 @@ confbox@^0.1.8: resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== +content-disposition@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.1.0.tgz#f3db789c752d45564cc7e9e1e0b31790d4a38e17" + integrity sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g== + content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -4692,11 +4755,16 @@ content-disposition@~0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4, content-type@~1.0.5: +content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +content-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-2.0.0.tgz#2fb3ede69dffa0af78ca7c4ce7589680638b56df" + integrity sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ== + convert-source-map@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" @@ -4707,12 +4775,17 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== + cookie-signature@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== -cookie@~0.7.1: +cookie@^0.7.1, cookie@~0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== @@ -4786,7 +4859,7 @@ cross-fetch@^4.0.0: dependencies: node-fetch "^2.7.0" -cross-spawn@^7.0.3, cross-spawn@^7.0.6: +cross-spawn@^7.0.3, cross-spawn@^7.0.5, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -4991,7 +5064,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.4.3, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.3: +debug@4, debug@4.4.3, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -5082,7 +5155,7 @@ denque@2.1.0, denque@^2.1.0: resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== -depd@2.0.0, depd@~2.0.0: +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -5234,7 +5307,7 @@ enabled@2.0.x: resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== -encodeurl@~2.0.0: +encodeurl@^2.0.0, encodeurl@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== @@ -5426,7 +5499,7 @@ escalade@^3.1.1, escalade@^3.2.0: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-html@~1.0.3: +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== @@ -5557,7 +5630,7 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: +etag@^1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -5579,6 +5652,18 @@ events@^3.0.0, events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +eventsource-parser@^3.0.0, eventsource-parser@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-3.1.0.tgz#4e198eb91cd333d0a8ddcc036502b3618a25f449" + integrity sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg== + +eventsource@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-3.0.7.tgz#1157622e2f5377bb6aef2114372728ba0c156989" + integrity sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA== + dependencies: + eventsource-parser "^3.0.1" + execa@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" @@ -5608,6 +5693,13 @@ express-promise-router@^4.1.0: lodash.flattendeep "^4.0.0" methods "^1.0.0" +express-rate-limit@^8.2.1: + version "8.5.2" + resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-8.5.2.tgz#5922dbf76df2124611cea955d93432b37514b2f3" + integrity sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A== + dependencies: + ip-address "^10.2.0" + express@^4.17.1, express@^4.18.0: version "4.22.2" resolved "https://registry.yarnpkg.com/express/-/express-4.22.2.tgz#c17ae0981e5efc24b22272f0e041c4662503b700" @@ -5645,6 +5737,40 @@ express@^4.17.1, express@^4.18.0: utils-merge "1.0.1" vary "~1.1.2" +express@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/express/-/express-5.2.1.tgz#8f21d15b6d327f92b4794ecf8cb08a72f956ac04" + integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== + dependencies: + accepts "^2.0.0" + body-parser "^2.2.1" + content-disposition "^1.0.0" + content-type "^1.0.5" + cookie "^0.7.1" + cookie-signature "^1.2.1" + debug "^4.4.0" + depd "^2.0.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + finalhandler "^2.1.0" + fresh "^2.0.0" + http-errors "^2.0.0" + merge-descriptors "^2.0.0" + mime-types "^3.0.0" + on-finished "^2.4.1" + once "^1.4.0" + parseurl "^1.3.3" + proxy-addr "^2.0.7" + qs "^6.14.0" + range-parser "^1.2.1" + router "^2.2.0" + send "^1.1.0" + serve-static "^2.2.0" + statuses "^2.0.1" + type-is "^2.0.1" + vary "^1.1.2" + extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -5779,6 +5905,18 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" +finalhandler@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.1.tgz#a2c517a6559852bcdb06d1f8bd7f51b68fad8099" + integrity sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== + dependencies: + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + on-finished "^2.4.1" + parseurl "^1.3.3" + statuses "^2.0.1" + finalhandler@~1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" @@ -5874,6 +6012,11 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== + fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -6371,6 +6514,11 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react- dependencies: react-is "^16.7.0" +hono@^4.11.4: + version "4.12.26" + resolved "https://registry.yarnpkg.com/hono/-/hono-4.12.26.tgz#450edfd64aad96cccc36829d63ec1430272e3ef8" + integrity sha512-uyZtpnYxM9CmQ7QsQknM4zN8EftNqhON1qYeIKM0Se67CCEe2c44xyGURwB0axX2fBDu1dqHrHAc1hmNT8ITkw== + html-encoding-sniffer@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz#f8d9390b3b348b50d4f61c16dd2ef5c05980a882" @@ -6393,7 +6541,7 @@ html-void-elements@^2.0.0: resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== -http-errors@~2.0.0, http-errors@~2.0.1: +http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.0, http-errors@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== @@ -6463,7 +6611,7 @@ i18next@^22.4.15: dependencies: "@babel/runtime" "^7.20.6" -iconv-lite@^0.7.2: +iconv-lite@^0.7.2, iconv-lite@~0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== @@ -6562,6 +6710,11 @@ ioredis@^5.4.1: redis-parser "3.0.0" standard-as-callback "2.1.0" +ip-address@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.2.0.tgz#805fc178b20c518bd4c8548b24fe30892d7f3206" + integrity sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -6968,6 +7121,11 @@ jose@^5.0.0: resolved "https://registry.yarnpkg.com/jose/-/jose-5.10.0.tgz#c37346a099d6467c401351a9a0c2161e0f52c4be" integrity sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg== +jose@^6.1.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/jose/-/jose-6.2.3.tgz#0975197ad973251221c658a3cddc4b951a250c2d" + integrity sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw== + js-cookie@^3.0.0: version "3.0.8" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.8.tgz#444e6f4b27a5d844594fef61c9d6bca5f0787688" @@ -7083,6 +7241,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema-typed@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-8.0.2.tgz#e98ee7b1899ff4a184534d1f167c288c66bbeff4" + integrity sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA== + json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" @@ -7718,6 +7881,11 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +media-typer@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== + memjs@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/memjs/-/memjs-1.3.2.tgz#0b6229bddba00162d1e281ed454217435c4968b3" @@ -7733,6 +7901,11 @@ merge-descriptors@1.0.3: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -8034,7 +8207,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -"mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0: version "1.54.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== @@ -8046,6 +8219,13 @@ mime-types@^2.1.12, mime-types@^2.1.35, mime-types@~2.1.19, mime-types@~2.1.24, dependencies: mime-db "1.52.0" +mime-types@^3.0.0, mime-types@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== + dependencies: + mime-db "^1.54.0" + mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -8237,6 +8417,11 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + negotiator@~0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" @@ -8326,7 +8511,7 @@ oidc-token-hash@^5.0.3: resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.2.0.tgz#be8a8885c7e2478d21a674e15afa31f1bcc4a61f" integrity sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw== -on-finished@~2.4.1: +on-finished@^2.4.1, on-finished@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -8505,7 +8690,7 @@ parse5@^8.0.1: dependencies: entities "^8.0.0" -parseurl@~1.3.3: +parseurl@^1.3.3, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -8572,6 +8757,11 @@ path-to-regexp@^6.2.1: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== +path-to-regexp@^8.0.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz#795c420c4f7ca45c5b887366f622ee0c9852cccd" + integrity sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA== + path-to-regexp@~0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d" @@ -8698,6 +8888,11 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pkce-challenge@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/pkce-challenge/-/pkce-challenge-5.0.1.tgz#3b4446865b17b1745e9ace2016a31f48ddf6230d" + integrity sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ== + pkg-types@^1.2.1, pkg-types@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" @@ -8844,7 +9039,7 @@ protocols@^2.0.0, protocols@^2.0.1: resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.2.tgz#822e8fcdcb3df5356538b3e91bfd890b067fd0a4" integrity sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ== -proxy-addr@~2.0.7: +proxy-addr@^2.0.7, proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== @@ -8872,7 +9067,7 @@ punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@^6.15.2, qs@^6.9.4, qs@~6.15.1: +qs@^6.14.0, qs@^6.15.2, qs@^6.9.4, qs@~6.15.1: version "6.15.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.2.tgz#fd55426d710403ddccc45e0f9eab16db7727ece9" integrity sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw== @@ -8894,7 +9089,7 @@ raf-schd@^4.0.2: resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== -range-parser@~1.2.1: +range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -8909,6 +9104,16 @@ raw-body@^2.4.1, raw-body@~2.5.3: iconv-lite "~0.4.24" unpipe "~1.0.0" +raw-body@^3.0.0, raw-body@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.2.tgz#3e3ada5ae5568f9095d84376fd3a49b8fb000a51" + integrity sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.7.0" + unpipe "~1.0.0" + rc-progress@3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.5.1.tgz#a3cdfd2fe04eb5c3d43fa1c69e7dd70c73b102ae" @@ -9475,6 +9680,17 @@ rollup@~2.80.0: optionalDependencies: fsevents "~2.3.2" +router@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== + dependencies: + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" + rtl-css-js@^1.16.1: version "1.16.1" resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" @@ -9596,6 +9812,23 @@ semver@^7.3.2, semver@^7.5.3, semver@^7.5.4, semver@^7.7.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.4.tgz#c73eceebae0616934be8dff28a7fd70757c8e696" integrity sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA== +send@^1.1.0, send@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/send/-/send-1.2.1.tgz#9eab743b874f3550f40a26867bf286ad60d3f3ed" + integrity sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== + dependencies: + debug "^4.4.3" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + fresh "^2.0.0" + http-errors "^2.0.1" + mime-types "^3.0.2" + ms "^2.1.3" + on-finished "^2.4.1" + range-parser "^1.2.1" + statuses "^2.0.2" + send@~0.19.0, send@~0.19.1: version "0.19.2" resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" @@ -9629,6 +9862,16 @@ serialize-error@^8.0.1: dependencies: type-fest "^0.20.2" +serve-static@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.1.tgz#7f186a4a4e5f5b663ad7a4294ff1bf37cf0e98a9" + integrity sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== + dependencies: + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.2.0" + serve-static@~1.16.2: version "1.16.3" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" @@ -9900,7 +10143,7 @@ standard-as-callback@2.1.0: resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== -statuses@~2.0.1, statuses@~2.0.2: +statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.1, statuses@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== @@ -10382,6 +10625,15 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-is@^2.0.1, type-is@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.1.0.tgz#71d1a7053293582e16ac9f3ebaf1ab9aa49e5570" + integrity sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA== + dependencies: + content-type "^2.0.0" + media-typer "^1.1.0" + mime-types "^3.0.0" + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -10718,7 +10970,7 @@ validate.io-number@^1.0.3: resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== -vary@^1, vary@~1.1.2: +vary@^1, vary@^1.1.2, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== @@ -11123,12 +11375,12 @@ zod-validation-error@^4.0.2: resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz#bc605eba49ce0fcd598c127fee1c236be3f22918" integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== -zod@^3.22.4, zod@^3.25.76: +zod@^3.22.0, zod@^3.22.4, zod@^3.25.76: version "3.25.76" resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== -"zod@^3.25.76 || ^4.0.0", zod@^4.0.0: +"zod@^3.25 || ^4.0", "zod@^3.25.76 || ^4.0.0", zod@^4.0.0: version "4.4.3" resolved "https://registry.yarnpkg.com/zod/-/zod-4.4.3.tgz#b680f172885d18bbebf21a834ea25e55a1bbf356" integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== From a4fad6912f249e1c8f18a1dff02bac43da3624f5 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Fri, 19 Jun 2026 09:05:56 +1000 Subject: [PATCH 04/20] Ruleset configuration and doc improvements scoped and planned --- .../007-ai-support/checklists/requirements.md | 2 + specs/007-ai-support/contracts/mcp-tools.md | 222 ++++++++++++++ specs/007-ai-support/data-model.md | 102 ++++++- specs/007-ai-support/plan.md | 64 +++- specs/007-ai-support/quickstart.md | 80 ++++- specs/007-ai-support/research.md | 168 +++++++++++ specs/007-ai-support/spec.md | 56 +++- specs/007-ai-support/tasks.md | 275 +++++++++++------- 8 files changed, 845 insertions(+), 124 deletions(-) diff --git a/specs/007-ai-support/checklists/requirements.md b/specs/007-ai-support/checklists/requirements.md index 938174b..4b63798 100644 --- a/specs/007-ai-support/checklists/requirements.md +++ b/specs/007-ai-support/checklists/requirements.md @@ -33,6 +33,8 @@ - All items passed on first validation pass (2026-06-18). - All items remain passing after clarification session (2026-06-18) — 16/16. +- All items remain passing after clarification session (2026-06-19) — 16/16. US5 (Configure Default Ruleset) added; five ambiguities resolved: workspace root = CWD, Entra token cache = `~/.api-grade/entra-token-cache.json`, cancel response = `REQUEST_CANCELLED` error, fetch timeouts = 5s initial / 30s retry, session override model = `sessionRulesetOverride: "builtin" | null`. +- All items remain passing after documentation scope update (2026-06-19) — 16/16. FR-025 and SC-009 added: `docs/mcp/` directory with quick-start, configuration reference, and troubleshooting guide required at parity with Backstage and CLI docs. - MCP (Model Context Protocol) is named throughout the spec as a deliberate architectural decision (clarified in session), consistent with the project pattern of naming integration targets (e.g., Backstage in Feature 4). - "Non-breaking violation" is now precisely defined in FR-007: any fix that does not alter paths, methods, required parameters, schema types, or response structures. - Large spec handling defined: best-effort grading with a warning field when threshold is exceeded (FR-013). diff --git a/specs/007-ai-support/contracts/mcp-tools.md b/specs/007-ai-support/contracts/mcp-tools.md index 6bcec31..7625537 100644 --- a/specs/007-ai-support/contracts/mcp-tools.md +++ b/specs/007-ai-support/contracts/mcp-tools.md @@ -264,6 +264,228 @@ --- +--- + +## Tool 5: `configure-ruleset` + +**Purpose**: Set the default ruleset used by this MCP server when no `rulesetPath` is supplied on a grading request. Supports three scopes: `session` (in-memory, resets on server restart), `workspace` (persisted to `.api-grade/config.json` in the workspace root), and `global` (persisted to `~/.api-grade/config.json`). Optionally configure authentication for rulesets hosted in secured locations. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": { + "scope": { + "type": "string", + "enum": ["session", "workspace", "global"], + "description": "Where to store this default: 'session' is in-memory for this server process only; 'workspace' persists to .api-grade/config.json in the current workspace root; 'global' persists to ~/.api-grade/config.json." + }, + "rulesetPath": { + "type": "string", + "description": "Absolute or relative file path, or HTTPS URL, to a Spectral-compatible ruleset file. To clear the default at this scope, omit this field or pass null." + }, + "auth": { + "type": "object", + "description": "Optional authentication configuration for secured ruleset sources. Credentials are stored in a separate auth section from the ruleset path to support safe source-control practices.", + "properties": { + "type": { + "type": "string", + "enum": ["github-pat", "entra-id"], + "description": "'github-pat' uses a Bearer token for GitHub Enterprise URLs. 'entra-id' uses Microsoft Entra ID OAuth 2.0 device-code flow for SharePoint and enterprise internal sites." + }, + "githubToken": { + "type": "string", + "description": "GitHub Personal Access Token (PAT). Only used when type is 'github-pat'. If omitted, the server falls back to the GITHUB_TOKEN environment variable." + }, + "tenantId": { + "type": "string", + "description": "Microsoft Entra ID tenant ID. Required when type is 'entra-id'." + }, + "clientId": { + "type": "string", + "description": "Microsoft Entra ID application (client) ID. Required when type is 'entra-id'." + } + }, + "required": ["type"] + } + }, + "required": ["scope"] +} +``` + +**Output**: + +```json +{ + "scope": "workspace", + "rulesetPath": "https://github.example.com/org/api-standards/raw/main/ruleset.yaml", + "auth": { "type": "github-pat" }, + "configFile": "/Users/jane/projects/myapi/.api-grade/config.json", + "message": "Workspace default ruleset configured. This setting will apply to all grading requests in this workspace unless overridden by a session-level default or a per-request rulesetPath." +} +``` + +**Clear a scope** (pass `rulesetPath: null`): + +```json +{ + "scope": "session", + "rulesetPath": null +} +``` + +Response confirms the scope was cleared and which scope will now take effect. + +**Error response** — invalid auth configuration: + +```json +{ + "error": "INVALID_AUTH_CONFIG", + "message": "auth.type 'entra-id' requires tenantId and clientId fields.", + "input": { "scope": "global", "auth": { "type": "entra-id" } } +} +``` + +**Error response** — config file not writable: + +```json +{ + "error": "CONFIG_WRITE_ERROR", + "message": "Could not write workspace config to /project/.api-grade/config.json: permission denied.", + "input": { "scope": "workspace", "rulesetPath": "..." } +} +``` + +--- + +## Tool 6: `get-ruleset-config` + +**Purpose**: Return the active ruleset configuration at every scope (session, workspace, global), indicate which scope is currently in effect (the effective ruleset), and show the full resolution chain. Use this to diagnose why a particular ruleset is being applied or to confirm a `configure-ruleset` call took effect. + +**Input Schema**: + +```json +{ + "type": "object", + "properties": {}, + "required": [] +} +``` + +(No input required.) + +**Output**: + +```json +{ + "effective": { + "scope": "workspace", + "rulesetPath": "https://github.example.com/org/api-standards/raw/main/ruleset.yaml", + "auth": { "type": "github-pat", "tokenSource": "config-file" } + }, + "session": null, + "workspace": { + "rulesetPath": "https://github.example.com/org/api-standards/raw/main/ruleset.yaml", + "auth": { "type": "github-pat", "tokenSource": "config-file" }, + "configFile": "/Users/jane/projects/myapi/.api-grade/config.json" + }, + "global": null, + "builtIn": "default", + "precedenceOrder": ["session", "workspace", "global", "built-in"], + "note": "Per-request rulesetPath (if supplied on a grading call) always takes precedence over all configured defaults." +} +``` + +**When no defaults are configured**: + +```json +{ + "effective": { "scope": "built-in", "rulesetPath": null }, + "session": null, + "workspace": null, + "global": null, + "builtIn": "default", + "precedenceOrder": ["session", "workspace", "global", "built-in"] +} +``` + +**Note on auth fields**: `auth` in the response always omits raw token values. `tokenSource` may be `"config-file"`, `"env-var"`, or `"none"`. + +--- + +## Auth Failure Recovery Response + +When a grading tool (`grade-api`, `grade-api-detailed`, `assert-api-grade`, or `get-non-breaking-violations`) is invoked and the configured default ruleset cannot be fetched due to an authentication, authorisation, or network failure, the tool returns this structured response instead of an unhandled error: + +```json +{ + "error": "RULESET_AUTH_FAILED", + "failureReason": "network-unreachable", + "rulesetUrl": "https://sharepoint.example.com/sites/api-standards/ruleset.yaml", + "scope": "workspace", + "message": "The configured workspace default ruleset could not be fetched. The host 'sharepoint.example.com' is unreachable — you may be disconnected from the corporate network or VPN.", + "recoveryOptions": [ + { + "id": "retry", + "label": "Retry", + "description": "Attempt to fetch the ruleset again (re-run this grading request using the configured default)." + }, + { + "id": "use-builtin-once", + "label": "Use built-in default for this request", + "description": "Grade using the built-in api-grade ruleset for this one request only. The configured default remains active for future requests." + }, + { + "id": "use-builtin-session", + "label": "Use built-in default for this session", + "description": "Grade using the built-in api-grade ruleset for all remaining requests this session. The configured default is not changed." + }, + { + "id": "cancel", + "label": "Cancel", + "description": "Cancel this grading request without returning a result." + } + ] +} +``` + +**Fetch timeout behaviour**: The initial fetch attempt uses a **5-second timeout**. If the user selects `retry`, the retry uses a **30-second timeout**. All other recovery options bypass the fetch. + +**`failureReason` values**: + +| Value | Meaning | +|---|---| +| `auth-failed` | Credentials present but rejected (401/403 response) | +| `token-expired` | Token recognised but expired (GitHub PAT or Entra ID token) | +| `network-unreachable` | DNS resolution or TCP connection failed (VPN/network issue) | +| `entra-auth-required` | Entra ID authentication required but no cached token; device-code flow needed | +| `config-invalid` | Stored auth config is malformed or missing required fields | + +**Acting on a recovery option**: The AI presents the options to the user, then re-calls the original grading tool with an additional `recoveryOption` parameter set to the chosen `id`. The grading tool honours the choice and proceeds accordingly. + +**Cancel response** — when `recoveryOption: "cancel"` is supplied: + +```json +{ + "error": "REQUEST_CANCELLED", + "message": "Grading request cancelled by user.", + "input": { "specPath": "/path/to/api.yaml" } +} +``` + +**Updated grading tool schemas**: `grade-api`, `grade-api-detailed`, `assert-api-grade`, and `get-non-breaking-violations` all accept one additional optional input field: + +```json +"recoveryOption": { + "type": "string", + "enum": ["retry", "use-builtin-once", "use-builtin-session", "cancel"], + "description": "Recovery action to take when the configured default ruleset is inaccessible. Only supply this field in response to a RULESET_AUTH_FAILED response — do not set it on initial requests." +} +``` + +--- + ## MCP Host Configuration To use this server in a supported MCP host, add the following to its configuration: diff --git a/specs/007-ai-support/data-model.md b/specs/007-ai-support/data-model.md index 3c8d771..6a466ac 100644 --- a/specs/007-ai-support/data-model.md +++ b/specs/007-ai-support/data-model.md @@ -4,7 +4,7 @@ ## Overview -The MCP server introduces no new persistent entities. All domain types originate in `@dawmatt/api-grade-core` and are either passed through directly or projected into MCP-specific response shapes. This document defines the projections and the one net-new type (`NonBreakingViolation`). +The MCP server's grading operations are stateless. US5 (Configure Default Ruleset) introduces limited state: a session-level default held in memory on the `McpServer` instance, and two config files for persistence. All domain types originate in `@dawmatt/api-grade-core` and are either passed through directly or projected into MCP-specific response shapes. This document defines the projections and all net-new types. --- @@ -69,6 +69,75 @@ The processed interpretation of the full diagnostic set. ## Net-New Types (defined in `api-grade-mcp`) +### RulesetConfig + +Represents the stored configuration at a single scope. Serialised to JSON in `.api-grade/config.json` (workspace) or `~/.api-grade/config.json` (global); held in memory for session scope. + +| Field | Type | Required | Description | +|---|---|---|---| +| `rulesetPath` | `string \| null` | ✅ | File path or HTTPS URL to a Spectral ruleset. `null` means this scope has no default configured. | +| `auth` | `AuthConfig \| null` | — | Authentication configuration. `null` when the ruleset is accessible without authentication. | + +### AuthConfig + +Authentication details for fetching a secured ruleset. Stored in a separate `auth` key from `rulesetPath` to allow config files to be committed to source control with the `auth` section excluded or redacted. + +| Field | Type | Required | Description | +|---|---|---|---| +| `type` | `"github-pat" \| "entra-id"` | ✅ | Authentication mechanism | +| `githubToken` | `string \| undefined` | — | PAT value (only for `github-pat`). If absent, server reads `GITHUB_TOKEN` env var at runtime. | +| `tenantId` | `string \| undefined` | — | Entra ID tenant ID (only for `entra-id`) | +| `clientId` | `string \| undefined` | — | Entra ID application client ID (only for `entra-id`) | + +**Validation rules**: +- `type: "entra-id"` requires both `tenantId` and `clientId` +- `githubToken` is never written to the workspace config file (only to the session-level in-memory store or supplied transiently) — workspace config stores only `type: "github-pat"` as a hint, so the runtime falls back to `GITHUB_TOKEN` env var + +### RulesetResolution + +The result of the precedence chain lookup, produced by `resolve-ruleset.ts` before each grading request. + +| Field | Type | Description | +|---|---|---| +| `rulesetPath` | `string \| null` | Resolved path/URL, or `null` if built-in default applies | +| `scope` | `"per-request" \| "session" \| "workspace" \| "global" \| "built-in"` | Which scope provided the resolved value | +| `auth` | `AuthConfig \| null` | Auth config to apply when fetching, or `null` | + +### AuthFailureRecoveryResponse + +Returned by any grading tool when the configured default ruleset cannot be fetched. + +| Field | Type | Required | Description | +|---|---|---|---| +| `error` | `"RULESET_AUTH_FAILED"` | ✅ | Fixed error code | +| `failureReason` | `string` | ✅ | Machine-readable reason: `auth-failed`, `token-expired`, `network-unreachable`, `entra-auth-required`, `config-invalid` | +| `rulesetUrl` | `string` | ✅ | URL that could not be fetched | +| `scope` | `string` | ✅ | Scope where the failing default was configured | +| `message` | `string` | ✅ | Human-readable explanation for the AI to relay | +| `recoveryOptions` | `RecoveryOption[]` | ✅ | The four options the user can choose from | + +### RecoveryOption + +| Field | Type | Description | +|---|---|---| +| `id` | `"retry" \| "use-builtin-once" \| "use-builtin-session" \| "cancel"` | Machine-readable option identifier | +| `label` | `string` | Short label for the option | +| `description` | `string` | Explanation of what this option will do | + +### EntraDeviceCodeResponse + +Returned when `type: "entra-id"` auth is needed but no cached token is available. Allows the AI to prompt the user to complete the device-code flow in a browser. + +| Field | Type | Description | +|---|---|---| +| `error` | `"ENTRA_AUTH_REQUIRED"` | Fixed error code | +| `deviceCodeUrl` | `string` | URL the user should open in a browser | +| `userCode` | `string` | Code the user enters on that page | +| `expiresIn` | `number` | Seconds before the code expires | +| `message` | `string` | Human-readable instruction string | + +--- + ### NonBreakingViolation A single non-breaking violation, enriched with AI-actionable context (per FR-012). @@ -134,13 +203,29 @@ Projected from `GradeResult`; diagnostics array excluded to reduce token usage. ## State Model -All operations are stateless. There is no session, no cache, and no file written by the MCP server. Each tool invocation: +Grading operations remain stateless — no session, no cache. US5 introduces two forms of limited state: + +**In-memory session state** (`SessionState` object held on the `McpServer` instance): + +| Field | Type | Description | +|---|---|---| +| `defaultRuleset` | `RulesetConfig \| null` | Session-level default set via `configure-ruleset scope: session`; `null` if not configured | +| `sessionRulesetOverride` | `"builtin" \| null` | Set to `"builtin"` when the user selects `use-builtin-session`; takes precedence over `defaultRuleset` for all subsequent requests. Cleared implicitly when `configure-ruleset scope: session` is called with a non-null `rulesetPath`. | + +- Session-level Entra ID token cache (held by the MSAL `PublicClientApplication` instance) + +**Persistent file state**: +- `.api-grade/config.json` (relative to CWD/workspace root) — workspace-level `RulesetConfig` +- `~/.api-grade/config.json` — global `RulesetConfig` +- `~/.api-grade/entra-token-cache.json` — MSAL `TokenCacheContext` serialisation; written only to user home directory, never to workspace +Each grading tool invocation: 1. Receives input via MCP stdio -2. Constructs a `GradeRequest` -3. Instantiates `GradeEngine` (or reuses a singleton — TBD in implementation; either is valid given statelesness) -4. Returns a projected JSON response -5. Retains nothing after the response is sent +2. Calls `resolveRuleset(input.rulesetPath, sessionState, workspaceConfig, globalConfig)` to determine the effective ruleset. Precedence: per-request → `sessionRulesetOverride: "builtin"` (short-circuits to built-in immediately) → `session.defaultRuleset` → workspace → global → built-in +3. If the resolved ruleset is a remote URL, fetches it using the associated `AuthConfig` (PAT header or cached Entra token) +4. If fetch fails with an auth/network error, returns `AuthFailureRecoveryResponse` immediately +5. Constructs a `GradeRequest` and calls `GradeEngine` +6. Returns a projected JSON response --- @@ -163,3 +248,8 @@ Structured errors are returned as MCP tool errors (not thrown exceptions). All e | `RULESET_NOT_FOUND` | `rulesetPath` was provided but does not exist | | `INVALID_GRADE` | `minimumGrade` is not one of A/B/C/D/F | | `GRADE_ENGINE_ERROR` | Unexpected error from GradeEngine (wrapped with details) | +| `RULESET_AUTH_FAILED` | Configured default ruleset could not be fetched (auth/network failure) — see `AuthFailureRecoveryResponse` | +| `ENTRA_AUTH_REQUIRED` | Entra ID device-code flow must be completed before the secured ruleset can be fetched | +| `INVALID_AUTH_CONFIG` | Auth configuration is malformed or missing required fields | +| `CONFIG_WRITE_ERROR` | Workspace or global config file could not be written (permission denied or invalid path) | +| `REQUEST_CANCELLED` | User selected the `cancel` recovery option; no grading result is returned | diff --git a/specs/007-ai-support/plan.md b/specs/007-ai-support/plan.md index a000bf8..335a15c 100644 --- a/specs/007-ai-support/plan.md +++ b/specs/007-ai-support/plan.md @@ -19,7 +19,12 @@ Deliver a new npm package (`@dawmatt/api-grade-mcp`) that exposes api-grade capa - `@dawmatt/api-grade-core` — consumed as a workspace dependency; provides `GradeEngine`, all types, and `gradeToNumber` / `LETTER_GRADE_ORDER` utilities - `zod` — schema definition for MCP tool input validation (used by MCP SDK) -**Storage**: N/A — stateless per-request; no database or file storage +**Additional Dependencies (US5 — Ruleset Configuration & Auth)**: +- `@azure/msal-node` — Microsoft Entra ID OAuth 2.0 device-code flow for SharePoint/enterprise web-hosted rulesets +- Node.js built-in `fetch` (Node 20+) — HTTP requests for remote ruleset fetching; no additional HTTP client library required +- Node.js built-in `fs/promises` — reading and writing `.api-grade/config.json` workspace and global config files + +**Storage**: Primarily stateless per-request. US5 introduces two config file locations: `.api-grade/config.json` in the workspace root (workspace-level default ruleset), and `~/.api-grade/config.json` (global default ruleset). Session-level default is held in memory on the `McpServer` instance. Auth credentials (GitHub PAT, Entra ID tokens) are stored separately from ruleset paths per FR-021. **Testing**: Vitest + `@vitest/coverage-v8` (consistent with existing packages) @@ -48,11 +53,26 @@ Deliver a new npm package (`@dawmatt/api-grade-mcp`) that exposes api-grade capa | V. Cross-Platform & Zero-Cost Prerequisites | ✅ Pass | MCP protocol is free; `@modelcontextprotocol/sdk` is MIT-licensed; local stdio transport requires no network | | VI. Educational Excellence | ✅ Pass | FR-010 requires complete tool descriptions so AI tools understand *why* findings matter; SC-006 requires self-describing tool definitions | | CI/CD Integration | ✅ Pass | New package added to existing CI quality gate; coverage threshold applied consistently | -| YAGNI | ✅ Pass | No remote URL spec fetching (stretch goal per spec Assumptions); no SSE transport; no resource/prompt MCP surfaces — only the four required tools | +| YAGNI | ✅ Pass | No remote URL spec fetching (stretch goal per spec Assumptions); no SSE transport; no resource/prompt MCP surfaces — six tools total (four grading + two configuration); auth limited to GitHub PAT and Entra ID only (other SSO schemes out of scope per spec Assumptions) | | AI Integration Requirements | ✅ Pass | FR-014 requires explicit verification in Claude Code, GitHub Copilot (VS Code), and Copilot Studio; all three are in-scope targets | | Development Workflow | ✅ Pass | Feature branch + PR; new package integrated into quality gate | -**Post-Phase-1 re-check**: Confirm tool contracts align with `GradeResult` and `Diagnostic` types from `api-grade-core` without requiring changes to the core package. +**Post-Phase-1 re-check** (completed 2026-06-19): + +| Principle | Status | Notes | +|-----------|--------|-------| +| I. Multi-Format API Support | ✅ Pass | US5 adds no format-specific logic; `resolveRuleset` is format-agnostic | +| II. Core-First Architecture | ✅ Pass | Auth and config modules are MCP-layer concerns; `api-grade-core` unchanged | +| III. Spectral-Ruleset Based Grading | ✅ Pass | Configured default rulesets are passed to `GradeEngine` as `rulesetPath`; no new grading logic introduced | +| IV. Test-Driven Quality | ✅ Pass | T030–T042 include unit tests for config/resolve modules and integration tests for all new tools and auth failure paths before implementation | +| V. Cross-Platform & Zero-Cost Prerequisites | ✅ Pass | `@azure/msal-node` is MIT-licensed and free; native `fetch` (Node 20+) requires no paid dependency; config files use `os.homedir()` for cross-platform paths | +| VI. Educational Excellence | ✅ Pass | Auth failure recovery messages explain the failure reason and guide the user; tool descriptions updated to reflect configuration capability | +| CI/CD Integration | ✅ Pass | No changes to CI/CD-oriented CLI behaviour | +| YAGNI | ✅ Pass | Auth limited to GitHub PAT and Entra ID (other SSO schemes out of scope per spec); no remote URL spec fetching; no SSE transport; no additional MCP surfaces | +| AI Integration Requirements | ✅ Pass | `configure-ruleset` and `get-ruleset-config` are fully self-describing; all six tools discoverable without additional documentation | +| Development Workflow | ✅ Pass | All tasks follow the existing phase/branch/PR pattern; T039 (cross-cutting grading tool update) is the highest-risk task and is explicitly flagged in tasks.md notes | + +Tool contracts confirmed to align with `GradeResult` and `Diagnostic` types from `api-grade-core` without requiring changes to the core package. `RulesetConfig`, `AuthConfig`, `SessionState`, `RulesetResolution`, and `AuthFailureRecoveryResponse` are all MCP-layer types defined in `packages/api-grade-mcp/src/`. ## Project Structure @@ -63,10 +83,24 @@ specs/007-ai-support/ ├── plan.md # This file ├── research.md # Phase 0 decisions ├── data-model.md # Entity definitions and type mappings -├── quickstart.md # MCP server setup and AI tool configuration +├── quickstart.md # Design-phase reference (superseded by docs/mcp/quick-start.md for users) ├── contracts/ -│ └── mcp-tools.md # All four MCP tool definitions (schemas + examples) +│ └── mcp-tools.md # All six MCP tool definitions (schemas + examples) └── tasks.md # Generated by /speckit-tasks + +README.md # UPDATE: add MCP Server to Components section and Documentation section +CONTRIBUTING.md # UPDATE: update project structure table to current monorepo layout; add api-grade-mcp to packages; update scripts table + +docs/ +├── index.md # UPDATE: add MCP Server rows (overview + configuration + troubleshooting + quick-start) +├── getting-started.md # UPDATE: extend MCP section to mention configuration capability +├── package/ +│ ├── README.md # UPDATE: add @dawmatt/api-grade-mcp to monorepo packages table +│ └── api-grade-mcp.md # UPDATE: add configure-ruleset + get-ruleset-config tools; add configuration overview; link to docs/mcp/ +└── mcp/ # NEW directory — user-facing MCP documentation (FR-025) + ├── quick-start.md # NEW: polished install + host config guide for all 3 required environments + ├── configuration.md # NEW: ruleset configuration reference (3 scopes, config files, GitHub PAT, Entra ID, env vars) + └── troubleshooting.md # NEW: auth failure recovery, recovery options walkthrough, token expiry, common setup issues ``` ### Source Code (additions this feature) @@ -80,23 +114,35 @@ packages/api-grade-mcp/ │ │ ├── grade.ts # grade-api tool │ │ ├── grade-detailed.ts # grade-api-detailed tool │ │ ├── assert-grade.ts # assert-api-grade tool -│ │ └── non-breaking.ts # get-non-breaking-violations tool +│ │ ├── non-breaking.ts # get-non-breaking-violations tool +│ │ ├── configure-ruleset.ts # configure-ruleset tool (US5) +│ │ └── get-ruleset-config.ts # get-ruleset-config tool (US5) +│ ├── config/ +│ │ ├── ruleset-config.ts # Load/save RulesetConfig at session/workspace/global scope (US5) +│ │ └── resolve-ruleset.ts # Precedence chain resolution: per-request → session → workspace → global → built-in (US5) +│ ├── auth/ +│ │ ├── github.ts # GitHub Enterprise PAT auth (fetch with Authorization header) (US5) +│ │ └── entra.ts # Microsoft Entra ID device-code flow via @azure/msal-node (US5) │ └── utils/ │ ├── classify.ts # Non-breaking violation classifier │ └── errors.ts # Structured MCP error response helpers ├── tests/ │ ├── unit/ -│ │ └── classify.test.ts # Classifier unit tests +│ │ ├── classify.test.ts # Classifier unit tests +│ │ ├── ruleset-config.test.ts # Config load/save tests (US5) +│ │ └── resolve-ruleset.test.ts # Precedence chain tests (US5) │ └── integration/ │ ├── grade.test.ts │ ├── grade-detailed.test.ts │ ├── assert-grade.test.ts -│ └── non-breaking.test.ts +│ ├── non-breaking.test.ts +│ ├── configure-ruleset.test.ts # configure-ruleset tool tests (US5) +│ └── get-ruleset-config.test.ts # get-ruleset-config tool tests (US5) ├── package.json # @dawmatt/api-grade-mcp; bin: api-grade-mcp └── tsconfig.json ``` -**Structure Decision**: New package follows the existing monorepo pattern at `packages/api-grade-mcp`. Each of the four MCP tools is isolated in its own file. The non-breaking classifier lives in `utils/classify.ts` — the only net-new business logic (all grading logic stays in `api-grade-core`). Server instantiation is extracted to `server.ts` so integration tests can construct the server without starting stdio transport. +**Structure Decision**: New package follows the existing monorepo pattern at `packages/api-grade-mcp`. Each MCP tool is isolated in its own file. US5 adds two new top-level directories: `config/` for ruleset configuration management and `auth/` for enterprise authentication. The `config/resolve-ruleset.ts` module is the single point where the precedence chain (FR-017) is implemented, ensuring all tools share the same resolution logic. Auth modules are kept separate from config to allow `config/` to be tested without auth dependencies. ## Quality Gate Requirement (Constitution Constraint — Automatically Enforced) diff --git a/specs/007-ai-support/quickstart.md b/specs/007-ai-support/quickstart.md index 680ab00..914667d 100644 --- a/specs/007-ai-support/quickstart.md +++ b/specs/007-ai-support/quickstart.md @@ -144,7 +144,7 @@ Follow Windsurf's MCP configuration guide and add the same `api-grade` server en ## Available Tools -Once configured, the AI tool has access to four api-grade capabilities: +Once configured, the AI tool has access to six api-grade capabilities: | Tool | What it does | |---|---| @@ -152,6 +152,8 @@ Once configured, the AI tool has access to four api-grade capabilities: | `grade-api-detailed` | Full grade with all violations and recommendations | | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | | `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | +| `configure-ruleset` | Set the default Spectral ruleset at session, workspace, or global scope | +| `get-ruleset-config` | Show the active ruleset configuration at all scopes | --- @@ -189,10 +191,75 @@ without altering the API's interface contract (paths, methods, parameters, schem ## Using a Custom Ruleset -All four tools accept an optional `rulesetPath` parameter. Ask your AI tool: +All grading tools accept an optional `rulesetPath` parameter for a one-off custom ruleset: > Grade `/workspace/my-api/openapi.yaml` using the ruleset at `/workspace/rulesets/company-standards.yaml` +To avoid supplying the path on every request, configure a default ruleset instead (see below). + +--- + +## Configuring a Default Ruleset + +Use `configure-ruleset` to set a default so you never have to supply `rulesetPath` explicitly. + +### Session default (current session only) + +> Set the default ruleset for this session to `/workspace/rulesets/company-standards.yaml` + +The AI calls `configure-ruleset` with `scope: "session"`. All subsequent grading requests use this ruleset automatically until the MCP server restarts. + +### Workspace default (persisted to this project) + +> Set the workspace default ruleset to `https://github.example.com/org/standards/raw/main/ruleset.yaml` + +The AI calls `configure-ruleset` with `scope: "workspace"`. The setting is saved to `.api-grade/config.json` in the project root and survives MCP server restarts. Commit this file to share the standard with your team. + +### Global default (all projects) + +> Set my global default ruleset to `/Users/jane/rulesets/personal-standards.yaml` + +The AI calls `configure-ruleset` with `scope: "global"`. The setting is saved to `~/.api-grade/config.json` and applies to all projects unless overridden by a workspace or session default. + +### Checking the active configuration + +> Show me the current ruleset configuration + +The AI calls `get-ruleset-config` and returns which ruleset is active at every scope and which one is currently in effect. + +### Precedence order + +Per-request `rulesetPath` → session default → workspace default → global default → built-in + +--- + +## Configuring Authentication for Secured Rulesets + +### GitHub Enterprise (PAT) + +Set the `GITHUB_TOKEN` environment variable before starting the AI tool, or ask the AI to configure it for the session: + +> Set the workspace default ruleset to `https://github.example.com/org/standards/raw/main/ruleset.yaml` with GitHub PAT authentication + +The AI calls `configure-ruleset` with `auth: { type: "github-pat" }`. At runtime the server reads the token from the `GITHUB_TOKEN` environment variable. + +### Microsoft Entra ID (SharePoint / enterprise sites) + +> Set the workspace default ruleset to `https://mycompany.sharepoint.com/sites/api-standards/ruleset.yaml` with Entra ID authentication, tenant ID `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` and client ID `yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy` + +The AI calls `configure-ruleset` with `auth: { type: "entra-id", tenantId: "...", clientId: "..." }`. On the next grading request the server will initiate the device-code flow and return a code for you to enter at `https://microsoft.com/devicelogin`. Once authenticated, the token is cached to `~/.api-grade/entra-token-cache.json` and reused on subsequent requests. + +### When authentication fails + +If the configured default ruleset cannot be fetched (network unavailable, token expired, VPN disconnected), the grading tool returns four recovery options: + +1. **Retry** — attempt the fetch again (use when you've just reconnected to the network/VPN) +2. **Use built-in default for this request** — grade using the built-in ruleset once +3. **Use built-in default for this session** — skip the configured default for all remaining requests this session +4. **Cancel** — cancel the grading request + +Tell the AI which option to use and it will re-invoke the grading tool with your choice. + --- ## Verifying the Setup @@ -203,7 +270,7 @@ To verify the server starts correctly, run: echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | npx @dawmatt/api-grade-mcp ``` -You should see a JSON response listing all four tools. +You should see a JSON response listing all six tools. --- @@ -219,3 +286,10 @@ You should see a JSON response listing all four tools. **Large spec warning** - Specifications over 500KB trigger a warning; grading still proceeds but detailed results may be truncated. Consider splitting large specs before grading. + +**`RULESET_AUTH_FAILED` on every grading request** +- The configured default ruleset is unreachable. Use `get-ruleset-config` to see what's configured, then either fix the auth (check `GITHUB_TOKEN` env var, reconnect to VPN) or clear the default with `configure-ruleset scope: session rulesetPath: null`. + +**Entra ID device-code flow not completing** +- The code expires after a short window (typically 15 minutes). If you miss the window, retry the grading request — the server will initiate a new device-code flow. +- Ensure `tenantId` and `clientId` are correct in the workspace or global config. diff --git a/specs/007-ai-support/research.md b/specs/007-ai-support/research.md index 9a10cb3..b38e0b0 100644 --- a/specs/007-ai-support/research.md +++ b/specs/007-ai-support/research.md @@ -200,6 +200,174 @@ The `expectedImprovement` is derived from the rule message and the rule's known --- +## US5: GitHub Enterprise PAT Authentication (FR-018) + +### Decision: Native `fetch` with `Authorization: Bearer` header; token from env var or session config + +**Rationale**: Node 20+ includes `fetch` natively, so no additional HTTP client is needed. GitHub Enterprise raw file URLs use standard Bearer token auth. Token precedence: `GITHUB_TOKEN` environment variable → `auth.githubToken` supplied transiently on `configure-ruleset scope: session`. The token is never persisted to workspace or global config files (FR-021), so the workspace config stores only `auth.type: "github-pat"` as a hint. + +**Implementation pattern**: +```typescript +async function fetchWithGithubPat(url: string, token: string, timeoutMs: number): Promise { + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), timeoutMs); + try { + const res = await fetch(url, { + headers: { Authorization: `Bearer ${token}` }, + signal: controller.signal, + }); + if (res.status === 401 || res.status === 403) throw new RulesetAuthError('auth-failed', url); + if (!res.ok) throw new RulesetAuthError('network-unreachable', url); + return res.text(); + } catch (e) { + if (e instanceof DOMException && e.name === 'AbortError') + throw new RulesetAuthError('network-unreachable', url); + throw e; + } finally { + clearTimeout(id); + } +} +``` + +**Alternatives considered**: `node-fetch` — rejected; native `fetch` is available on Node 20+ and adding a dependency for something already in the runtime is unnecessary. + +--- + +## US5: Microsoft Entra ID Device-Code Flow (FR-019) + +### Decision: `@azure/msal-node` `PublicClientApplication` with disk-persisted token cache + +**Rationale**: MSAL Node is the official Microsoft authentication library. Device-code flow is the correct OAuth 2.0 flow for server processes that cannot open a browser. The flow returns a `userCode` and `verificationUri` that the AI surfaces to the user, who completes sign-in in a browser. Subsequent requests use the cached refresh token without re-prompting. + +**Token cache persistence**: MSAL's `cachePlugin` interface (`beforeCacheAccess` / `afterCacheAccess` callbacks) is used to read/write `~/.api-grade/entra-token-cache.json`. `afterCacheAccess` only writes when `cacheContext.cacheHasChanged` is true to avoid unnecessary I/O. + +**Implementation pattern**: +```typescript +import { PublicClientApplication } from '@azure/msal-node'; + +const diskCachePlugin = { + async beforeCacheAccess(ctx) { + const data = await fs.readFile(ENTRA_CACHE_PATH, 'utf-8').catch(() => ''); + ctx.tokenCache.deserialize(data); + }, + async afterCacheAccess(ctx) { + if (ctx.cacheHasChanged) { + await fs.mkdir(path.dirname(ENTRA_CACHE_PATH), { recursive: true }); + await fs.writeFile(ENTRA_CACHE_PATH, ctx.tokenCache.serialize()); + } + }, +}; + +const pca = new PublicClientApplication({ + auth: { clientId, authority: `https://login.microsoftonline.com/${tenantId}` }, + cache: { cachePlugin: diskCachePlugin }, +}); + +// Try silent acquisition first (uses cached refresh token) +const accounts = await pca.getTokenCache().getAllAccounts(); +if (accounts.length > 0) { + try { + const result = await pca.acquireTokenSilent({ scopes, account: accounts[0] }); + return result.accessToken; + } catch { /* fall through to device code */ } +} + +// Device-code flow — surfaces code to user via AI +const result = await pca.acquireTokenByDeviceCode({ + scopes, + deviceCodeCallback: (response) => { + throw new EntraAuthRequired(response.userCode, response.verificationUri, response.expiresIn); + }, +}); +return result.accessToken; +``` + +**Scopes**: For SharePoint resources the scope is `https://.sharepoint.com/.default`. For generic enterprise web resources protected with Entra ID it is `api:///.default`. The MCP server does not infer scopes; they are derived from the resource URL at runtime using the standard convention. + +**Alternatives considered**: `@azure/identity` `DeviceCodeCredential` — provides a higher-level abstraction but does not expose the raw `userCode`/`verificationUri` needed to surface them to the AI via the `ENTRA_AUTH_REQUIRED` error shape. MSAL Node gives direct access to the device-code response. + +--- + +## US5: Fetch Timeout (FR-024) + +### Decision: `AbortController` + `setTimeout`; 5 seconds initial, 30 seconds retry + +**Rationale**: `AbortController` is the standard Node 20+ mechanism for aborting a `fetch`. The abort causes the fetch to throw a `DOMException` with `name === 'AbortError'`, which maps cleanly to `failureReason: 'network-unreachable'`. Two timeout values are used: 5s on the initial attempt (guarantees the auth-failure recovery response arrives well within SC-001's 10-second budget) and 30s on explicit retry (user has acknowledged willingness to wait). + +```typescript +export const INITIAL_FETCH_TIMEOUT_MS = 5_000; +export const RETRY_FETCH_TIMEOUT_MS = 30_000; + +export function fetchWithTimeout(url: string, timeoutMs: number, headers?: HeadersInit) { + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), timeoutMs); + return fetch(url, { signal: controller.signal, headers }).finally(() => clearTimeout(id)); +} +``` + +The `recoveryOption` parameter on grading tools determines which constant is passed: `"retry"` → `RETRY_FETCH_TIMEOUT_MS`; all other calls → `INITIAL_FETCH_TIMEOUT_MS`. + +--- + +## US5: Config File Storage (FR-015, FR-017, FR-018) + +### Decision: `.api-grade/config.json` relative to CWD; `~/.api-grade/config.json` via `os.homedir()` + +**Rationale**: `.api-grade/` follows the convention of tool-specific config directories (`.github/`, `.vscode/`). Using a dedicated directory rather than a root-level dotfile (e.g. `.apigraderc`) allows future keys without polluting the workspace root. `os.homedir()` is the correct cross-platform equivalent of `~` on macOS, Linux, and Windows. + +**Workspace root = CWD** (clarified 2026-06-19): All three MCP hosts (Claude Code, VS Code Copilot, Copilot Studio) start the server process with the workspace root as CWD. `process.cwd()` is therefore the workspace root — no `--workspace-root` flag or per-call parameter is needed. + +**Config file schema** (both workspace and global share the same shape): +```json +{ + "ruleset": { + "path": "https://github.example.com/org/standards/raw/main/ruleset.yaml" + }, + "auth": { + "type": "github-pat" + } +} +``` + +`auth.githubToken` is intentionally absent from the persisted schema — the token comes from `GITHUB_TOKEN` env var at runtime. Entra ID tokens are persisted separately via the MSAL cache at `~/.api-grade/entra-token-cache.json`. + +**gitignore guidance**: `.api-grade/config.json` is safe to commit (no credentials). `~/.api-grade/` is outside the repo. `~/.api-grade/entra-token-cache.json` contains tokens and should not be committed, but as a global home-directory file it is already not in any repo. + +**Alternatives considered**: XDG Base Directory (`~/.config/api-grade/`) — more correct on Linux but less obvious on macOS/Windows. Keeping `~/.api-grade/` mirrors the pattern used by tools familiar to JavaScript developers (`.npmrc`, `.yarnrc`). + +--- + +## US5: Session State Management + +### Decision: Mutable `SessionState` object created in `createServer()`, passed by reference to all tools + +**Rationale**: `McpServer` does not provide a built-in per-server state mechanism. A plain mutable object passed by reference to each `registerXxxTool()` function is the simplest correct pattern. Node.js's single-threaded event loop means synchronous state mutations (`sessionState.defaultRuleset = ...`) are safe without locks — an incoming tool call cannot interleave with a running handler's synchronous code. + +```typescript +interface SessionState { + defaultRuleset: RulesetConfig | null; + sessionRulesetOverride: 'builtin' | null; // set by use-builtin-session recovery +} + +export function createServer(): McpServer { + const server = new McpServer({ name: 'api-grade', version: pkg.version }); + const sessionState: SessionState = { defaultRuleset: null, sessionRulesetOverride: null }; + registerGradeTool(server, sessionState); + registerGradeDetailedTool(server, sessionState); + registerAssertGradeTool(server, sessionState); + registerNonBreakingTool(server, sessionState); + registerConfigureRulesetTool(server, sessionState); + registerGetRulesetConfigTool(server, sessionState); + return server; +} +``` + +**`sessionRulesetOverride` clearing rule** (clarified 2026-06-19): A `configure-ruleset scope: session` call with a non-null `rulesetPath` MUST set `sessionRulesetOverride` to `null` — the user is explicitly configuring a default, which supersedes the "use built-in" session override. Calling `configure-ruleset` with `rulesetPath: null` does NOT clear the override (it only clears `defaultRuleset`). + +**Alternatives considered**: Class-based server with state as instance fields — heavier abstraction with no benefit at this scale; rejected per YAGNI. + +--- + ## MCP Host Configuration Pattern AI tools (Claude Desktop, Cursor, etc.) require a config entry to register the MCP server. The standard config format: diff --git a/specs/007-ai-support/spec.md b/specs/007-ai-support/spec.md index 902e19f..5760e75 100644 --- a/specs/007-ai-support/spec.md +++ b/specs/007-ai-support/spec.md @@ -18,6 +18,14 @@ - Q: How should the MCP server handle very large API specifications? → A: Best-effort — grade and return results, but include a warning in the response when the spec exceeds a defined size threshold - Q: Should the MCP server support concurrent grading requests? → A: Yes — multiple simultaneous requests are supported, bounded only by available system resources +### Session 2026-06-19 + +- Q: How does the MCP server determine the workspace root when loading/saving `.api-grade/config.json`? → A: Use the server process's working directory (CWD) — MCP hosts (Claude Code, VS Code Copilot, Copilot Studio) start servers with the workspace root as CWD; no additional configuration required. +- Q: Should Entra ID tokens be persisted across MCP server restarts? → A: Yes — cache to disk at `~/.api-grade/entra-token-cache.json` using MSAL Node's `TokenCacheContext` API. Persisted to the user home directory only (never the workspace), consistent with Azure CLI behaviour. +- Q: What does a grading tool return when the user selects the `cancel` recovery option? → A: A structured error response with code `REQUEST_CANCELLED` and a human-readable message — consistent with all other terminal error shapes. +- Q: What timeout applies when fetching a remote ruleset? → A: 5 seconds on the initial attempt (ensuring the auth-failure recovery response arrives well within SC-001's 10-second budget); 30 seconds when the user explicitly selects the `retry` recovery option (acknowledging they are willing to wait). +- Q: How is the `use-builtin-session` recovery choice represented in session state without conflating it with "no default configured"? → A: A separate `sessionRulesetOverride: "builtin" | null` field on `SessionState`. When set to `"builtin"`, all grading tools bypass configured defaults for the remainder of the session. A subsequent `configure-ruleset scope: session` call with a non-null `rulesetPath` clears the override implicitly; `configure-ruleset` with `rulesetPath: null` does not clear the override. + --- ## User Scenarios & Testing *(mandatory)* @@ -70,6 +78,27 @@ A developer working with an AI assistant wants detailed diagnostic information a --- +### User Story 5 - Configure Default Ruleset (Priority: P2) + +A developer using the api-grade MCP server wants to set a default ruleset that applies automatically to every grading request — without having to supply a `rulesetPath` on each call. They may want the default to apply just for this session, or to persist it for their workspace or globally across all workspaces. Rulesets may be stored in secured locations (private GitHub Enterprise repos, SharePoint, enterprise internal sites) and require authentication to access. + +**Why this priority**: Custom rulesets represent the primary way organisations apply their own API standards. Without a configurable default, every AI tool invocation must explicitly supply a `rulesetPath`, making the MCP server friction-heavy in enterprise environments. Persistent default configuration transforms it from a one-off tool into an always-on quality gate aligned to team standards. Coupled with authentication support for enterprise rulesets, this story unlocks adoption in organisations with private API governance rules. + +**Independent Test**: Can be fully tested by configuring a default ruleset at each scope (session, workspace, global) — including one from a secured GitHub Enterprise URL — confirming that subsequent grading requests use the configured ruleset without an explicit `rulesetPath`, verifying precedence order, and confirming that an auth failure returns the four recovery options. + +**Acceptance Scenarios**: + +1. **Given** an AI tool calls `configure-ruleset` with `scope: "session"` and a ruleset path, **When** a subsequent `grade-api` call is made without a `rulesetPath`, **Then** grading uses the session-configured ruleset and `rulesetSource` in the response reflects it. +2. **Given** an AI tool calls `configure-ruleset` with `scope: "workspace"`, **When** the MCP server is restarted in the same workspace, **Then** the workspace-level default is still active and applied to grading requests. +3. **Given** an AI tool calls `configure-ruleset` with `scope: "global"`, **When** grading is requested from a different workspace with no workspace-level config, **Then** the global default ruleset is applied. +4. **Given** session, workspace, and global defaults are all configured, **When** a `grade-api` call is made without an explicit `rulesetPath`, **Then** the session-level default takes precedence over workspace and global defaults. +5. **Given** a per-request `rulesetPath` is supplied, **When** the `grade-api` tool is invoked, **Then** the per-request path takes precedence over all configured defaults. +6. **Given** a default ruleset is configured with a GitHub Enterprise URL and a valid PAT, **When** a grading request is made, **Then** the ruleset is fetched successfully using the token and grading proceeds. +7. **Given** a default ruleset URL requires Entra ID authentication, **When** the MCP server cannot authenticate (no stored token, no env vars), **Then** it returns a structured response offering the user: retry, use the built-in default for this request, use the built-in default for the remainder of the session, or cancel the request. +8. **Given** the ruleset URL is accessible only on the corporate network and the user is disconnected, **When** a grading request is made with the configured default, **Then** the auth/network failure is caught and the four recovery options are presented rather than an unhandled error. + +--- + ### User Story 4 - AI-Assisted Resolution of Non-Breaking Issues (Priority: P3) A developer using an AI assistant not only wants to know which issues are affecting their API grade, but wants the AI to automatically resolve the non-breaking, fixable issues identified by the grading — improving the API specification without introducing breaking changes. The MCP server provides the classified list of fixable violations; the AI model generates the actual corrections. @@ -93,6 +122,9 @@ A developer using an AI assistant not only wants to know which issues are affect - When an API specification exceeds a defined size threshold, the system returns a best-effort result (grading proceeds) with a warning field in the response indicating the spec is large and results may be truncated. - What happens when the AI tool requests a grade using a custom ruleset path that does not exist or is inaccessible? - How does the system behave when the AI environment has no network access and the default ruleset requires a remote fetch? +- What happens when a default ruleset is configured at multiple levels (session + workspace + global) simultaneously? → The most specific scope wins: session overrides workspace, workspace overrides global. +- What happens when the user is on their corporate network initially, sets a workspace default pointing to an enterprise SharePoint ruleset, then disconnects from the VPN mid-session? → The next grading request that tries to use the configured default will fail to fetch the ruleset; the structured recovery options are returned so the user can choose how to proceed. +- What happens when a GitHub Enterprise PAT stored in a workspace config file has expired or been revoked? → Authentication fails; structured recovery options are returned with guidance to check the token. ## Requirements *(mandatory)* @@ -108,6 +140,15 @@ A developer using an AI assistant not only wants to know which issues are affect - **FR-012**: For each non-breaking violation returned, the system MUST include sufficient context (violation rule, affected location, current value if present, expected improvement) for the AI to generate a correct fix without needing to re-parse the specification. - **FR-008**: The system MUST return structured error responses (not unhandled exceptions) when invoked with invalid inputs such as missing files, invalid grade values, or inaccessible rulesets. - **FR-013**: When an API specification exceeds a defined size threshold, the system MUST still attempt grading and return a best-effort result with a warning field indicating the specification is large and that results may be incomplete. +- **FR-015**: The system MUST provide a `configure-ruleset` MCP tool that sets a default ruleset at a specified scope (`session`, `workspace`, or `global`). Session-level configuration is held in memory and resets when the MCP server process restarts. Workspace-level configuration is persisted to `.api-grade/config.json` relative to the MCP server's working directory (CWD), which MCP hosts set to the workspace root. Global configuration is persisted to `~/.api-grade/config.json`. +- **FR-016**: The system MUST provide a `get-ruleset-config` MCP tool that returns the currently active ruleset configuration at every scope (session, workspace, global) and indicates which scope is currently in effect (the effective ruleset). +- **FR-017**: Ruleset resolution MUST follow this strict precedence order, from most to least specific: (1) per-request `rulesetPath` parameter → (2) session-level default → (3) workspace-level default → (4) global default → (5) built-in default. The first configured source in this order is used. +- **FR-018**: The system MUST support GitHub Enterprise token-based authentication (PAT) when fetching rulesets from GitHub Enterprise URLs. The token MUST be sourced from the `GITHUB_TOKEN` environment variable if present, or from an `auth.githubToken` field in the workspace or global config file. Bearer token authentication uses an `Authorization: Bearer ` HTTP header. +- **FR-019**: The system MUST support Microsoft Entra ID (OAuth 2.0 device-code flow) authentication for rulesets hosted on SharePoint or enterprise internal websites requiring Entra ID login. When a cached token is unavailable, the MCP server initiates the device-code flow and returns the device code URL and user code so the AI can present them to the user. Access and refresh tokens obtained via the device-code flow MUST be persisted to `~/.api-grade/entra-token-cache.json` using MSAL Node's `TokenCacheContext` API so that authentication survives MCP server restarts. The cache file is written to the user home directory only and is never written to the workspace. +- **FR-020**: When a configured default ruleset is inaccessible due to an authentication or authorisation failure (including network unavailability that prevents reaching an authentication endpoint), the system MUST return a structured response that presents the user with four recovery options: (1) retry the fetch, (2) use the built-in default ruleset for this request only, (3) use the built-in default ruleset for the remainder of this session, (4) cancel the current request. The response MUST identify the failure reason (auth failed, network unreachable, token expired) to help the user choose appropriately. When the user selects `cancel`, the tool MUST return a structured error response with code `REQUEST_CANCELLED` and a human-readable message; it MUST NOT return a null result or an empty success envelope. +- **FR-024**: Remote ruleset fetches MUST apply a **5-second timeout** on the initial attempt so that network failures surface a recovery response within SC-001's 10-second budget. When the user selects the `retry` recovery option, the retry attempt MUST use a **30-second timeout**, acknowledging the user's explicit willingness to wait. All other recovery options (`use-builtin-once`, `use-builtin-session`, `cancel`) bypass the fetch entirely. +- **FR-021**: Auth credentials (GitHub PAT, Entra ID client/tenant IDs) stored in config files MUST be stored separately from ruleset paths so that a config file can be safely committed to source control with auth fields omitted or redacted. +- **FR-025**: The MCP server MUST be accompanied by user-facing documentation consistent in scope and depth with the CLI and Backstage integrations in this repository. Required documentation artefacts are: (a) a quick-start guide covering installation and host configuration for all three required target environments; (b) a configuration reference covering all three default ruleset scopes, the config file format, GitHub Enterprise PAT authentication, and Microsoft Entra ID device-code flow authentication; (c) a troubleshooting guide covering auth failure recovery, the four recovery options, token expiry, network failures, and common setup issues. All three artefacts MUST reside under `docs/mcp/` in the repository. The root `README.md` Components and Documentation sections MUST include the MCP server alongside the CLI, Core Package, and Backstage integrations. `CONTRIBUTING.md` MUST reflect the current monorepo package structure including `packages/api-grade-mcp`. - **FR-009**: The AI integration MUST leverage the shared core grading package (api-grade-core) and MUST NOT duplicate core grading logic. - **FR-010**: All MCP tool definitions MUST include complete descriptions, parameter documentation, and example invocations so that AI tools can discover and correctly invoke them without additional configuration. - **FR-011**: The MCP server MUST operate entirely locally (no outbound network calls required for the MCP protocol layer itself) to satisfy the zero-cost prerequisite constraint. @@ -121,18 +162,24 @@ A developer using an AI assistant not only wants to know which issues are affect - **Assertion Result**: A structured pass/fail outcome indicating whether an API meets a specified minimum grade, including the actual grade achieved. - **Non-Breaking Issue List**: The structured output of the resolve-assist capability — a classified, located list of non-breaking violations with sufficient context (rule, location, current value, expected improvement) for an AI model to generate corrections. - **Resolved Specification**: The corrected API specification produced by an AI model after it processes the Non-Breaking Issue List and applies fixes. Non-breaking fixes include improvements to descriptions, summaries, tags, info blocks, optional fields, examples, and extensions — any change that leaves the API's interface contract (paths, methods, required parameters, schema types, response structures) unaltered. -- **Custom Ruleset**: An optional spectral-compatible ruleset file path provided by the AI tool to customise grading behaviour. +- **Custom Ruleset**: An optional spectral-compatible ruleset file path or URL provided by the AI tool to customise grading behaviour on a per-request basis. +- **Default Ruleset Configuration**: A persisted or in-memory setting that designates the ruleset to use when no per-request `rulesetPath` is supplied. Exists at three scopes — session (in-memory), workspace (`.api-grade/config.json`), and global (`~/.api-grade/config.json`) — with session taking precedence over workspace, and workspace over global. +- **Auth Configuration**: Optional credentials (GitHub PAT, Entra ID tenant/client IDs) associated with a Default Ruleset Configuration that allow the MCP server to fetch rulesets from secured locations. Stored separately from ruleset paths to support safe source-control practices. +- **Auth Failure Recovery**: The structured response returned when a configured default ruleset cannot be fetched due to an authentication, authorisation, or network failure. Contains the failure reason and four recovery options: retry, use built-in default for this request, use built-in default for this session, or cancel. ## Success Criteria *(mandatory)* ### Measurable Outcomes -- **SC-001**: An AI tool can complete an end-to-end API grading request (from invocation to structured result) in under 10 seconds for a typical API specification. +- **SC-001**: An AI tool can complete an end-to-end API grading request (from invocation to structured result) in under 10 seconds for a typical API specification. When a remote ruleset fetch fails, the auth-failure recovery response (not a grade result) MUST also arrive within 10 seconds; the 5-second fetch timeout ensures this. Retry attempts (user-initiated, 30-second timeout) are exempt from this bound. - **SC-002**: All three grading functions (overall grade, detailed diagnostics, grade assertion) are accessible from Claude Code, GitHub Copilot (VS Code), and GitHub Copilot Studio without any additional configuration beyond supplying the API specification path. - **SC-003**: 100% of supported API specification formats (OpenAPI and AsyncAPI) can be graded successfully when invoked from an AI context. - **SC-004**: Grade assertion correctly identifies pass/fail for all valid grade levels (A through F) with 100% accuracy. - **SC-005**: An AI tool applying non-breaking fixes produces a corrected specification where all targeted violations are resolved and no breaking changes are introduced, as verified by re-grading. - **SC-006**: All MCP tool definitions are self-describing — a capable AI tool can discover and invoke all grading capabilities correctly using only the tool definitions, with no additional documentation required. +- **SC-007**: A developer can configure a workspace-level default ruleset once via `configure-ruleset`, restart the MCP server, and confirm that all subsequent grading requests in that workspace use the configured ruleset without re-supplying the path. +- **SC-008**: When a configured default ruleset requires authentication and credentials are unavailable or invalid, 100% of grading requests return the four structured recovery options rather than an unhandled error or silent fallback to the built-in default. +- **SC-009**: A developer unfamiliar with the MCP server can configure a workspace-level default ruleset with Entra ID authentication using only the published documentation under `docs/mcp/`, without consulting source code or design artefacts in `specs/`. ## Assumptions @@ -140,7 +187,10 @@ A developer using an AI assistant not only wants to know which issues are affect - Remote URL-based API specification fetching is treated as a stretch goal; the primary supported input is a local file path. - The AI tool is responsible for presenting the structured JSON output to its end user in a human-readable form; api-grade provides the data, not the final presentation. - The "resolve non-breaking issues" capability is a two-step workflow: the MCP server identifies, classifies, and returns non-breaking violations as a structured list; the calling AI model uses that list to generate the corrected specification content. The MCP server does not generate specification content. -- Custom ruleset support mirrors the existing CLI capability; rulesets sourced from secured remote locations (as in the Backstage feature) are out of scope for this feature. +- Default ruleset configuration is specific to the MCP server; the CLI continues to accept `--ruleset` on each invocation without persistent configuration. Parity between CLI and MCP ruleset configuration is not a goal of this feature. +- The MCP server's working directory (CWD) is treated as the workspace root for resolving `.api-grade/config.json`. All three required MCP hosts (Claude Code, VS Code Copilot, Copilot Studio) start server processes with the workspace root as CWD; no `--workspace-root` argument or per-call parameter is needed. +- Supported authentication mechanisms for secured rulesets are GitHub Enterprise PAT (token-based) and Microsoft Entra ID (OAuth 2.0 device-code flow). Other SSO or authentication schemes (NTLM, Kerberos, custom OAuth providers) are out of scope. +- The device-code flow for Entra ID requires the user to complete authentication in a browser; the MCP server surfaces the device code URL and user code but does not open a browser directly. The AI mediates this interaction. - All prerequisites for AI integration (e.g., tool registration, model access) have zero monetary cost, consistent with the project's cross-platform zero-cost prerequisite principle. - The MCP server supports concurrent requests; multiple grading operations may run simultaneously, bounded only by available system resources. The core grading logic is stateless with respect to individual requests. - The feature builds on the existing api-grade-core package and does not require changes to the core grading algorithm. diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index 283b706..9f4c068 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -1,125 +1,176 @@ # Tasks: AI Support for LLMs and Agentic Tooling -**Input**: Design documents from `specs/007-ai-support/` +**Input**: Design documents from `/specs/007-ai-support/` -**Prerequisites**: plan.md ✅ spec.md ✅ research.md ✅ data-model.md ✅ contracts/mcp-tools.md ✅ quickstart.md ✅ +**Prerequisites**: plan.md ✅, spec.md ✅, research.md ✅, data-model.md ✅, contracts/mcp-tools.md ✅, quickstart.md ✅ + +**Tests**: Included per Constitution Principle IV (Test-Driven Quality) — tests are required for this feature. **Organization**: Tasks are grouped by user story to enable independent implementation and testing of each story. ## Format: `[ID] [P?] [Story] Description` -- **[P]**: Can run in parallel (different files, no dependencies on incomplete tasks in this phase) -- **[Story]**: Which user story this task belongs to (US1, US2, US3, US4) +- **[P]**: Can run in parallel (different files, no dependencies) +- **[Story]**: Which user story this task belongs to (US1–US5, mapped to spec.md) +- Exact file paths are included in each description --- ## Phase 1: Setup -**Purpose**: Scaffold the `@dawmatt/api-grade-mcp` package in the monorepo and wire it into the workspace build, lint, and test infrastructure. - -- [X] T001 Create `packages/api-grade-mcp/src/tools/`, `packages/api-grade-mcp/src/utils/`, and `packages/api-grade-mcp/tests/unit/` and `packages/api-grade-mcp/tests/integration/` directory structure per plan.md -- [X] T002 Create `packages/api-grade-mcp/package.json` with name `@dawmatt/api-grade-mcp`, `type: "module"`, `bin`, `exports`, `scripts` (build/test/test:coverage/lint/typecheck), and dependencies `@modelcontextprotocol/sdk`, `@dawmatt/api-grade-core: "*"`, `zod`; devDependencies `vitest`, `@vitest/coverage-v8`, `typescript` -- [X] T003 [P] Create `packages/api-grade-mcp/tsconfig.json` following the pattern from `packages/api-grade-core/tsconfig.json` (ESM, `NodeNext` module resolution, `outDir: dist`) -- [X] T004 [P] Create `packages/api-grade-mcp/vitest.config.ts` following the pattern from `packages/api-grade-core/vitest.config.ts` -- [X] T005 [P] Verify `packages/api-grade-mcp` is picked up by the root `workspaces: ["packages/*"]` declaration in root `package.json` and run `yarn install` to register the workspace +**Purpose**: Create the `packages/api-grade-mcp` package and wire it into the monorepo workspace. -**Checkpoint**: `yarn workspace api-grade-mcp run build` resolves (even with empty src) and `yarn workspaces info` lists `api-grade-mcp` +- [ ] T001 Create directory structure `packages/api-grade-mcp/src/tools/`, `src/config/`, `src/auth/`, `src/utils/`, `tests/unit/`, `tests/integration/` per plan.md Project Structure +- [ ] T002 Create `packages/api-grade-mcp/package.json` with name `@dawmatt/api-grade-mcp`, type `module`, bin `api-grade-mcp → ./dist/index.js`, exports pointing to `./dist/server.js`, dependencies: `@dawmatt/api-grade-core: "*"`, `@modelcontextprotocol/sdk: "^1.0.0"`, `zod: "^3.22.0"`, devDependencies: `@azure/msal-node`, `vitest`, `@vitest/coverage-v8`, scripts: `build`, `typecheck`, `lint`, `test`, `test:coverage` +- [ ] T003 [P] Create `packages/api-grade-mcp/tsconfig.json` following the pattern of existing packages (`packages/api-grade-core/tsconfig.json`), targeting ESM with `NodeNext` module resolution +- [ ] T004 Update root `package.json` workspaces array to include `packages/api-grade-mcp`; update CI quality gate script in `package.json` (or relevant CI config) to run `yarn workspace api-grade-mcp run test:coverage` --- ## Phase 2: Foundational (Blocking Prerequisites) -**Purpose**: Shared infrastructure that ALL tool implementations depend on. Must be complete before any user story phase begins. +**Purpose**: Core infrastructure shared by all tools — error utilities, classifier, server factory, and entry point. Must be complete before any user story implementation. **⚠️ CRITICAL**: No user story work can begin until this phase is complete. -- [X] T006 Implement `packages/api-grade-mcp/src/utils/errors.ts` — exports `mcpError(code, message, input)` returning the structured `{ error, message, input }` shape defined in data-model.md, and the `ERROR_CODES` const object (`SPEC_NOT_FOUND`, `SPEC_PARSE_ERROR`, `RULESET_NOT_FOUND`, `INVALID_GRADE`, `GRADE_ENGINE_ERROR`) -- [X] T007 [P] Implement stub `packages/api-grade-mcp/src/server.ts` — imports `McpServer` from `@modelcontextprotocol/sdk/server/mcp.js`, exports `createServer()` that constructs and returns a named `McpServer` instance (`name: "api-grade"`, version from package.json); no tools registered yet -- [X] T008 Implement `packages/api-grade-mcp/src/index.ts` — imports `createServer` from `./server.js`, imports `StdioServerTransport` from `@modelcontextprotocol/sdk/server/stdio.js`, calls `server.connect(transport)` and exports nothing (stdio entry point only) -- [X] T009 [P] Write a smoke test in `packages/api-grade-mcp/tests/unit/server.test.ts` that imports `createServer`, calls it, and asserts the returned object has a `connect` method — confirms the server factory is importable and the test runner works +- [ ] T005 Create `packages/api-grade-mcp/src/utils/errors.ts` exporting all error code constants (`SPEC_NOT_FOUND`, `SPEC_PARSE_ERROR`, `RULESET_NOT_FOUND`, `INVALID_GRADE`, `GRADE_ENGINE_ERROR`, `RULESET_AUTH_FAILED`, `ENTRA_AUTH_REQUIRED`, `INVALID_AUTH_CONFIG`, `CONFIG_WRITE_ERROR`, `REQUEST_CANCELLED`) and a `buildErrorResponse(code, message, input)` helper that returns `{ content: [{ type: "text", text: JSON.stringify(...) }], isError: true }` +- [ ] T006 [P] Create `packages/api-grade-mcp/src/utils/classify.ts` implementing the non-breaking violation classifier from research.md: rule ID override list checked first, then breaking path patterns, then non-breaking path patterns, returning `"breaking" | "nonBreaking" | "unknown"` per violation; export `LARGE_SPEC_THRESHOLD_BYTES = 500_000` +- [ ] T007 Create `packages/api-grade-mcp/src/server.ts` exporting `createServer(): McpServer` factory; define `SessionState` interface (`defaultRuleset: RulesetConfig | null`, `sessionRulesetOverride: "builtin" | null`); initialise `sessionState` and call each `registerXxxTool(server, sessionState)` stub (stubs initially no-ops, replaced per story) +- [ ] T008 Create `packages/api-grade-mcp/src/index.ts` stdio entry point: calls `createServer()`, creates `StdioServerTransport`, and calls `await server.connect(transport)` following the pattern from research.md -**Checkpoint**: `yarn workspace api-grade-mcp run typecheck` passes; `yarn workspace api-grade-mcp run test` finds and runs the smoke test +**Checkpoint**: Package scaffolding complete — user story implementation can now begin. --- ## Phase 3: User Story 1 — Grade an API from an AI Assistant (Priority: P1) 🎯 MVP -**Goal**: Expose the `grade-api` MCP tool so Claude Code, GitHub Copilot, and Copilot Studio can request a summary grade for any OpenAPI or AsyncAPI specification. +**Goal**: Expose `grade-api` as an MCP tool so AI tools can grade OpenAPI and AsyncAPI specs and receive a structured grade summary. + +**Independent Test**: Start the MCP server; send a `grade-api` call with a valid OpenAPI file and confirm a structured `GradeSummaryResponse` is returned containing `letterGrade`, `numericScore`, `gradeLabel`, and `summary`. Send a second call with an AsyncAPI file. Send a third with a missing file path and confirm a structured `SPEC_NOT_FOUND` error is returned. + +### Tests for User Story 1 + +> **Write these tests FIRST and confirm they fail before implementing T011.** -**Independent Test**: Configure the MCP server in one supported AI tool, ask it to grade a sample OpenAPI spec (e.g. `packages/api-grade-core/tests/fixtures/`), and confirm a structured response is returned with `letterGrade`, `numericScore`, and `summary`. +- [ ] T009 [P] [US1] Create `packages/api-grade-mcp/tests/unit/classify.test.ts` unit tests for the non-breaking classifier: assert each breaking path pattern returns `"breaking"`, each non-breaking pattern returns `"nonBreaking"`, each rule ID override is respected before path inspection, and ambiguous paths return `"unknown"` +- [ ] T010 [P] [US1] Create `packages/api-grade-mcp/tests/integration/grade.test.ts` integration tests for `grade-api`: valid OpenAPI file → full `GradeSummaryResponse` shape; valid AsyncAPI file → equivalent shape; non-existent file → `SPEC_NOT_FOUND` error with `isError: true`; file > 500KB → `GradeSummaryResponse` with `largeSpecWarning` field present ### Implementation for User Story 1 -- [X] T010 [P] [US1] Implement `packages/api-grade-mcp/src/tools/grade.ts` — exports `registerGradeTool(server: McpServer)` that calls `server.tool("grade-api", description, zodSchema, handler)`; handler instantiates `GradeEngine`, calls `engine.grade({ specPath, rulesetPath })`, projects the result to `GradeSummaryResponse` (omitting `diagnostics[]`), checks file size for the 500KB warning, and returns `{ content: [{ type: "text", text: JSON.stringify(result) }] }` -- [X] T011 [US1] Wire `registerGradeTool` into `packages/api-grade-mcp/src/server.ts` — import and call after server construction -- [X] T012 [P] [US1] Write integration tests in `packages/api-grade-mcp/tests/integration/grade.test.ts` — test: (a) valid OpenAPI spec returns correct shape; (b) valid AsyncAPI spec returns correct shape; (c) non-existent path returns `SPEC_NOT_FOUND` error; (d) spec over 500KB returns `largeSpecWarning` field; use `createServer()` directly without starting the stdio transport -- [X] T013 [US1] Add error handling in `packages/api-grade-mcp/src/tools/grade.ts` for missing file (`SPEC_NOT_FOUND`), inaccessible ruleset (`RULESET_NOT_FOUND`), and unexpected GradeEngine errors (`GRADE_ENGINE_ERROR`) using helpers from `utils/errors.ts` +- [ ] T011 [US1] Implement `packages/api-grade-mcp/src/tools/grade.ts` exporting `registerGradeTool(server, sessionState)`: registers `grade-api` with Zod schema (`specPath` required, `rulesetPath` optional); checks file existence before calling `GradeEngine.grade()`; projects `GradeSummaryResponse` (omitting `diagnostics[]`); reads file size to detect large spec and appends `largeSpecWarning`; returns structured errors for `SPEC_NOT_FOUND`, `SPEC_PARSE_ERROR`, `RULESET_NOT_FOUND`, `GRADE_ENGINE_ERROR` +- [ ] T012 [US1] Replace the `grade-api` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerGradeTool(server, sessionState)` call imported from `./tools/grade.ts` -**Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes with all four grade.test.ts scenarios green; `grade-api` tool is callable via `createServer()` in tests +**Checkpoint**: `grade-api` tool is fully functional. Run the integration tests in `tests/integration/grade.test.ts` and confirm all pass. --- ## Phase 4: User Story 2 — Assert Minimum Grade from an AI Context (Priority: P2) -**Goal**: Expose the `assert-api-grade` MCP tool so AI tools can run a pass/fail grade assertion against a minimum threshold. +**Goal**: Expose `assert-api-grade` as an MCP tool so AI tools can validate that an API meets a minimum grade threshold. -**Independent Test**: Ask an AI tool to assert a minimum grade of C on both a passing and a failing sample spec and confirm a `{ passed, actual, minimum, numericScore }` response is returned in each case. +**Independent Test**: Call `assert-api-grade` with a spec that achieves grade B and `minimumGrade: "C"` — confirm `passed: true` and correct `actual`/`minimum`/`numericScore` in the response. Call with `minimumGrade: "A"` — confirm `passed: false`. Call with `minimumGrade: "X"` — confirm `INVALID_GRADE` structured error. + +### Tests for User Story 2 + +> **Write these tests FIRST and confirm they fail before implementing T015.** + +- [ ] T014 [P] [US2] Create `packages/api-grade-mcp/tests/integration/assert-grade.test.ts` integration tests for `assert-api-grade`: assert grade C on a B-grade spec → `passed: true`; assert grade A on a D-grade spec → `passed: false` with correct `actual`; `minimumGrade: "X"` → `INVALID_GRADE` error; all five valid grades (A/B/C/D/F) accepted without error ### Implementation for User Story 2 -- [X] T014 [P] [US2] Implement `packages/api-grade-mcp/src/tools/assert-grade.ts` — exports `registerAssertGradeTool(server: McpServer)`; Zod schema includes `specPath`, `minimumGrade` (z.enum(["A","B","C","D","F"])), optional `rulesetPath`; handler validates `minimumGrade` against `LETTER_GRADE_ORDER` from `api-grade-core`, calls `engine.grade(...)`, compares using `gradeToNumber`, returns `AssertionResult` shape from data-model.md -- [X] T015 [US2] Wire `registerAssertGradeTool` into `packages/api-grade-mcp/src/server.ts` -- [X] T016 [P] [US2] Write integration tests in `packages/api-grade-mcp/tests/integration/assert-grade.test.ts` — test: (a) actual B vs minimum C → `passed: true`; (b) actual D vs minimum B → `passed: false` with correct `actual`; (c) invalid grade value → `INVALID_GRADE` error; (d) non-existent spec → `SPEC_NOT_FOUND` error +- [ ] T015 [US2] Implement `packages/api-grade-mcp/src/tools/assert-grade.ts` exporting `registerAssertGradeTool(server, sessionState)`: registers `assert-api-grade` with Zod schema (`specPath` required, `minimumGrade` enum `["A","B","C","D","F"]` required, `rulesetPath` optional); calls `GradeEngine.grade()`; compares `actual` vs `minimum` using `LETTER_GRADE_ORDER` from `api-grade-core`; returns `AssertionResult`; handles `INVALID_GRADE` and standard spec errors +- [ ] T016 [US2] Replace the `assert-api-grade` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerAssertGradeTool(server, sessionState)` call imported from `./tools/assert-grade.ts` -**Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes with all assert-grade.test.ts scenarios green +**Checkpoint**: `assert-api-grade` tool is fully functional. Run `tests/integration/assert-grade.test.ts` and confirm all pass. --- ## Phase 5: User Story 3 — Retrieve Detailed Diagnostic Information from an AI Context (Priority: P2) -**Goal**: Expose the `grade-api-detailed` MCP tool returning the full `GradeResult` including the complete `diagnostics[]` array, so AI tools can present per-violation findings to developers. +**Goal**: Expose `grade-api-detailed` as an MCP tool so AI tools can retrieve the full `GradeResult` including all `diagnostics[]`, per-category breakdowns, and prioritised recommendations. + +**Independent Test**: Call `grade-api-detailed` with a low-quality OpenAPI spec — confirm the response includes `diagnostics[]` with at least one entry, each with `ruleId`, `message`, `severity`, `path`. Call with a spec > 500KB — confirm `truncated: true` and `largeSpecWarning` present, and `diagnostics[]` has at most 100 entries. + +### Tests for User Story 3 -**Independent Test**: Ask an AI tool for detailed diagnostics on a low-quality sample spec and confirm the response includes `diagnostics[]` with `ruleId`, `message`, `severity`, and `path` on each entry. +> **Write these tests FIRST and confirm they fail before implementing T018.** + +- [ ] T017 [P] [US3] Create `packages/api-grade-mcp/tests/integration/grade-detailed.test.ts` integration tests for `grade-api-detailed`: low-quality OpenAPI → full `GradeResult` with non-empty `diagnostics[]` containing correct Diagnostic shape; high-quality spec → `diagnostics[]` with zero or minimal entries; spec > 500KB → `truncated: true`, `diagnostics.length <= 100`, `largeSpecWarning` present ### Implementation for User Story 3 -- [X] T017 [P] [US3] Implement `packages/api-grade-mcp/src/tools/grade-detailed.ts` — exports `registerGradeDetailedTool(server: McpServer)`; handler calls `engine.grade(...)` and returns the full `GradeResult` serialised; applies 500KB large-spec warning and truncates `diagnostics[]` to 100 entries with `truncated: true` when exceeded -- [X] T018 [US3] Wire `registerGradeDetailedTool` into `packages/api-grade-mcp/src/server.ts` -- [X] T019 [P] [US3] Write integration tests in `packages/api-grade-mcp/tests/integration/grade-detailed.test.ts` — test: (a) response includes `diagnostics[]` array; (b) each diagnostic has required fields (`ruleId`, `message`, `severity`, `path`); (c) non-existent spec → `SPEC_NOT_FOUND` error; (d) AsyncAPI spec is graded successfully (multi-format check) +- [ ] T018 [US3] Implement `packages/api-grade-mcp/src/tools/grade-detailed.ts` exporting `registerGradeDetailedTool(server, sessionState)`: registers `grade-api-detailed` with same Zod schema as `grade-api`; returns full `GradeResult` including `diagnostics[]`; for large specs truncates `diagnostics` to first 100 entries and sets `truncated: true`; adds `largeSpecWarning`; handles same error codes as `grade-api` +- [ ] T019 [US3] Replace the `grade-api-detailed` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerGradeDetailedTool(server, sessionState)` call imported from `./tools/grade-detailed.ts` -**Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes with all grade-detailed.test.ts scenarios green +**Checkpoint**: `grade-api-detailed` tool is fully functional. Run `tests/integration/grade-detailed.test.ts` and confirm all pass. --- -## Phase 6: User Story 4 — AI-Assisted Resolution of Non-Breaking Issues (Priority: P3) +## Phase 6: User Story 5 — Configure Default Ruleset (Priority: P2) -**Goal**: Expose the `get-non-breaking-violations` MCP tool returning a classified, AI-actionable list of non-breaking violations with full context per violation (FR-007, FR-012), enabling the two-step resolve workflow. +**Goal**: Expose `configure-ruleset` and `get-ruleset-config` tools; add config/auth modules; update all four grading tools to support the 5-level precedence chain, remote ruleset fetching, auth failure recovery, and the `recoveryOption` parameter. -**Independent Test**: Ask an AI tool for non-breaking violations on a spec with known documentation gaps; confirm each returned violation has `ruleId`, `path`, `location`, `currentValue`, and `expectedImprovement`; confirm no interface-contract violations (missing required fields, schema type changes) are included. +**Independent Test**: Call `configure-ruleset` with `scope: "session"` and a local ruleset path → confirm `get-ruleset-config` reports the session default as effective. Restart the server; configure `scope: "workspace"` → confirm the workspace config file exists at `.api-grade/config.json` and subsequent `grade-api` calls use it. Call with a GitHub Enterprise URL + `auth: { type: "github-pat" }` → confirm `GITHUB_TOKEN` env var is used for the fetch. Call with an unreachable URL → confirm `AuthFailureRecoveryResponse` with four recovery options arrives within 10 seconds. -### Implementation for User Story 4 +### Tests for User Story 5 + +> **Write these tests FIRST and confirm they fail before implementing T024–T031.** + +- [ ] T020 [P] [US5] Create `packages/api-grade-mcp/tests/unit/ruleset-config.test.ts` unit tests for `config/ruleset-config.ts`: load from non-existent file returns `null`; write then re-read at workspace path returns correct `RulesetConfig`; write then re-read at global path (`os.homedir()`) returns correct config; write error (unwritable path) throws `CONFIG_WRITE_ERROR` +- [ ] T021 [P] [US5] Create `packages/api-grade-mcp/tests/unit/resolve-ruleset.test.ts` unit tests for all 5-level precedence scenarios: per-request wins over all others; `sessionRulesetOverride: "builtin"` short-circuits to built-in immediately; session default wins over workspace and global; workspace wins over global; global wins over built-in; all null → built-in +- [ ] T022 [P] [US5] Create `packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts` integration tests for `configure-ruleset`: `scope: "session"` stores in `SessionState.defaultRuleset`; `scope: "workspace"` writes `.api-grade/config.json`; `scope: "global"` writes `~/.api-grade/config.json`; `rulesetPath: null` clears the scope; `auth.type: "entra-id"` without `tenantId`/`clientId` → `INVALID_AUTH_CONFIG`; unwritable workspace path → `CONFIG_WRITE_ERROR` +- [ ] T023 [P] [US5] Create `packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts` integration tests for `get-ruleset-config`: no defaults configured → all scopes null, effective is built-in; session only → effective is session; workspace only → effective is workspace; session + workspace → effective is session (precedence); response never includes raw token values + +### Implementation for User Story 5 -- [X] T020 [P] [US4] Implement `packages/api-grade-mcp/src/utils/classify.ts` — exports `classifyViolation(diagnostic: Diagnostic): "nonBreaking" | "breaking" | "unknown"` using the path-segment inspection and rule ID override logic from research.md; exports `buildNonBreakingViolation(diagnostic: Diagnostic, specContent: string): NonBreakingViolation` that populates all fields from data-model.md including `currentValue` (extracted from parsed spec at `path`) and `expectedImprovement` (derived from rule message) -- [X] T021 [P] [US4] Write unit tests in `packages/api-grade-mcp/tests/unit/classify.test.ts` — test: (a) `operation-description` at `paths./pets.get` → `nonBreaking`; (b) violation at `paths./pets.get.parameters[0].required` → `breaking`; (c) `info-contact` → `nonBreaking`; (d) rule with `x-` extension path → `nonBreaking`; (e) unknown path with no recognised segments → `unknown` -- [X] T022 [US4] Implement `packages/api-grade-mcp/src/tools/non-breaking.ts` — exports `registerNonBreakingTool(server: McpServer)`; handler calls `engine.grade(...)`, filters diagnostics to `nonBreaking` classification, maps each to `NonBreakingViolation` via `buildNonBreakingViolation`, returns `NonBreakingViolationResult` shape from data-model.md -- [X] T023 [US4] Wire `registerNonBreakingTool` into `packages/api-grade-mcp/src/server.ts` -- [X] T024 [P] [US4] Write integration tests in `packages/api-grade-mcp/tests/integration/non-breaking.test.ts` — test: (a) spec with known documentation gaps returns non-empty `nonBreakingViolations[]`; (b) each violation has all required fields; (c) no breaking-change violations are included in the list; (d) spec with only breaking violations returns `nonBreakingCount: 0`; (e) non-existent spec → `SPEC_NOT_FOUND` error +- [ ] T024 [US5] Implement `packages/api-grade-mcp/src/config/ruleset-config.ts` exporting `loadWorkspaceConfig()`, `loadGlobalConfig()`, `saveWorkspaceConfig(config)`, `saveGlobalConfig(config)` using `fs/promises`; workspace path = `path.join(process.cwd(), ".api-grade/config.json")`; global path = `path.join(os.homedir(), ".api-grade/config.json")`; non-existent file returns `null`; write creates parent directory with `{ recursive: true }` before writing +- [ ] T025 [US5] Implement `packages/api-grade-mcp/src/config/resolve-ruleset.ts` exporting `resolveRuleset(perRequestPath, sessionState, workspaceConfig, globalConfig): RulesetResolution` implementing the 5-level precedence chain from FR-017; `sessionRulesetOverride: "builtin"` on `SessionState` short-circuits immediately to `{ scope: "built-in", rulesetPath: null, auth: null }`; first non-null source wins +- [ ] T026 [US5] Implement `packages/api-grade-mcp/src/auth/github.ts` exporting `fetchRulesetWithGithubPat(url, token, timeoutMs): Promise` using native `fetch`, `AbortController`, `Authorization: Bearer` header; maps HTTP 401/403 → throws `RulesetAuthError("auth-failed")`; abort (`AbortError`) → throws `RulesetAuthError("network-unreachable")`; export `INITIAL_FETCH_TIMEOUT_MS = 5_000` and `RETRY_FETCH_TIMEOUT_MS = 30_000` +- [ ] T027 [US5] Implement `packages/api-grade-mcp/src/auth/entra.ts` exporting `acquireEntraToken(tenantId, clientId): Promise` using `@azure/msal-node` `PublicClientApplication` with disk-persisted token cache at `~/.api-grade/entra-token-cache.json` via `cachePlugin` (`beforeCacheAccess`/`afterCacheAccess`); tries silent acquisition first; on cache miss throws `EntraAuthRequired(userCode, verificationUri, expiresIn)` via `deviceCodeCallback`; never opens browser directly +- [ ] T028 [US5] Implement `packages/api-grade-mcp/src/tools/configure-ruleset.ts` exporting `registerConfigureRulesetTool(server, sessionState)`: registers `configure-ruleset` with Zod schema (`scope` enum required, `rulesetPath` optional string/null, `auth` object optional); validates `entra-id` requires `tenantId` + `clientId`; for `session` scope updates `sessionState.defaultRuleset` and clears `sessionState.sessionRulesetOverride` when `rulesetPath` is non-null (per research.md clearing rule); for `workspace`/`global` calls appropriate `saveXxxConfig()`; returns confirmation with `configFile` path for persistent scopes +- [ ] T029 [US5] Implement `packages/api-grade-mcp/src/tools/get-ruleset-config.ts` exporting `registerGetRulesetConfigTool(server, sessionState)`: registers `get-ruleset-config` (no required inputs); loads workspace and global configs; calls `resolveRuleset()` to determine effective scope; returns all scopes, effective scope, `precedenceOrder`, and `note` about per-request precedence; strips raw token values from `auth` fields (shows only `tokenSource: "config-file" | "env-var" | "none"`) +- [ ] T030 [US5] ⚠️ Update `packages/api-grade-mcp/src/tools/grade.ts`, `grade-detailed.ts`, and `assert-grade.ts` to accept `recoveryOption` optional parameter (enum `["retry","use-builtin-once","use-builtin-session","cancel"]`); call `resolveRuleset()` before each `GradeEngine.grade()` call; if resolved to a remote URL fetch it using the correct auth module with `INITIAL_FETCH_TIMEOUT_MS` (or `RETRY_FETCH_TIMEOUT_MS` when `recoveryOption: "retry"`); on fetch failure return `AuthFailureRecoveryResponse`; on `recoveryOption: "use-builtin-session"` set `sessionState.sessionRulesetOverride = "builtin"`; on `recoveryOption: "cancel"` return `REQUEST_CANCELLED` error — **highest-risk task; touches all grading tools** +- [ ] T031 [US5] Wire all US5 tools into `packages/api-grade-mcp/src/server.ts` `createServer()`: replace stubs with real `registerConfigureRulesetTool(server, sessionState)` and `registerGetRulesetConfigTool(server, sessionState)` calls; load workspace and global configs at server startup and pass to each grading tool registration -**Checkpoint**: `yarn workspace api-grade-mcp run test:coverage` passes; `classifyViolation` unit tests all green; non-breaking integration tests all green +**Checkpoint**: All six tools registered. Session, workspace, and global ruleset configuration works. Auth failure returns four recovery options. Run all unit and integration tests and confirm all pass. --- -## Phase 7: Polish & Cross-Cutting Concerns +## Phase 7: User Story 4 — AI-Assisted Resolution of Non-Breaking Issues (Priority: P3) -**Purpose**: Quality gate compliance, FR-014 verification across all three required AI tool targets, and documentation. +**Goal**: Expose `get-non-breaking-violations` as an MCP tool so AI tools receive a classified, AI-actionable list of non-breaking violations with sufficient context (`currentValue`, `location`, `expectedImprovement`) to generate spec corrections. -- [X] T025 Run the full quality gate locally and resolve any failures: `npm audit --audit-level=high --omit=dev`, `npm run lint`, `npm run typecheck --workspaces --if-present`, `yarn workspace api-grade-mcp run test:coverage`, `npm run build --workspaces --if-present` -- [ ] T026 [P] Verify `grade-api` in **Claude Code**: register the built server via `claude mcp add`, ask Claude to grade a sample spec, confirm structured response (FR-014) -- [ ] T027 [P] Verify `grade-api` in **GitHub Copilot (VS Code)**: add `.vscode/mcp.json` with the server entry, switch Copilot Chat to Agent mode, ask it to grade a sample spec, confirm structured response (FR-014) -- [ ] T028 Verify all four tools in **GitHub Copilot Studio**: add the server as a custom MCP Action, invoke each tool, confirm all four capabilities work end-to-end (FR-014) -- [X] T029 [P] Add `packages/api-grade-mcp` to `docs/package/` — brief package README covering install, MCP host config snippet, and the four available tools; update `docs/getting-started.md` with the MCP server as an option alongside CLI +**Independent Test**: Call `get-non-breaking-violations` with a spec containing known non-breaking violations (missing operation descriptions, missing info description) — confirm each returned `NonBreakingViolation` has `ruleId`, `severity`, `path`, `location`, `currentValue`, and `expectedImprovement` populated. Call with a spec where all violations are breaking — confirm `nonBreakingViolations: []` and `nonBreakingCount: 0`. -**Checkpoint**: Quality gate passes; all three AI tool environments verified; `@dawmatt/api-grade-mcp` is publishable +### Tests for User Story 4 + +> **Write these tests FIRST and confirm they fail before implementing T033.** + +- [ ] T032 [P] [US4] Create `packages/api-grade-mcp/tests/integration/non-breaking.test.ts` integration tests for `get-non-breaking-violations`: spec with known non-breaking violations → `nonBreakingViolations[]` contains entries with all FR-012 fields (`ruleId`, `message`, `severity`, `path`, `location`, `currentValue`, `expectedImprovement`); spec with only breaking violations → `nonBreakingCount: 0`, `nonBreakingViolations: []`; spec > 500KB → `largeSpecWarning` present; `currentValue` is `null` for absent fields, not empty string + +### Implementation for User Story 4 + +- [ ] T033 [US4] Implement `packages/api-grade-mcp/src/tools/non-breaking.ts` exporting `registerNonBreakingTool(server, sessionState)`: registers `get-non-breaking-violations` with same Zod schema as `grade-api` plus `recoveryOption`; calls `GradeEngine.grade()` with resolved ruleset; passes each `Diagnostic` through `classify()`; for non-breaking violations builds `NonBreakingViolation` shape with `location` (dot-joined path), `currentValue` (read from spec AST at path, or null if absent), `expectedImprovement` (derived from rule message per research.md logic); returns `NonBreakingViolationResult`; applies large spec warning +- [ ] T034 [US4] Replace the `get-non-breaking-violations` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerNonBreakingTool(server, sessionState)` call imported from `./tools/non-breaking.ts` + +**Checkpoint**: All four grading tools + two configuration tools are fully functional. Run the full test suite and confirm all pass. + +--- + +## Phase 8: Polish & Cross-Cutting Concerns + +**Purpose**: Documentation, monorepo updates, and explicit AI environment verification across all three required targets. + +- [ ] T035 [P] Create `docs/mcp/quick-start.md` user-facing installation and host configuration guide covering Claude Code (`claude mcp add` command + `.claude/settings.json`), GitHub Copilot in VS Code (`.vscode/mcp.json`, Agent mode requirement), and GitHub Copilot Studio (custom MCP Action setup) per quickstart.md design reference (FR-025) +- [ ] T036 [P] Create `docs/mcp/configuration.md` reference covering all three default ruleset scopes (session/workspace/global), `.api-grade/config.json` file format, `~/.api-grade/config.json` global path, GitHub Enterprise PAT auth (env var `GITHUB_TOKEN`, config `auth.type: "github-pat"`), Entra ID device-code flow (`tenantId`/`clientId`, `~/.api-grade/entra-token-cache.json` persistence), precedence order diagram (FR-025) +- [ ] T037 [P] Create `docs/mcp/troubleshooting.md` covering auth failure recovery (the four options: retry/use-builtin-once/use-builtin-session/cancel), token expiry (`GITHUB_TOKEN` rotation, Entra token cache), network failures (VPN disconnect, corporate firewall), tools not appearing in AI tool (Node 20+, valid JSON config, restart), `SPEC_NOT_FOUND` (use absolute paths), large spec warning (FR-025) +- [ ] T038 [P] Create `docs/package/api-grade-mcp.md` package documentation page listing all six tools with purpose and input/output summary, configuration overview (three scopes), link to `docs/mcp/` for full reference +- [ ] T039 Update `README.md` to add `@dawmatt/api-grade-mcp` to the Components section (alongside Core Package, CLI, Backstage plugin) and to the Documentation section (linking to `docs/mcp/`) +- [ ] T040 Update `CONTRIBUTING.md` to add `packages/api-grade-mcp` to the monorepo packages table with description, and update any scripts table to reflect the `api-grade-mcp` workspace +- [ ] T041 [P] Update `docs/index.md` to add MCP Server rows (overview, configuration reference, troubleshooting, quick-start) alongside the existing CLI and Backstage integration rows +- [ ] T042 [P] Update `docs/getting-started.md` to extend the MCP section to mention default ruleset configuration capability and link to `docs/mcp/configuration.md` +- [ ] T043 [P] Update `docs/package/README.md` to add `@dawmatt/api-grade-mcp` to the monorepo packages table +- [ ] T044 Verify all six MCP tools function correctly in all three required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `get-non-breaking-violations`, `configure-ruleset`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work; (3) GitHub Copilot Studio — configure as custom MCP Action and confirm grading succeeds (FR-014, SC-002, SC-006) --- @@ -127,54 +178,58 @@ ### Phase Dependencies -- **Setup (Phase 1)**: No dependencies — start immediately -- **Foundational (Phase 2)**: Depends on Phase 1 completion — **blocks all user story phases** -- **US1 (Phase 3)**: Depends on Phase 2; no dependency on US2/US3/US4 -- **US2 (Phase 4)**: Depends on Phase 2; no dependency on US1/US3/US4 -- **US3 (Phase 5)**: Depends on Phase 2; no dependency on US1/US2/US4 -- **US4 (Phase 6)**: Depends on Phase 2; logically follows US1/US3 (relies on grading working) but can be implemented independently -- **Polish (Phase 7)**: Depends on all user story phases complete +- **Setup (Phase 1)**: No dependencies — can start immediately +- **Foundational (Phase 2)**: Depends on Phase 1 completion — **BLOCKS all user stories** +- **US1 (Phase 3)**: Depends on Phase 2 completion — no dependencies on other stories +- **US2 (Phase 4)**: Depends on Phase 2 — no dependencies on US1 (grading tools are independent) +- **US3 (Phase 5)**: Depends on Phase 2 — no dependencies on US1 or US2 +- **US5 (Phase 6)**: Depends on Phase 2; T030 depends on T011/T015/T018 (updates those tool files) +- **US4 (Phase 7)**: Depends on Phase 2; T033 depends on T006 (classifier) +- **Polish (Phase 8)**: Depends on all story phases completing; T044 depends on all six tools being registered ### User Story Dependencies -- **US1 (P1)**: Can start after Phase 2 — no cross-story dependencies -- **US2 (P2)**: Can start after Phase 2 — shares `GradeEngine` usage pattern with US1 but independent implementation -- **US3 (P2)**: Can start after Phase 2 — same as US2; US2 and US3 can be worked in parallel -- **US4 (P3)**: Can start after Phase 2 — classifier in `classify.ts` is the only new net logic; all other tools can be complete or in-progress +- **US1 (P1)**: Can start after Foundational — no story dependencies +- **US2 (P2)**: Can start after Foundational — independent of US1 (uses same GradeEngine pattern) +- **US3 (P2)**: Can start after Foundational — independent of US1 and US2 +- **US5 (P2)**: Can start after Foundational; T030 depends on US1/US2/US3 tool files existing +- **US4 (P3)**: Can start after Foundational; depends on T006 (classifier) from Phase 2 ### Within Each User Story -- Tool implementation (`tools/*.ts`) before wiring into `server.ts` -- Unit/integration tests can be written in parallel with (or before) implementation -- Wiring task (`server.ts` update) before end-to-end testing of that tool -- Story complete before FR-014 verification in Phase 7 - ---- +- Tests MUST be written first and confirmed failing before implementation begins +- Tool implementation before server.ts wiring (Txx before Txx+1) +- T030 (cross-cutting grading tool update) must run after T011, T015, T018 all complete -## Parallel Execution Examples +### Parallel Opportunities -### Phase 1 — all tasks parallelisable after T001/T002: +- T003 (tsconfig) can run in parallel with T002 (package.json) in Phase 1 +- T005, T006 can run in parallel in Phase 2 (different files) +- T009, T010 (US1 tests) can run in parallel before US1 implementation +- T014 (US2 tests), T017 (US3 tests) can run in parallel — different files +- T020, T021, T022, T023 (US5 tests) can all run in parallel — different files +- T026 (GitHub auth), T027 (Entra auth), T024 (config), T025 (resolve) can run in parallel after US5 tests pass +- T035–T038, T041–T043 (documentation) can all run in parallel -``` -T001 → T002 → [T003, T004, T005 in parallel] -``` +--- -### Phase 2: +## Parallel Example: User Story 5 Tests +```bash +# All four US5 test files can be written simultaneously: +Task T020: tests/unit/ruleset-config.test.ts +Task T021: tests/unit/resolve-ruleset.test.ts +Task T022: tests/integration/configure-ruleset.test.ts +Task T023: tests/integration/get-ruleset-config.test.ts ``` -T006 → [T007, T009 in parallel] → T008 -``` - -### User story phases after Phase 2 completes: +```bash +# After tests pass, config/auth modules can be built in parallel: +Task T024: src/config/ruleset-config.ts +Task T025: src/config/resolve-ruleset.ts +Task T026: src/auth/github.ts +Task T027: src/auth/entra.ts ``` -Phase 3 (US1): T010 [P] + T012 [P] in parallel → T011 → T013 -Phase 4 (US2): T014 [P] + T016 [P] in parallel → T015 -Phase 5 (US3): T017 [P] + T019 [P] in parallel → T018 -Phase 6 (US4): T020 [P] + T021 [P] in parallel → T022 → T023 → T024 -``` - -US1, US2, US3 phases can all run in parallel once Phase 2 is complete. --- @@ -183,25 +238,39 @@ US1, US2, US3 phases can all run in parallel once Phase 2 is complete. ### MVP First (User Story 1 Only) 1. Complete Phase 1: Setup -2. Complete Phase 2: Foundational (blocks everything) -3. Complete Phase 3: US1 — `grade-api` tool only -4. **STOP and VALIDATE**: Configure in Claude Code and ask it to grade a sample spec -5. If it works end-to-end: ship the MVP +2. Complete Phase 2: Foundational (CRITICAL — blocks all stories) +3. Complete Phase 3: User Story 1 (`grade-api`) +4. **STOP and VALIDATE**: Test `grade-api` independently +5. Register the server in Claude Code and confirm the tool is discoverable ### Incremental Delivery -1. Setup + Foundational → package compiles, smoke test passes -2. Phase 3 (US1) → `grade-api` usable in all three AI tools → MVP -3. Phase 4+5 (US2+US3) → assertion and detailed diagnostics → full grading capability -4. Phase 6 (US4) → non-breaking classifier → AI-assisted fix workflow -5. Phase 7 → quality gate + FR-014 verification → publishable +1. Setup + Foundational → Package scaffolding ready +2. US1 → `grade-api` working → MCP server usable for basic grading (MVP!) +3. US2 → `assert-api-grade` working → grade assertion available to AI tools +4. US3 → `grade-api-detailed` working → full diagnostics available +5. US5 → `configure-ruleset` + `get-ruleset-config` + auth → enterprise adoption unlocked +6. US4 → `get-non-breaking-violations` working → AI-assisted fixing unlocked +7. Polish → documentation + three-environment verification → feature shippable + +### Parallel Team Strategy + +After Foundational phase is complete: +- **Developer A**: US1 (grade-api) → US4 (non-breaking, uses classifier) +- **Developer B**: US2 (assert-api-grade) + US3 (grade-api-detailed) +- **Developer C**: US5 (configure-ruleset, config/auth modules) +- All converge for T030 (cross-cutting grading tool update) and Phase 8 (verification + docs) --- ## Notes -- Constitution IV requires tests written before or alongside implementation; test tasks in each phase reflect this -- `server.ts` is intentionally kept as an aggregator so each story phase only modifies it via a `registerXxxTool` call — no phase overwrites another phase's changes -- FR-014 verification tasks (T026–T028) are manual integration checks, not automated tests; record results in the PR description -- The non-breaking classifier (`classify.ts`) is the only net-new business logic in this feature; all grading stays in `api-grade-core` -- Each `server.ts` wiring task (T011, T015, T018, T023) adds one import and one `register` call — these are intentionally small to reduce merge conflict risk +- [P] tasks = different files, no dependencies between them +- [Story] label maps each task to its user story for traceability +- **T030** is the highest-risk task: it touches all four grading tool files to add ruleset resolution and auth failure recovery. Review carefully before merging. +- Constitution Principle IV requires tests written before implementation — do not skip the test tasks in each phase. +- The quality gate (`yarn workspace api-grade-mcp run test:coverage`) must pass before any phase is reported complete. +- `sessionRulesetOverride: "builtin"` is a distinct field from `defaultRuleset: null` — do not conflate "no default configured" with "user chose to use built-in for this session" (see data-model.md State Model). +- `auth.githubToken` is never persisted to workspace or global config files (only held in `SessionState` for the session); workspace config stores only `auth.type: "github-pat"` as a hint so the runtime reads `GITHUB_TOKEN` env var (FR-021). +- `entra-token-cache.json` is written only to `~/.api-grade/` (user home), never to the workspace (FR-019). +- Verify T044 manually in each of the three required environments before the feature is considered done (FR-014). From 1153d1473485f81835521fc0311757d395a41554 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Fri, 19 Jun 2026 11:48:27 +1000 Subject: [PATCH 05/20] Ruleset configuration and doc improvements --- CONTRIBUTING.md | 19 +- README.md | 7 + docs/getting-started.md | 13 +- docs/index.md | 6 + docs/mcp/README.md | 74 +++++++ docs/mcp/configuration.md | 193 ++++++++++++++++++ docs/mcp/quick-start.md | 182 +++++++++++++++++ docs/mcp/troubleshooting.md | 130 ++++++++++++ docs/package/README.md | 1 + docs/package/api-grade-mcp.md | 69 +++++-- packages/api-grade-mcp/README.md | 128 ++++++++++++ packages/api-grade-mcp/package.json | 1 + packages/api-grade-mcp/src/auth/entra.ts | 62 ++++++ packages/api-grade-mcp/src/auth/github.ts | 48 +++++ .../src/config/resolve-ruleset.ts | 42 ++++ .../src/config/ruleset-config.ts | 57 ++++++ packages/api-grade-mcp/src/server.ts | 14 +- .../api-grade-mcp/src/tools/assert-grade.ts | 109 ++++++++-- .../src/tools/configure-ruleset.ts | 133 ++++++++++++ .../src/tools/get-ruleset-config.ts | 70 +++++++ .../api-grade-mcp/src/tools/grade-detailed.ts | 109 ++++++++-- packages/api-grade-mcp/src/tools/grade.ts | 109 ++++++++-- .../api-grade-mcp/src/tools/non-breaking.ts | 109 ++++++++-- packages/api-grade-mcp/src/types.ts | 32 +++ packages/api-grade-mcp/src/utils/errors.ts | 48 +++++ .../tests/integration/assert-grade.test.ts | 12 ++ .../integration/configure-ruleset.test.ts | 96 +++++++++ .../integration/get-ruleset-config.test.ts | 86 ++++++++ .../tests/integration/grade-detailed.test.ts | 11 + .../tests/integration/grade.test.ts | 11 + .../tests/integration/non-breaking.test.ts | 11 + .../api-grade-mcp/tests/unit/errors.test.ts | 27 +++ .../api-grade-mcp/tests/unit/github.test.ts | 97 +++++++++ .../tests/unit/resolve-ruleset.test.ts | 70 +++++++ .../tests/unit/ruleset-config.test.ts | 87 ++++++++ packages/api-grade-mcp/vitest.config.ts | 11 + specs/007-ai-support/tasks.md | 84 ++++---- 37 files changed, 2232 insertions(+), 136 deletions(-) create mode 100644 docs/mcp/README.md create mode 100644 docs/mcp/configuration.md create mode 100644 docs/mcp/quick-start.md create mode 100644 docs/mcp/troubleshooting.md create mode 100644 packages/api-grade-mcp/README.md create mode 100644 packages/api-grade-mcp/src/auth/entra.ts create mode 100644 packages/api-grade-mcp/src/auth/github.ts create mode 100644 packages/api-grade-mcp/src/config/resolve-ruleset.ts create mode 100644 packages/api-grade-mcp/src/config/ruleset-config.ts create mode 100644 packages/api-grade-mcp/src/tools/configure-ruleset.ts create mode 100644 packages/api-grade-mcp/src/tools/get-ruleset-config.ts create mode 100644 packages/api-grade-mcp/src/types.ts create mode 100644 packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts create mode 100644 packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts create mode 100644 packages/api-grade-mcp/tests/unit/errors.test.ts create mode 100644 packages/api-grade-mcp/tests/unit/github.test.ts create mode 100644 packages/api-grade-mcp/tests/unit/resolve-ruleset.test.ts create mode 100644 packages/api-grade-mcp/tests/unit/ruleset-config.test.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 812b7c9..0f8f8fa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -47,6 +47,12 @@ src/ rulesets/ loader.ts # Loads the default ruleset or a custom one +packages/ + api-grade-core/ # @dawmatt/api-grade-core — standalone grading library + api-grade-mcp/ # @dawmatt/api-grade-mcp — MCP server exposing six AI tools + backstage-plugin-api-grade/ # Backstage frontend card plugin + backstage-plugin-api-grade-backend/ # Backstage backend grading plugin + tests/ unit/ # Unit tests for individual modules integration/ # End-to-end grading tests against fixture specs @@ -56,14 +62,25 @@ tests/ rulesets/ # Test rulesets: custom-ruleset.yaml, missingfunction.yaml, unreachable.yaml ``` +## Monorepo packages + +| Package | Path | Description | +|---------|------|-------------| +| `@dawmatt/api-grade` | `/` (root) | CLI tool (`api-grade` binary) | +| `@dawmatt/api-grade-core` | `packages/api-grade-core/` | Standalone grading library used by all other packages | +| `@dawmatt/api-grade-mcp` | `packages/api-grade-mcp/` | MCP server exposing six AI tools (`grade-api`, `grade-api-detailed`, `assert-api-grade`, `get-non-breaking-violations`, `configure-ruleset`, `get-ruleset-config`) | +| `@dawmatt/backstage-plugin-api-grade` | `packages/backstage-plugin-api-grade/` | Backstage frontend card plugin | +| `@dawmatt/backstage-plugin-api-grade-backend` | `packages/backstage-plugin-api-grade-backend/` | Backstage backend grading plugin | + ## Scripts | Command | Description | |---------|-------------| -| `npm run build` | Compile TypeScript to `dist/` | +| `npm run build` | Compile TypeScript to `dist/` (root CLI and all packages) | | `npm test` | Run all tests once | | `npm run test:watch` | Run tests in watch mode | | `npm run test:coverage` | Run tests and generate a coverage report | +| `npm run -w packages/api-grade-mcp test` | Run MCP server tests only | ## Development process — Specification-Driven Development (SDD) diff --git a/README.md b/README.md index d677c62..bc4edde 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,12 @@ npm install @dawmatt/api-grade-core **[Backstage Plugins](docs/backstage-plugins/README.md)** — Display API grades on Backstage API entity pages. A frontend card shows the grade summary; a backend plugin computes grades server-side using `@dawmatt/api-grade-core`. +**[MCP Server](docs/mcp/quick-start.md)** — Expose api-grade capabilities to AI tools via the Model Context Protocol. Register in Claude Code, GitHub Copilot (VS Code Agent mode), or any MCP-compatible AI host and let the AI grade specs directly. + +```bash +claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp +``` + --- ## Documentation @@ -56,6 +62,7 @@ Full documentation is available in the **[Documentation Index](docs/index.md)**: - [CLI Reference](docs/cli/README.md) — installation, commands, and CI/CD setup - [Package Reference](docs/package/README.md) — integrate `api-grade-core` into your tooling - [Backstage Plugins](docs/backstage-plugins/README.md) — display grades in your developer portal +- [MCP Server](docs/mcp/README.md) — grade specs from AI tools via MCP --- diff --git a/docs/getting-started.md b/docs/getting-started.md index 2357741..2f2fde8 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -14,9 +14,9 @@ The grading algorithm is **error-first**: one error outweighs many warnings. It --- -## The Three Components +## The Four Components -api-grade is built from three components that share the same grading engine: +api-grade is built from four components that share the same grading engine: ### CLI Tool @@ -55,13 +55,15 @@ Two Backstage plugin packages that display API grades directly on your Backstage ### MCP Server (`@dawmatt/api-grade-mcp`) -An MCP (Model Context Protocol) server that exposes api-grade as four AI tools: `grade-api`, `grade-api-detailed`, `assert-api-grade`, and `get-non-breaking-violations`. Register it in Claude Code, GitHub Copilot (VS Code Agent mode), or any MCP-compatible AI host and let the AI grade specs directly. +An MCP (Model Context Protocol) server that exposes api-grade as six AI tools: `grade-api`, `grade-api-detailed`, `assert-api-grade`, `get-non-breaking-violations`, `configure-ruleset`, and `get-ruleset-config`. Register it in Claude Code, GitHub Copilot (VS Code Agent mode), or any MCP-compatible AI host and let the AI grade specs directly. ```bash claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp ``` -→ [MCP Server documentation](package/api-grade-mcp.md) +Configure a default Spectral ruleset so grading requests automatically use your organisation's standards — at session, workspace, or global scope. + +→ [MCP Server quick start](mcp/quick-start.md) | [Configuration reference](mcp/configuration.md) | [Troubleshooting](mcp/troubleshooting.md) --- @@ -72,7 +74,7 @@ claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp | Grade a spec from the terminal | [CLI Tool](cli/README.md) | | Set up a CI/CD grade gate | [CLI Commands → CI/CD example](cli/commands.md) | | Integrate grading into my own code | [Core Package (`@dawmatt/api-grade-core`)](package/README.md) | -| Grade specs from an AI assistant | [MCP Server (`@dawmatt/api-grade-mcp`)](package/api-grade-mcp.md) | +| Grade specs from an AI assistant | [MCP Server quick start](mcp/quick-start.md) | | Show grades in Backstage | [Backstage Quick Start](backstage-plugins/quick-start.md) | | Understand the full documentation | [Documentation Index](index.md) | @@ -84,3 +86,4 @@ claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp - [CLI Tool](cli/README.md) — installation and quick-start - [Core Package](package/README.md) — package overview and installation - [Backstage Plugins](backstage-plugins/README.md) — plugin architecture and setup +- [MCP Server](mcp/quick-start.md) — grade specs from AI tools diff --git a/docs/index.md b/docs/index.md index b45c478..7273109 100644 --- a/docs/index.md +++ b/docs/index.md @@ -14,6 +14,11 @@ | [Core Package](package/README.md) | Embed `api-grade-core` in your own tools and scripts | | [Package Usage Guide](package/usage-guide.md) | Common integration patterns and worked examples | | [Package API Reference](package/api-reference.md) | All exported functions, classes, and types | +| [MCP Server](mcp/README.md) | Grade specs from AI tools via MCP | +| [MCP Server Overview](package/api-grade-mcp.md) | All six MCP tools and their inputs/outputs | +| [MCP Quick Start](mcp/quick-start.md) | Install and configure the MCP server in minutes | +| [MCP Configuration Reference](mcp/configuration.md) | Default rulesets, auth, and scope precedence | +| [MCP Troubleshooting](mcp/troubleshooting.md) | Auth failures, missing tools, and common errors | | [Backstage Plugins](backstage-plugins/README.md) | Display grades on Backstage API entity pages | | [Backstage Quick Start](backstage-plugins/quick-start.md) | Get both plugins running in under 30 minutes | | [Backstage Configuration](backstage-plugins/configuration.md) | All plugin configuration options | @@ -38,6 +43,7 @@ The grading algorithm is error-first: a single error outweighs many warnings. It - **I want to grade a spec from the command line** → [CLI Tool](cli/README.md) - **I want to use grading in my own code or tooling** → [Core Package](package/README.md) +- **I want to grade specs from an AI assistant** → [MCP Server Quick Start](mcp/README.md) - **I want grades to appear in my Backstage developer portal** → [Backstage Plugins](backstage-plugins/README.md) - **I'm not sure where to start** → [Getting Started](getting-started.md) diff --git a/docs/mcp/README.md b/docs/mcp/README.md new file mode 100644 index 0000000..cbad611 --- /dev/null +++ b/docs/mcp/README.md @@ -0,0 +1,74 @@ +[← Back to Documentation Index](../index.md) + +# MCP Server (`@dawmatt/api-grade-mcp`) + +Grade OpenAPI and AsyncAPI specifications directly from your AI tool — Claude Code, GitHub Copilot, Claude Desktop, or any MCP-compatible host. + +--- + +## Overview + +`@dawmatt/api-grade-mcp` is an MCP (Model Context Protocol) server that wraps the `@dawmatt/api-grade-core` grading engine and exposes it as six MCP tools. Once registered in an AI host, the AI can grade specs, assert grade thresholds, retrieve detailed diagnostics, obtain a classified list of fixable non-breaking violations, and manage a default ruleset — all without manual CLI invocation. + +``` +AI tool (Claude Code, Copilot, etc.) + └─ MCP host + └─ @dawmatt/api-grade-mcp (stdio transport) + └─ @dawmatt/api-grade-core → GradeEngine + └─ GradeResult → structured JSON response → AI +``` + +--- + +## Available Tools + +| Tool | Description | +|------|-------------| +| `grade-api` | Letter grade, score, and summary — token-efficient overview | +| `grade-api-detailed` | Full grade with all violations and diagnostics | +| `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | +| `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | +| `configure-ruleset` | Set the default Spectral ruleset at session, workspace, or global scope | +| `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | + +--- + +## Supported Spec Formats + +- OpenAPI 2.x (Swagger) +- OpenAPI 3.x +- AsyncAPI 2.x +- AsyncAPI 3.x + +--- + +## Prerequisites + +- Node.js ≥ 20 +- An MCP-compatible AI host (Claude Code, Claude Desktop, GitHub Copilot VS Code Agent mode, GitHub Copilot Studio, Cursor, Windsurf, or any MCP host) + +No global install is required — the server runs on demand via `npx`: + +```bash +npx -y @dawmatt/api-grade-mcp +``` + +--- + +## Documentation + +| Guide | Purpose | +|-------|---------| +| [Quick Start](./quick-start.md) | Install and configure in minutes — covers Claude Code, Copilot, Claude Desktop | +| [Configuration Reference](./configuration.md) | Default rulesets, auth, scope precedence, and config file format | +| [Troubleshooting](./troubleshooting.md) | Auth failures, missing tools, and common errors | + +--- + +## Further Reading + +- [→ Quick Start](./quick-start.md) — get the MCP server running in your AI tool +- [→ Configuration Reference](./configuration.md) — configure a default ruleset and auth +- [→ Troubleshooting](./troubleshooting.md) — fix common issues +- [→ Package Documentation](../package/api-grade-mcp.md) — full tool reference with all inputs and outputs +- [→ Documentation Index](../index.md) — full navigation across all project docs diff --git a/docs/mcp/configuration.md b/docs/mcp/configuration.md new file mode 100644 index 0000000..12aa397 --- /dev/null +++ b/docs/mcp/configuration.md @@ -0,0 +1,193 @@ +[← Back to Documentation Index](../index.md) + +# MCP Server Configuration Reference + +> Default rulesets, authentication, scope precedence, and config file format for `@dawmatt/api-grade-mcp`. + +--- + +## Default Ruleset Scopes + +All grading tools accept an optional `rulesetPath` parameter for a one-off custom ruleset. To avoid supplying it on every request, configure a **default ruleset** at one of three scopes. + +### Scope Precedence Order + +``` +per-request rulesetPath + → session default + → workspace default + → global default + → built-in api-grade ruleset +``` + +The first non-null value in this chain wins. + +### Session Default + +Applies to all grading requests for the current MCP server session. Cleared when the server restarts. + +``` +configure-ruleset + scope: session + rulesetPath: /workspace/rulesets/company-standards.yaml +``` + +### Workspace Default + +Applies to all grading requests for the current project. Saved to `.api-grade/config.json` in the directory where the MCP server runs (typically the project root). Persists across server restarts. + +Commit `.api-grade/config.json` to share the standard with your team. + +### Global Default + +Applies to all projects on the machine. Saved to `~/.api-grade/config.json`. Applies unless overridden by a workspace or session default. + +--- + +## Config File Format + +Both `.api-grade/config.json` (workspace) and `~/.api-grade/config.json` (global) use the same format: + +```json +{ + "rulesetPath": "https://github.example.com/org/standards/raw/main/ruleset.yaml", + "auth": { + "type": "github-pat" + } +} +``` + +Or for a local file: + +```json +{ + "rulesetPath": "/Users/jane/rulesets/personal-standards.yaml", + "auth": null +} +``` + +| Field | Type | Description | +|-------|------|-------------| +| `rulesetPath` | `string \| null` | Absolute path or HTTPS URL to a Spectral-compatible ruleset. `null` clears the scope. | +| `auth` | `object \| null` | Authentication config for remote URLs. `null` means no auth (public URL). | +| `auth.type` | `"github-pat" \| "entra-id"` | Auth mechanism to use. | +| `auth.githubToken` | `string` (optional) | Inline PAT for GitHub. Not recommended — use the `GITHUB_TOKEN` env var instead. | +| `auth.tenantId` | `string` | Entra ID tenant ID (required for `entra-id`). | +| `auth.clientId` | `string` | Entra ID client/application ID (required for `entra-id`). | + +--- + +## Authentication + +### No Authentication (Public URLs) + +For publicly accessible ruleset URLs, no auth configuration is needed: + +```json +{ + "rulesetPath": "https://raw.githubusercontent.com/org/repo/main/ruleset.yaml", + "auth": null +} +``` + +### GitHub Enterprise (Personal Access Token) + +Set the `GITHUB_TOKEN` environment variable before starting your AI tool, or configure the auth type in the ruleset config: + +```json +{ + "rulesetPath": "https://github.example.com/org/standards/raw/main/ruleset.yaml", + "auth": { + "type": "github-pat" + } +} +``` + +At runtime, the server reads the token from the `GITHUB_TOKEN` environment variable. The token requires read access to the repository containing the ruleset. + +Setting `GITHUB_TOKEN` in the environment: + +```sh +export GITHUB_TOKEN=ghp_xxxx # then start your AI tool +``` + +### Microsoft Entra ID (Device Code Flow) + +For rulesets hosted on SharePoint or other Entra ID-protected sites: + +```json +{ + "rulesetPath": "https://mycompany.sharepoint.com/sites/api-standards/ruleset.yaml", + "auth": { + "type": "entra-id", + "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + "clientId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" + } +} +``` + +On the first grading request after configuration, the server initiates a **device code flow**: + +1. The grading tool returns an `ENTRA_AUTH_REQUIRED` response containing a `userCode` and `verificationUri`. +2. Visit the URI and enter the code to authenticate (typically 15-minute window). +3. Retry the grading request — the token is now cached. + +**Token cache location**: `~/.api-grade/entra-token-cache.json` + +Cached tokens are reused on subsequent requests. If the token expires, the device code flow restarts automatically on the next grading request. + +--- + +## Auth Failure Recovery + +When the configured default ruleset cannot be fetched (network unavailable, token expired, VPN disconnected), the grading tool returns an `RULESET_AUTH_FAILED` response with four recovery options: + +| Option | Description | +|--------|-------------| +| `retry` | Attempt the fetch again — use after reconnecting to the network or VPN | +| `use-builtin-once` | Grade using the built-in api-grade ruleset for this one request only | +| `use-builtin-session` | Use the built-in ruleset for all remaining requests this session | +| `cancel` | Cancel the grading request without returning a result | + +Tell your AI tool which option to use and it will re-invoke the grading tool with the `recoveryOption` parameter. + +--- + +## Checking the Active Configuration + +Use `get-ruleset-config` at any time: + +> Show me the current ruleset configuration + +The response shows: +- `effective` — which ruleset is currently in use and at which scope +- `session` — the session default (if any) +- `workspace` — the workspace default (if any) +- `global` — the global default (if any) +- `builtIn` — always `"default"` (the built-in fallback) +- `precedenceOrder` — the evaluation order + +Raw token values are never returned — the response shows only `tokenSource: "config-file" | "env-var" | "none"`. + +--- + +## Clearing a Default + +To clear a scope's default: + +``` +configure-ruleset + scope: workspace + rulesetPath: null +``` + +Passing `rulesetPath: null` clears the configuration at that scope without affecting other scopes. + +--- + +## Further Reading + +- [Quick Start](quick-start.md) — install and configure in minutes +- [Troubleshooting](troubleshooting.md) — auth failures, missing tools, and common errors +- [Package Documentation](../package/api-grade-mcp.md) — full tool reference with all parameters +- [Documentation Index](../index.md) diff --git a/docs/mcp/quick-start.md b/docs/mcp/quick-start.md new file mode 100644 index 0000000..35dacf4 --- /dev/null +++ b/docs/mcp/quick-start.md @@ -0,0 +1,182 @@ +[← Back to Documentation Index](../index.md) + +# MCP Server Quick Start + +> Install and configure `@dawmatt/api-grade-mcp` so your AI tool can grade API specifications directly. + +--- + +## Prerequisites + +- **Node.js 20 or later** — [nodejs.org](https://nodejs.org) +- An MCP-compatible AI tool (Claude Code, Claude Desktop, GitHub Copilot VS Code Agent mode, Cursor, Windsurf, or any MCP host) +- An OpenAPI or AsyncAPI specification file to grade + +--- + +## Installation + +No global install is required. The server runs on demand via `npx`: + +```sh +npx -y @dawmatt/api-grade-mcp +``` + +Or install globally if you prefer a local binary: + +```sh +npm install -g @dawmatt/api-grade-mcp +``` + +--- + +## Configure Your AI Tool + +### Claude Code + +Register the server from the terminal: + +```sh +claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp +``` + +Or add it to `.claude/settings.json` manually: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +The tools are available immediately in your Claude Code session. + +### Claude Desktop + +1. Open the configuration file: + - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` + - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` + +2. Add the server entry: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +3. Restart Claude Desktop. The six api-grade tools will appear in the tools panel. + +### GitHub Copilot (VS Code Agent mode) + +Requires VS Code 1.99 or later with the GitHub Copilot extension. + +1. Create `.vscode/mcp.json` in your project root: + +```json +{ + "servers": { + "api-grade": { + "type": "stdio", + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +2. Open the Copilot Chat panel and switch to **Agent mode**. + +3. The api-grade tools are now available to Copilot in agent mode. + +### GitHub Copilot Studio + +1. In your Copilot Studio agent, add a new **Action** of type **MCP Server**. + +2. Configure the action: + - **Name**: `api-grade` + - **Command**: `npx` + - **Arguments**: `-y @dawmatt/api-grade-mcp` + - **Transport**: stdio + +3. Publish the agent. The six tools will be available as callable actions. + +> For air-gapped environments, install `@dawmatt/api-grade-mcp` locally and reference the binary path directly instead of using `npx`. + +### Cursor + +Create `.cursor/mcp.json` in your project root (or `~/.cursor/mcp.json` for global): + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +Reload Cursor after saving. + +--- + +## Available Tools + +| Tool | What it does | +|------|-------------| +| `grade-api` | Quick grade: letter grade, numeric score, and summary | +| `grade-api-detailed` | Full grade with all violations, diagnostics, and recommendations | +| `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | +| `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | +| `configure-ruleset` | Set the default Spectral ruleset at session, workspace, or global scope | +| `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | + +--- + +## Try It + +Once configured, ask your AI tool naturally: + +**Grade an API:** +> Grade the API at `/workspace/my-api/openapi.yaml` + +**Get detailed diagnostics:** +> Show me all the violations in `/workspace/my-api/openapi.yaml` with recommendations + +**Assert a minimum grade:** +> Check whether `/workspace/my-api/openapi.yaml` meets a minimum grade of B + +**AI-assisted fix:** +> Fix the non-breaking issues in `/workspace/my-api/openapi.yaml` + +--- + +## Verifying the Setup + +To confirm the server starts correctly: + +```sh +echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | npx -y @dawmatt/api-grade-mcp +``` + +You should see a JSON response listing all six tools. + +--- + +## Further Reading + +- [Configuration Reference](configuration.md) — default rulesets, auth, and scope precedence +- [Troubleshooting](troubleshooting.md) — common issues and solutions +- [Package Documentation](../package/api-grade-mcp.md) — full tool reference +- [Documentation Index](../index.md) diff --git a/docs/mcp/troubleshooting.md b/docs/mcp/troubleshooting.md new file mode 100644 index 0000000..a16688c --- /dev/null +++ b/docs/mcp/troubleshooting.md @@ -0,0 +1,130 @@ +[← Back to Documentation Index](../index.md) + +# MCP Server Troubleshooting + +> Common issues and solutions for `@dawmatt/api-grade-mcp`. + +--- + +## Tools Don't Appear in the AI Tool + +**Cause**: Node.js version too low, invalid config file, or the AI tool wasn't restarted after configuration. + +**Steps**: +1. Check Node.js version: `node --version` — must be 20 or later +2. Validate the config file is valid JSON (no trailing commas, no comments) +3. Restart the AI tool after editing the config +4. Verify the server starts: `echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | npx -y @dawmatt/api-grade-mcp` + +--- + +## `SPEC_NOT_FOUND` Error + +**Cause**: The spec file path doesn't exist or the relative path is incorrect. + +**Fix**: Use an absolute path to the spec file. The MCP server resolves paths relative to the directory where it was started (typically the project root or the AI tool's working directory), which may differ from where you expect. + +``` +# Instead of: +openapi.yaml + +# Use: +/workspace/my-project/openapi.yaml +``` + +--- + +## `RULESET_NOT_FOUND` Error + +**Cause**: The `rulesetPath` supplied in the request (or the configured default) points to a local file that doesn't exist. + +**Fix**: Verify the path is correct and the file exists. For configured defaults, use `get-ruleset-config` to see what path is active, then correct it with `configure-ruleset`. + +--- + +## `RULESET_AUTH_FAILED` on Every Request + +**Cause**: The configured default ruleset is unreachable — network unavailable, token expired, or wrong credentials. + +**Diagnosis**: +1. Run `get-ruleset-config` to see what ruleset URL is configured. +2. Test whether the URL is reachable from the terminal: `curl -I ` + +**Fixes**: +- **Token expired (`github-pat`)**: Rotate the `GITHUB_TOKEN` env var and restart the AI tool +- **VPN disconnected**: Reconnect to VPN, then use the `retry` recovery option +- **Wrong URL**: Use `configure-ruleset` to correct the `rulesetPath` +- **Temporary bypass**: Use `configure-ruleset scope: session rulesetPath: null` to clear the session default and fall back to the built-in ruleset + +--- + +## Auth Failure Recovery Options + +When the default ruleset fetch fails, the grading tool returns four recovery options. Tell your AI tool which to use: + +| Say this | What happens | +|----------|-------------| +| retry | Re-attempts the fetch with a longer timeout (30s) | +| use built-in once | Grades this one request with the built-in ruleset | +| use built-in for this session | Skips the configured default for all remaining requests | +| cancel | Cancels the request | + +--- + +## Entra ID Device Code Not Completing + +**Cause**: The device code has a short expiry window (typically 15 minutes). + +**Fix**: If you miss the window, retry the grading request — the server initiates a new device-code flow and returns a fresh code. + +Check: +- `tenantId` and `clientId` are correct in the config +- `~/.api-grade/entra-token-cache.json` is writable + +To force a fresh authentication (clearing the cached token): +```sh +rm ~/.api-grade/entra-token-cache.json +``` + +--- + +## GitHub Token Issues + +**Symptom**: `RULESET_AUTH_FAILED` with `failureReason: "auth-failed"` when fetching from GitHub Enterprise. + +**Check**: +1. Is `GITHUB_TOKEN` set? `echo $GITHUB_TOKEN` +2. Does the token have read access to the repository containing the ruleset? +3. Is the token still valid? Check the expiry in your GitHub Enterprise settings. + +**Fix**: Rotate the token, export it in the terminal where you start the AI tool, then restart: +```sh +export GITHUB_TOKEN=ghp_newtoken +``` + +--- + +## Large Spec Warning + +Specifications over 500KB trigger a `largeSpecWarning`. Grading still proceeds but: +- `grade-api-detailed` may return truncated diagnostics (capped at 100 entries) +- Processing may be slower + +**Fix**: Split large specs or use a subset for grading. The warning appears in the `largeSpecWarning` field of the response. + +--- + +## Server Starts But Exits Immediately + +**Cause**: The server expects to communicate over stdio. Running `npx @dawmatt/api-grade-mcp` in a terminal without piping stdin causes it to exit when stdin closes. + +This is expected behaviour. The server is meant to be started by the AI tool's MCP host, not run interactively. + +--- + +## Further Reading + +- [Quick Start](quick-start.md) — initial setup and configuration +- [Configuration Reference](configuration.md) — auth, scopes, and config file format +- [Package Documentation](../package/api-grade-mcp.md) — full tool reference +- [Documentation Index](../index.md) diff --git a/docs/package/README.md b/docs/package/README.md index dd3063e..7b330e3 100644 --- a/docs/package/README.md +++ b/docs/package/README.md @@ -55,6 +55,7 @@ This repository is an npm workspaces monorepo: |---------|------|---------| | `@dawmatt/api-grade` | `/` (root) | CLI tool (`api-grade` binary) | | `@dawmatt/api-grade-core` | `packages/api-grade-core/` | Standalone grading library | +| `@dawmatt/api-grade-mcp` | `packages/api-grade-mcp/` | MCP server exposing six AI tools | | `@dawmatt/backstage-plugin-api-grade` | `packages/backstage-plugin-api-grade/` | Backstage frontend card plugin | | `@dawmatt/backstage-plugin-api-grade-backend` | `packages/backstage-plugin-api-grade-backend/` | Backstage backend grading plugin | diff --git a/docs/package/api-grade-mcp.md b/docs/package/api-grade-mcp.md index b6b9c8a..aa111b0 100644 --- a/docs/package/api-grade-mcp.md +++ b/docs/package/api-grade-mcp.md @@ -2,13 +2,7 @@ # MCP Server (`@dawmatt/api-grade-mcp`) -> Expose api-grade capabilities to LLMs and agentic AI tooling via the Model Context Protocol. - ---- - -## Overview - -`@dawmatt/api-grade-mcp` is an MCP (Model Context Protocol) server that wraps the `@dawmatt/api-grade-core` grading engine and exposes it as four MCP tools. Once registered in a supported AI host, the AI can grade API specifications, assert grade thresholds, retrieve detailed diagnostics, and obtain a classified list of non-breaking violations — without any manual CLI invocation. +> An MCP (Model Context Protocol) server that exposes api-grade capabilities as six AI tools for Claude Code, GitHub Copilot, and any MCP-compatible AI host. --- @@ -32,7 +26,7 @@ npm install -g @dawmatt/api-grade-mcp ### Claude Code -Register globally in the terminal: +Register from the terminal: ```bash claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp @@ -51,7 +45,7 @@ Or add to `.claude/settings.json`: } ``` -### GitHub Copilot — VS Code +### GitHub Copilot — VS Code Agent mode Add `.vscode/mcp.json` to your project (requires VS Code 1.99+): @@ -90,9 +84,9 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`: ### `grade-api` -Grade an API specification and return a token-efficient summary (letter grade, score, and diagnostic overview — no full violations list). +Grade an API specification and return a token-efficient summary — letter grade, score, and diagnostic overview without the full violations list. -**Input**: `specPath` (required), `rulesetPath` (optional) +**Input**: `specPath` (required), `rulesetPath` (optional), `recoveryOption` (optional) **Use when**: You want a quick quality overview without overwhelming the context window. @@ -102,7 +96,7 @@ Grade an API specification and return a token-efficient summary (letter grade, s Grade an API specification and return the full result including all individual violations. Truncates to 100 diagnostics with `truncated: true` for large specs. -**Input**: `specPath` (required), `rulesetPath` (optional) +**Input**: `specPath` (required), `rulesetPath` (optional), `recoveryOption` (optional) **Use when**: You need to analyse specific violations or present detailed findings. @@ -112,7 +106,7 @@ Grade an API specification and return the full result including all individual v Assert that an API specification meets a minimum grade threshold (A > B > C > D > F). Returns `{ passed, actual, minimum, numericScore }`. -**Input**: `specPath` (required), `minimumGrade` (required: A/B/C/D/F), `rulesetPath` (optional) +**Input**: `specPath` (required), `minimumGrade` (required: A/B/C/D/F), `rulesetPath` (optional), `recoveryOption` (optional) **Use when**: Running AI-assisted code review or quality gates. @@ -122,14 +116,57 @@ Assert that an API specification meets a minimum grade threshold (A > B > C > D Return a classified, AI-actionable list of non-breaking violations — those whose fixes do not alter paths, methods, required parameters, schema types, or response structures. Each violation includes `ruleId`, `path`, `location`, `currentValue`, and `expectedImprovement`. -**Input**: `specPath` (required), `rulesetPath` (optional) +**Input**: `specPath` (required), `rulesetPath` (optional), `recoveryOption` (optional) **Use when**: Asking the AI to generate fixes for documentation and metadata issues without risking breaking changes. --- +### `configure-ruleset` + +Set the default Spectral ruleset at session, workspace, or global scope. The configured default applies to all subsequent grading requests without needing to supply `rulesetPath` each time. + +**Input**: `scope` (required: session/workspace/global), `rulesetPath` (optional string or null), `auth` (optional) + +Scope precedence: session → workspace → global → built-in. + +- `scope: "session"` — in-memory only; cleared when the server restarts +- `scope: "workspace"` — saved to `.api-grade/config.json` in the project root +- `scope: "global"` — saved to `~/.api-grade/config.json` + +--- + +### `get-ruleset-config` + +Show the active ruleset configuration at all scopes and which is currently effective. + +**Input**: none + +Returns `effective`, `session`, `workspace`, `global`, `builtIn`, `precedenceOrder`, and `note`. Raw token values are never returned — shows only `tokenSource: "config-file" | "env-var" | "none"`. + +--- + +## Default Ruleset Configuration + +All grading tools support an optional `rulesetPath` parameter for one-off custom rulesets. To avoid supplying it on every request, configure a default: + +**Session default** (current session only): +> Set the default ruleset for this session to `/workspace/rulesets/company-standards.yaml` + +**Workspace default** (persisted to `.api-grade/config.json`): +> Set the workspace default ruleset to `https://github.example.com/org/standards/raw/main/ruleset.yaml` + +**Global default** (`~/.api-grade/config.json`): +> Set my global default ruleset to `/Users/jane/rulesets/personal-standards.yaml` + +For full configuration options including GitHub PAT and Entra ID authentication, see the [Configuration Reference](../mcp/configuration.md). + +--- + ## Further Reading -- [Full quickstart and AI tool configuration](../../specs/007-ai-support/quickstart.md) -- [MCP tool contracts and response shapes](../../specs/007-ai-support/contracts/mcp-tools.md) +- [Quick Start](../mcp/quick-start.md) — install and configure in minutes +- [Configuration Reference](../mcp/configuration.md) — default rulesets, auth, and scope precedence +- [Troubleshooting](../mcp/troubleshooting.md) — common issues and solutions - [Core Package (`@dawmatt/api-grade-core`)](README.md) +- [Documentation Index](../index.md) diff --git a/packages/api-grade-mcp/README.md b/packages/api-grade-mcp/README.md new file mode 100644 index 0000000..40b3af4 --- /dev/null +++ b/packages/api-grade-mcp/README.md @@ -0,0 +1,128 @@ +# @dawmatt/api-grade-mcp + +MCP (Model Context Protocol) server that exposes api-grade capabilities as six AI tools — grade OpenAPI and AsyncAPI specifications directly from Claude Code, GitHub Copilot, or any MCP-compatible AI host. + +## Installation + +```bash +npm install -g @dawmatt/api-grade-mcp +``` + +Or use without installing (recommended): + +```bash +npx -y @dawmatt/api-grade-mcp +``` + +## Quick Start + +### Claude Code + +```bash +claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp +``` + +### Claude Desktop + +Add to `~/Library/Application Support/Claude/claude_desktop_config.json`: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +### GitHub Copilot (VS Code Agent mode) + +Create `.vscode/mcp.json` in your project root: + +```json +{ + "servers": { + "api-grade": { + "type": "stdio", + "command": "npx", + "args": ["-y", "@dawmatt/api-grade-mcp"] + } + } +} +``` + +## Available Tools + +| Tool | Description | +|------|-------------| +| `grade-api` | Letter grade, score, and summary — token-efficient overview | +| `grade-api-detailed` | Full grade with all violations and diagnostics | +| `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | +| `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | +| `configure-ruleset` | Set the default Spectral ruleset at session, workspace, or global scope | +| `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | + +## Usage Examples + +Once configured, ask your AI tool naturally: + +``` +Grade the API at /workspace/my-api/openapi.yaml +``` + +``` +Check whether /workspace/my-api/openapi.yaml meets a minimum grade of B +``` + +``` +Fix the non-breaking issues in /workspace/my-api/openapi.yaml +``` + +``` +Set the workspace default ruleset to https://github.example.com/org/standards/raw/main/ruleset.yaml +``` + +## Default Ruleset Configuration + +All grading tools support an optional `rulesetPath` per-request. To avoid supplying it every time, configure a default: + +- **Session** — in-memory, cleared on restart +- **Workspace** — saved to `.api-grade/config.json` in the project root +- **Global** — saved to `~/.api-grade/config.json` + +Precedence: per-request → session → workspace → global → built-in. + +Supported auth: GitHub PAT (`GITHUB_TOKEN` env var) and Microsoft Entra ID (device code flow). + +## Supported Spec Formats + +- OpenAPI 2.x (Swagger) +- OpenAPI 3.x +- AsyncAPI 2.x +- AsyncAPI 3.x + +## Requirements + +- Node.js ≥ 20.0.0 + +## Related Packages + +| Package | Purpose | +|---------|---------| +| [`@dawmatt/api-grade`](https://www.npmjs.com/package/@dawmatt/api-grade) | CLI tool — grade specs from the terminal | +| [`@dawmatt/api-grade-core`](https://www.npmjs.com/package/@dawmatt/api-grade-core) | Grading engine — embed in your own tools | +| [`@dawmatt/backstage-plugin-api-grade`](https://www.npmjs.com/package/@dawmatt/backstage-plugin-api-grade) | Backstage frontend card plugin | +| [`@dawmatt/backstage-plugin-api-grade-backend`](https://www.npmjs.com/package/@dawmatt/backstage-plugin-api-grade-backend) | Backstage backend grading plugin | + +## Documentation + +- [Quick Start](https://github.com/DawMatt/api-grade/blob/main/docs/mcp/quick-start.md) — install and configure in minutes +- [Configuration Reference](https://github.com/DawMatt/api-grade/blob/main/docs/mcp/configuration.md) — default rulesets, auth, and scope precedence +- [Troubleshooting](https://github.com/DawMatt/api-grade/blob/main/docs/mcp/troubleshooting.md) — common issues and solutions +- [Full Documentation](https://github.com/DawMatt/api-grade) + +## License + +MIT diff --git a/packages/api-grade-mcp/package.json b/packages/api-grade-mcp/package.json index b0afe38..139a783 100644 --- a/packages/api-grade-mcp/package.json +++ b/packages/api-grade-mcp/package.json @@ -41,6 +41,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@azure/msal-node": "^2.16.2", "@dawmatt/api-grade-core": "*", "@modelcontextprotocol/sdk": "^1.0.0", "zod": "^3.22.0" diff --git a/packages/api-grade-mcp/src/auth/entra.ts b/packages/api-grade-mcp/src/auth/entra.ts new file mode 100644 index 0000000..581b856 --- /dev/null +++ b/packages/api-grade-mcp/src/auth/entra.ts @@ -0,0 +1,62 @@ +import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { dirname, join } from 'node:path'; +import { homedir } from 'node:os'; + +const ENTRA_CACHE_PATH = join(homedir(), '.api-grade', 'entra-token-cache.json'); + +export class EntraAuthRequired extends Error { + constructor( + public readonly userCode: string, + public readonly verificationUri: string, + public readonly expiresIn: number + ) { + super(`Entra ID authentication required. Visit ${verificationUri} and enter code ${userCode}.`); + this.name = 'EntraAuthRequired'; + } +} + +export async function acquireEntraToken(tenantId: string, clientId: string): Promise { + const { PublicClientApplication } = await import('@azure/msal-node'); + + const cachePlugin = { + async beforeCacheAccess(ctx: { tokenCache: { deserialize: (d: string) => void } }) { + const data = await readFile(ENTRA_CACHE_PATH, 'utf-8').catch(() => ''); + if (data) ctx.tokenCache.deserialize(data); + }, + async afterCacheAccess(ctx: { cacheHasChanged: boolean; tokenCache: { serialize: () => string } }) { + if (ctx.cacheHasChanged) { + await mkdir(dirname(ENTRA_CACHE_PATH), { recursive: true }); + await writeFile(ENTRA_CACHE_PATH, ctx.tokenCache.serialize(), 'utf-8'); + } + }, + }; + + const pca = new PublicClientApplication({ + auth: { clientId, authority: `https://login.microsoftonline.com/${tenantId}` }, + cache: { cachePlugin }, + }); + + const scopes = [`api://${clientId}/.default`]; + + const accounts = await pca.getTokenCache().getAllAccounts(); + if (accounts.length > 0) { + try { + const result = await pca.acquireTokenSilent({ scopes, account: accounts[0] }); + if (result?.accessToken) return result.accessToken; + } catch { + // fall through to device-code flow + } + } + + const result = await pca.acquireTokenByDeviceCode({ + scopes, + deviceCodeCallback: (response) => { + throw new EntraAuthRequired(response.userCode, response.verificationUri, response.expiresIn); + }, + }); + + if (!result?.accessToken) { + throw new Error('Entra ID token acquisition failed'); + } + return result.accessToken; +} diff --git a/packages/api-grade-mcp/src/auth/github.ts b/packages/api-grade-mcp/src/auth/github.ts new file mode 100644 index 0000000..36c3efa --- /dev/null +++ b/packages/api-grade-mcp/src/auth/github.ts @@ -0,0 +1,48 @@ +export const INITIAL_FETCH_TIMEOUT_MS = 5_000; +export const RETRY_FETCH_TIMEOUT_MS = 30_000; + +export class RulesetAuthError extends Error { + constructor( + public readonly reason: 'auth-failed' | 'network-unreachable', + public readonly url: string + ) { + super(`Failed to fetch ruleset from ${url}: ${reason}`); + this.name = 'RulesetAuthError'; + } +} + +export async function fetchRulesetContent( + url: string, + token: string | undefined, + timeoutMs: number +): Promise { + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), timeoutMs); + const headers: Record = token ? { Authorization: `Bearer ${token}` } : {}; + try { + const res = await fetch(url, { headers, signal: controller.signal }); + if (res.status === 401 || res.status === 403) { + throw new RulesetAuthError('auth-failed', url); + } + if (!res.ok) { + throw new RulesetAuthError('network-unreachable', url); + } + return res.text(); + } catch (e) { + if (e instanceof RulesetAuthError) throw e; + if (e instanceof Error && e.name === 'AbortError') { + throw new RulesetAuthError('network-unreachable', url); + } + throw new RulesetAuthError('network-unreachable', url); + } finally { + clearTimeout(id); + } +} + +export async function fetchRulesetWithGithubPat( + url: string, + token: string, + timeoutMs: number +): Promise { + return fetchRulesetContent(url, token, timeoutMs); +} diff --git a/packages/api-grade-mcp/src/config/resolve-ruleset.ts b/packages/api-grade-mcp/src/config/resolve-ruleset.ts new file mode 100644 index 0000000..c31fcc7 --- /dev/null +++ b/packages/api-grade-mcp/src/config/resolve-ruleset.ts @@ -0,0 +1,42 @@ +import type { RulesetConfig, RulesetResolution, SessionState } from '../types.js'; + +export function resolveRuleset( + perRequestPath: string | undefined | null, + sessionState: SessionState, + workspaceConfig: RulesetConfig | null, + globalConfig: RulesetConfig | null +): RulesetResolution { + if (perRequestPath != null && perRequestPath !== '') { + return { rulesetPath: perRequestPath, scope: 'per-request', auth: null }; + } + + if (sessionState.sessionRulesetOverride === 'builtin') { + return { rulesetPath: null, scope: 'built-in', auth: null }; + } + + if (sessionState.defaultRuleset?.rulesetPath != null) { + return { + rulesetPath: sessionState.defaultRuleset.rulesetPath, + scope: 'session', + auth: sessionState.defaultRuleset.auth, + }; + } + + if (workspaceConfig?.rulesetPath != null) { + return { + rulesetPath: workspaceConfig.rulesetPath, + scope: 'workspace', + auth: workspaceConfig.auth, + }; + } + + if (globalConfig?.rulesetPath != null) { + return { + rulesetPath: globalConfig.rulesetPath, + scope: 'global', + auth: globalConfig.auth, + }; + } + + return { rulesetPath: null, scope: 'built-in', auth: null }; +} diff --git a/packages/api-grade-mcp/src/config/ruleset-config.ts b/packages/api-grade-mcp/src/config/ruleset-config.ts new file mode 100644 index 0000000..abd8ec8 --- /dev/null +++ b/packages/api-grade-mcp/src/config/ruleset-config.ts @@ -0,0 +1,57 @@ +import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { dirname, join } from 'node:path'; +import { homedir } from 'node:os'; +import type { RulesetConfig } from '../types.js'; + +export class ConfigWriteError extends Error { + readonly code = 'CONFIG_WRITE_ERROR'; + constructor(message: string, readonly cause?: unknown) { + super(message); + this.name = 'ConfigWriteError'; + } +} + +export function getWorkspaceConfigPath(): string { + return join(process.cwd(), '.api-grade', 'config.json'); +} + +export function getGlobalConfigPath(): string { + return join(homedir(), '.api-grade', 'config.json'); +} + +async function loadConfig(filePath: string): Promise { + try { + const data = await readFile(filePath, 'utf-8'); + return JSON.parse(data) as RulesetConfig; + } catch { + return null; + } +} + +async function saveConfig(filePath: string, config: RulesetConfig): Promise { + try { + await mkdir(dirname(filePath), { recursive: true }); + await writeFile(filePath, JSON.stringify(config, null, 2), 'utf-8'); + } catch (err) { + throw new ConfigWriteError( + `Could not write config to ${filePath}: ${err instanceof Error ? err.message : String(err)}`, + err + ); + } +} + +export async function loadWorkspaceConfig(): Promise { + return loadConfig(getWorkspaceConfigPath()); +} + +export async function loadGlobalConfig(): Promise { + return loadConfig(getGlobalConfigPath()); +} + +export async function saveWorkspaceConfig(config: RulesetConfig): Promise { + return saveConfig(getWorkspaceConfigPath(), config); +} + +export async function saveGlobalConfig(config: RulesetConfig): Promise { + return saveConfig(getGlobalConfigPath(), config); +} diff --git a/packages/api-grade-mcp/src/server.ts b/packages/api-grade-mcp/src/server.ts index a853677..73e64c5 100644 --- a/packages/api-grade-mcp/src/server.ts +++ b/packages/api-grade-mcp/src/server.ts @@ -6,6 +6,9 @@ import { registerGradeTool } from './tools/grade.js'; import { registerAssertGradeTool } from './tools/assert-grade.js'; import { registerGradeDetailedTool } from './tools/grade-detailed.js'; import { registerNonBreakingTool } from './tools/non-breaking.js'; +import { registerConfigureRulesetTool } from './tools/configure-ruleset.js'; +import { registerGetRulesetConfigTool } from './tools/get-ruleset-config.js'; +import type { SessionState } from './types.js'; function getVersion(): string { try { @@ -20,9 +23,12 @@ function getVersion(): string { export function createServer(): McpServer { const server = new McpServer({ name: 'api-grade', version: getVersion() }); - registerGradeTool(server); - registerAssertGradeTool(server); - registerGradeDetailedTool(server); - registerNonBreakingTool(server); + const sessionState: SessionState = { defaultRuleset: null, sessionRulesetOverride: null }; + registerGradeTool(server, sessionState); + registerAssertGradeTool(server, sessionState); + registerGradeDetailedTool(server, sessionState); + registerNonBreakingTool(server, sessionState); + registerConfigureRulesetTool(server, sessionState); + registerGetRulesetConfigTool(server, sessionState); return server; } diff --git a/packages/api-grade-mcp/src/tools/assert-grade.ts b/packages/api-grade-mcp/src/tools/assert-grade.ts index dd095cd..480baff 100644 --- a/packages/api-grade-mcp/src/tools/assert-grade.ts +++ b/packages/api-grade-mcp/src/tools/assert-grade.ts @@ -1,10 +1,17 @@ -import { statSync } from 'node:fs'; +import { statSync, writeFileSync, unlinkSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine, gradeToNumber, LETTER_GRADE_ORDER } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildAuthFailureResponse, ERROR_CODES } from '../utils/errors.js'; +import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; +import { resolveRuleset } from '../config/resolve-ruleset.js'; +import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; +import { EntraAuthRequired, acquireEntraToken } from '../auth/entra.js'; +import type { SessionState } from '../types.js'; -export function registerAssertGradeTool(server: McpServer): void { +export function registerAssertGradeTool(server: McpServer, sessionState: SessionState): void { server.tool( 'assert-api-grade', 'Assert that an API specification meets a minimum grade threshold. Returns a structured pass/fail result. Use this in AI-assisted code review workflows or quality gates. Grade ordering: A (best) > B > C > D > F (worst).', @@ -23,8 +30,14 @@ export function registerAssertGradeTool(server: McpServer): void { .string() .optional() .describe('Optional path to a custom Spectral-compatible ruleset file'), + recoveryOption: z + .enum(['retry', 'use-builtin-once', 'use-builtin-session', 'cancel']) + .optional() + .describe( + 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response.' + ), }, - async ({ specPath, minimumGrade, rulesetPath }) => { + async ({ specPath, minimumGrade, rulesetPath, recoveryOption }) => { if (!LETTER_GRADE_ORDER.includes(minimumGrade as (typeof LETTER_GRADE_ORDER)[number])) { return mcpError( ERROR_CODES.INVALID_GRADE, @@ -33,31 +46,91 @@ export function registerAssertGradeTool(server: McpServer): void { ); } - try { - statSync(specPath); - } catch { - return mcpError( - ERROR_CODES.SPEC_NOT_FOUND, - `The specification file '${specPath}' does not exist. Check the path and try again.`, - { specPath } - ); + if (recoveryOption === 'cancel') { + return mcpError(ERROR_CODES.REQUEST_CANCELLED, 'Grading request cancelled by user.', { specPath }); + } + + if (recoveryOption === 'use-builtin-session') { + sessionState.sessionRulesetOverride = 'builtin'; } - if (rulesetPath) { + const workspaceConfig = await loadWorkspaceConfig(); + const globalConfig = await loadGlobalConfig(); + const resolved = resolveRuleset(rulesetPath, sessionState, workspaceConfig, globalConfig); + + let effectiveRulesetPath: string | undefined = resolved.rulesetPath ?? undefined; + let tempRulesetFile: string | undefined; + + if (resolved.rulesetPath?.startsWith('http')) { + if (recoveryOption === 'use-builtin-once') { + effectiveRulesetPath = undefined; + } else { + const timeoutMs = recoveryOption === 'retry' ? RETRY_FETCH_TIMEOUT_MS : INITIAL_FETCH_TIMEOUT_MS; + try { + let content: string; + if (resolved.auth?.type === 'github-pat') { + const token = resolved.auth.githubToken ?? process.env.GITHUB_TOKEN ?? ''; + content = await fetchRulesetContent(resolved.rulesetPath, token || undefined, timeoutMs); + } else if (resolved.auth?.type === 'entra-id' && resolved.auth.tenantId && resolved.auth.clientId) { + const token = await acquireEntraToken(resolved.auth.tenantId, resolved.auth.clientId); + content = await fetchRulesetContent(resolved.rulesetPath, token, timeoutMs); + } else { + content = await fetchRulesetContent(resolved.rulesetPath, undefined, timeoutMs); + } + tempRulesetFile = join(tmpdir(), `api-grade-ruleset-${Date.now()}.yaml`); + writeFileSync(tempRulesetFile, content); + effectiveRulesetPath = tempRulesetFile; + } catch (err) { + if (err instanceof EntraAuthRequired) { + return { + content: [{ + type: 'text', + text: JSON.stringify({ + error: ERROR_CODES.ENTRA_AUTH_REQUIRED, + deviceCodeUrl: err.verificationUri, + userCode: err.userCode, + expiresIn: err.expiresIn, + message: `Complete Entra ID sign-in: Visit ${err.verificationUri} and enter code ${err.userCode}`, + }), + }], + isError: true as const, + }; + } + const reason = err instanceof RulesetAuthError ? err.reason : 'network-unreachable'; + return buildAuthFailureResponse( + reason, + resolved.rulesetPath, + resolved.scope, + `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${reason.replace('-', ' ')}.` + ); + } + } + } else if (effectiveRulesetPath) { try { - statSync(rulesetPath); + statSync(effectiveRulesetPath); } catch { return mcpError( ERROR_CODES.RULESET_NOT_FOUND, - `The ruleset file '${rulesetPath}' does not exist. Check the path and try again.`, - { rulesetPath } + `The ruleset file '${effectiveRulesetPath}' does not exist. Check the path and try again.`, + { rulesetPath: effectiveRulesetPath } ); } } + try { + statSync(specPath); + } catch { + if (tempRulesetFile) try { unlinkSync(tempRulesetFile); } catch { /* ignore */ } + return mcpError( + ERROR_CODES.SPEC_NOT_FOUND, + `The specification file '${specPath}' does not exist. Check the path and try again.`, + { specPath } + ); + } + try { const engine = new GradeEngine(); - const result = await engine.grade({ specPath, rulesetPath }); + const result = await engine.grade({ specPath, rulesetPath: effectiveRulesetPath }); const actual = result.letterGrade; const passed = gradeToNumber(actual) <= gradeToNumber(minimumGrade as (typeof LETTER_GRADE_ORDER)[number]); @@ -78,6 +151,8 @@ export function registerAssertGradeTool(server: McpServer): void { `GradeEngine error: ${message}`, { specPath } ); + } finally { + if (tempRulesetFile) try { unlinkSync(tempRulesetFile); } catch { /* ignore */ } } } ); diff --git a/packages/api-grade-mcp/src/tools/configure-ruleset.ts b/packages/api-grade-mcp/src/tools/configure-ruleset.ts new file mode 100644 index 0000000..2ce2c5e --- /dev/null +++ b/packages/api-grade-mcp/src/tools/configure-ruleset.ts @@ -0,0 +1,133 @@ +import { z } from 'zod'; +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { mcpError, ERROR_CODES } from '../utils/errors.js'; +import { + saveWorkspaceConfig, + saveGlobalConfig, + getWorkspaceConfigPath, + getGlobalConfigPath, + ConfigWriteError, +} from '../config/ruleset-config.js'; +import type { SessionState, RulesetConfig, AuthConfig } from '../types.js'; + +export function registerConfigureRulesetTool(server: McpServer, sessionState: SessionState): void { + server.tool( + 'configure-ruleset', + 'Set the default ruleset used by this MCP server when no rulesetPath is supplied on a grading request. Supports three scopes: session (in-memory, resets on server restart), workspace (persisted to .api-grade/config.json in the workspace root), and global (persisted to ~/.api-grade/config.json). Optionally configure authentication for rulesets hosted in secured locations.', + { + scope: z + .enum(['session', 'workspace', 'global']) + .describe( + "Where to store this default: 'session' is in-memory for this server process only; 'workspace' persists to .api-grade/config.json in the current workspace root; 'global' persists to ~/.api-grade/config.json." + ), + rulesetPath: z + .string() + .nullish() + .describe( + 'Absolute or relative file path, or HTTPS URL, to a Spectral-compatible ruleset file. To clear the default at this scope, omit this field or pass null.' + ), + auth: z + .object({ + type: z.enum(['github-pat', 'entra-id']).describe( + "'github-pat' uses a Bearer token for GitHub Enterprise URLs. 'entra-id' uses Microsoft Entra ID OAuth 2.0 device-code flow." + ), + githubToken: z + .string() + .optional() + .describe( + "GitHub Personal Access Token. Only used when type is 'github-pat'. If omitted, falls back to GITHUB_TOKEN environment variable." + ), + tenantId: z + .string() + .optional() + .describe("Microsoft Entra ID tenant ID. Required when type is 'entra-id'."), + clientId: z + .string() + .optional() + .describe( + "Microsoft Entra ID application (client) ID. Required when type is 'entra-id'." + ), + }) + .optional(), + }, + async ({ scope, rulesetPath, auth }) => { + const input = { scope, rulesetPath, auth }; + + if (auth?.type === 'entra-id' && (!auth.tenantId || !auth.clientId)) { + return mcpError( + ERROR_CODES.INVALID_AUTH_CONFIG, + "auth.type 'entra-id' requires tenantId and clientId fields.", + input + ); + } + + const resolvedPath = rulesetPath ?? null; + const resolvedAuth: AuthConfig | null = auth + ? { + type: auth.type, + ...(auth.type === 'github-pat' && auth.githubToken ? { githubToken: auth.githubToken } : {}), + ...(auth.type === 'entra-id' ? { tenantId: auth.tenantId, clientId: auth.clientId } : {}), + } + : null; + + const config: RulesetConfig = { rulesetPath: resolvedPath, auth: resolvedAuth }; + + if (scope === 'session') { + sessionState.defaultRuleset = resolvedPath !== null ? config : null; + if (resolvedPath !== null) { + sessionState.sessionRulesetOverride = null; + } + return { + content: [ + { + type: 'text', + text: JSON.stringify({ + scope, + rulesetPath: resolvedPath, + auth: resolvedAuth ? { type: resolvedAuth.type } : null, + message: + resolvedPath !== null + ? 'Session default ruleset configured. This setting applies for the duration of this server process.' + : 'Session default ruleset cleared.', + }), + }, + ], + }; + } + + const configFile = scope === 'workspace' ? getWorkspaceConfigPath() : getGlobalConfigPath(); + const saveFn = scope === 'workspace' ? saveWorkspaceConfig : saveGlobalConfig; + + try { + await saveFn(config); + } catch (err) { + if (err instanceof ConfigWriteError) { + return mcpError(ERROR_CODES.CONFIG_WRITE_ERROR, err.message, input); + } + return mcpError( + ERROR_CODES.CONFIG_WRITE_ERROR, + `Could not write ${scope} config: ${err instanceof Error ? err.message : String(err)}`, + input + ); + } + + return { + content: [ + { + type: 'text', + text: JSON.stringify({ + scope, + rulesetPath: resolvedPath, + auth: resolvedAuth ? { type: resolvedAuth.type } : null, + configFile, + message: + resolvedPath !== null + ? `${scope.charAt(0).toUpperCase() + scope.slice(1)} default ruleset configured. This setting will apply to all grading requests in this ${scope} unless overridden by a higher-precedence default or a per-request rulesetPath.` + : `${scope.charAt(0).toUpperCase() + scope.slice(1)} default ruleset cleared.`, + }), + }, + ], + }; + } + ); +} diff --git a/packages/api-grade-mcp/src/tools/get-ruleset-config.ts b/packages/api-grade-mcp/src/tools/get-ruleset-config.ts new file mode 100644 index 0000000..74ed642 --- /dev/null +++ b/packages/api-grade-mcp/src/tools/get-ruleset-config.ts @@ -0,0 +1,70 @@ +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { loadWorkspaceConfig, loadGlobalConfig, getWorkspaceConfigPath, getGlobalConfigPath } from '../config/ruleset-config.js'; +import { resolveRuleset } from '../config/resolve-ruleset.js'; +import type { SessionState, AuthConfig } from '../types.js'; + +function sanitizeAuth(auth: AuthConfig | null | undefined, hasToken: boolean): Record | null { + if (!auth) return null; + const tokenSource = hasToken ? 'config-file' : process.env.GITHUB_TOKEN ? 'env-var' : 'none'; + return { type: auth.type, tokenSource }; +} + +export function registerGetRulesetConfigTool(server: McpServer, sessionState: SessionState): void { + server.tool( + 'get-ruleset-config', + 'Return the active ruleset configuration at every scope (session, workspace, global), indicate which scope is currently in effect (the effective ruleset), and show the full resolution chain. Use this to diagnose why a particular ruleset is being applied or to confirm a configure-ruleset call took effect.', + {}, + async () => { + const workspaceConfig = await loadWorkspaceConfig(); + const globalConfig = await loadGlobalConfig(); + + const resolved = resolveRuleset(null, sessionState, workspaceConfig, globalConfig); + + const sessionInfo = sessionState.defaultRuleset?.rulesetPath != null + ? { + rulesetPath: sessionState.defaultRuleset.rulesetPath, + auth: sanitizeAuth( + sessionState.defaultRuleset.auth, + !!(sessionState.defaultRuleset.auth?.githubToken) + ), + } + : null; + + const workspaceInfo = workspaceConfig?.rulesetPath != null + ? { + rulesetPath: workspaceConfig.rulesetPath, + auth: sanitizeAuth(workspaceConfig.auth, false), + configFile: getWorkspaceConfigPath(), + } + : null; + + const globalInfo = globalConfig?.rulesetPath != null + ? { + rulesetPath: globalConfig.rulesetPath, + auth: sanitizeAuth(globalConfig.auth, false), + configFile: getGlobalConfigPath(), + } + : null; + + const effectiveAuth = resolved.auth + ? sanitizeAuth(resolved.auth, !!(resolved.auth.githubToken)) + : null; + + const response = { + effective: { + scope: resolved.scope, + rulesetPath: resolved.rulesetPath, + ...(effectiveAuth ? { auth: effectiveAuth } : {}), + }, + session: sessionInfo, + workspace: workspaceInfo, + global: globalInfo, + builtIn: 'default', + precedenceOrder: ['session', 'workspace', 'global', 'built-in'], + note: 'Per-request rulesetPath (if supplied on a grading call) always takes precedence over all configured defaults.', + }; + + return { content: [{ type: 'text', text: JSON.stringify(response) }] }; + } + ); +} diff --git a/packages/api-grade-mcp/src/tools/grade-detailed.ts b/packages/api-grade-mcp/src/tools/grade-detailed.ts index 4b6fe34..1b658a9 100644 --- a/packages/api-grade-mcp/src/tools/grade-detailed.ts +++ b/packages/api-grade-mcp/src/tools/grade-detailed.ts @@ -1,13 +1,20 @@ -import { statSync } from 'node:fs'; +import { statSync, writeFileSync, unlinkSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildAuthFailureResponse, ERROR_CODES } from '../utils/errors.js'; +import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; +import { resolveRuleset } from '../config/resolve-ruleset.js'; +import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; +import { EntraAuthRequired, acquireEntraToken } from '../auth/entra.js'; +import type { SessionState } from '../types.js'; const LARGE_SPEC_THRESHOLD_BYTES = 500_000; const MAX_DIAGNOSTICS = 100; -export function registerGradeDetailedTool(server: McpServer): void { +export function registerGradeDetailedTool(server: McpServer, sessionState: SessionState): void { server.tool( 'grade-api-detailed', 'Grade an API specification and return the full result including all individual violations, per-category breakdowns, and prioritised recommendations. Use this when you need to analyse specific violations or present detailed findings to the user. Supports OpenAPI (2.x, 3.x) and AsyncAPI (2.x, 3.x).', @@ -21,8 +28,85 @@ export function registerGradeDetailedTool(server: McpServer): void { .string() .optional() .describe('Optional path to a custom Spectral-compatible ruleset file'), + recoveryOption: z + .enum(['retry', 'use-builtin-once', 'use-builtin-session', 'cancel']) + .optional() + .describe( + 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response.' + ), }, - async ({ specPath, rulesetPath }) => { + async ({ specPath, rulesetPath, recoveryOption }) => { + if (recoveryOption === 'cancel') { + return mcpError(ERROR_CODES.REQUEST_CANCELLED, 'Grading request cancelled by user.', { specPath }); + } + + if (recoveryOption === 'use-builtin-session') { + sessionState.sessionRulesetOverride = 'builtin'; + } + + const workspaceConfig = await loadWorkspaceConfig(); + const globalConfig = await loadGlobalConfig(); + const resolved = resolveRuleset(rulesetPath, sessionState, workspaceConfig, globalConfig); + + let effectiveRulesetPath: string | undefined = resolved.rulesetPath ?? undefined; + let tempRulesetFile: string | undefined; + + if (resolved.rulesetPath?.startsWith('http')) { + if (recoveryOption === 'use-builtin-once') { + effectiveRulesetPath = undefined; + } else { + const timeoutMs = recoveryOption === 'retry' ? RETRY_FETCH_TIMEOUT_MS : INITIAL_FETCH_TIMEOUT_MS; + try { + let content: string; + if (resolved.auth?.type === 'github-pat') { + const token = resolved.auth.githubToken ?? process.env.GITHUB_TOKEN ?? ''; + content = await fetchRulesetContent(resolved.rulesetPath, token || undefined, timeoutMs); + } else if (resolved.auth?.type === 'entra-id' && resolved.auth.tenantId && resolved.auth.clientId) { + const token = await acquireEntraToken(resolved.auth.tenantId, resolved.auth.clientId); + content = await fetchRulesetContent(resolved.rulesetPath, token, timeoutMs); + } else { + content = await fetchRulesetContent(resolved.rulesetPath, undefined, timeoutMs); + } + tempRulesetFile = join(tmpdir(), `api-grade-ruleset-${Date.now()}.yaml`); + writeFileSync(tempRulesetFile, content); + effectiveRulesetPath = tempRulesetFile; + } catch (err) { + if (err instanceof EntraAuthRequired) { + return { + content: [{ + type: 'text', + text: JSON.stringify({ + error: ERROR_CODES.ENTRA_AUTH_REQUIRED, + deviceCodeUrl: err.verificationUri, + userCode: err.userCode, + expiresIn: err.expiresIn, + message: `Complete Entra ID sign-in: Visit ${err.verificationUri} and enter code ${err.userCode}`, + }), + }], + isError: true as const, + }; + } + const reason = err instanceof RulesetAuthError ? err.reason : 'network-unreachable'; + return buildAuthFailureResponse( + reason, + resolved.rulesetPath, + resolved.scope, + `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${reason.replace('-', ' ')}.` + ); + } + } + } else if (effectiveRulesetPath) { + try { + statSync(effectiveRulesetPath); + } catch { + return mcpError( + ERROR_CODES.RULESET_NOT_FOUND, + `The ruleset file '${effectiveRulesetPath}' does not exist. Check the path and try again.`, + { rulesetPath: effectiveRulesetPath } + ); + } + } + let largeSpecWarning: string | undefined; try { @@ -31,6 +115,7 @@ export function registerGradeDetailedTool(server: McpServer): void { largeSpecWarning = `Specification exceeds 500KB (${stat.size} bytes); diagnostic results may be truncated`; } } catch { + if (tempRulesetFile) try { unlinkSync(tempRulesetFile); } catch { /* ignore */ } return mcpError( ERROR_CODES.SPEC_NOT_FOUND, `The specification file '${specPath}' does not exist. Check the path and try again.`, @@ -38,21 +123,9 @@ export function registerGradeDetailedTool(server: McpServer): void { ); } - if (rulesetPath) { - try { - statSync(rulesetPath); - } catch { - return mcpError( - ERROR_CODES.RULESET_NOT_FOUND, - `The ruleset file '${rulesetPath}' does not exist. Check the path and try again.`, - { rulesetPath } - ); - } - } - try { const engine = new GradeEngine(); - const result = await engine.grade({ specPath, rulesetPath }); + const result = await engine.grade({ specPath, rulesetPath: effectiveRulesetPath }); let truncated = false; let diagnostics = result.diagnostics; @@ -85,6 +158,8 @@ export function registerGradeDetailedTool(server: McpServer): void { `GradeEngine error: ${message}`, { specPath } ); + } finally { + if (tempRulesetFile) try { unlinkSync(tempRulesetFile); } catch { /* ignore */ } } } ); diff --git a/packages/api-grade-mcp/src/tools/grade.ts b/packages/api-grade-mcp/src/tools/grade.ts index 3e733d6..e54c4e9 100644 --- a/packages/api-grade-mcp/src/tools/grade.ts +++ b/packages/api-grade-mcp/src/tools/grade.ts @@ -1,12 +1,19 @@ -import { statSync } from 'node:fs'; +import { statSync, writeFileSync, unlinkSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildAuthFailureResponse, ERROR_CODES } from '../utils/errors.js'; +import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; +import { resolveRuleset } from '../config/resolve-ruleset.js'; +import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; +import { EntraAuthRequired, acquireEntraToken } from '../auth/entra.js'; +import type { SessionState } from '../types.js'; const LARGE_SPEC_THRESHOLD_BYTES = 500_000; -export function registerGradeTool(server: McpServer): void { +export function registerGradeTool(server: McpServer, sessionState: SessionState): void { server.tool( 'grade-api', 'Grade an API specification file and return quality score, letter grade, and diagnostic summary. Use this for a token-efficient overview without the full violations list. Supports OpenAPI (2.x, 3.x) and AsyncAPI (2.x, 3.x) specifications in YAML or JSON.', @@ -22,8 +29,85 @@ export function registerGradeTool(server: McpServer): void { .describe( 'Optional path to a custom Spectral-compatible ruleset file. If omitted, the default api-grade ruleset is used.' ), + recoveryOption: z + .enum(['retry', 'use-builtin-once', 'use-builtin-session', 'cancel']) + .optional() + .describe( + 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response.' + ), }, - async ({ specPath, rulesetPath }) => { + async ({ specPath, rulesetPath, recoveryOption }) => { + if (recoveryOption === 'cancel') { + return mcpError(ERROR_CODES.REQUEST_CANCELLED, 'Grading request cancelled by user.', { specPath }); + } + + if (recoveryOption === 'use-builtin-session') { + sessionState.sessionRulesetOverride = 'builtin'; + } + + const workspaceConfig = await loadWorkspaceConfig(); + const globalConfig = await loadGlobalConfig(); + const resolved = resolveRuleset(rulesetPath, sessionState, workspaceConfig, globalConfig); + + let effectiveRulesetPath: string | undefined = resolved.rulesetPath ?? undefined; + let tempRulesetFile: string | undefined; + + if (resolved.rulesetPath?.startsWith('http')) { + if (recoveryOption === 'use-builtin-once') { + effectiveRulesetPath = undefined; + } else { + const timeoutMs = recoveryOption === 'retry' ? RETRY_FETCH_TIMEOUT_MS : INITIAL_FETCH_TIMEOUT_MS; + try { + let content: string; + if (resolved.auth?.type === 'github-pat') { + const token = resolved.auth.githubToken ?? process.env.GITHUB_TOKEN ?? ''; + content = await fetchRulesetContent(resolved.rulesetPath, token || undefined, timeoutMs); + } else if (resolved.auth?.type === 'entra-id' && resolved.auth.tenantId && resolved.auth.clientId) { + const token = await acquireEntraToken(resolved.auth.tenantId, resolved.auth.clientId); + content = await fetchRulesetContent(resolved.rulesetPath, token, timeoutMs); + } else { + content = await fetchRulesetContent(resolved.rulesetPath, undefined, timeoutMs); + } + tempRulesetFile = join(tmpdir(), `api-grade-ruleset-${Date.now()}.yaml`); + writeFileSync(tempRulesetFile, content); + effectiveRulesetPath = tempRulesetFile; + } catch (err) { + if (err instanceof EntraAuthRequired) { + return { + content: [{ + type: 'text', + text: JSON.stringify({ + error: ERROR_CODES.ENTRA_AUTH_REQUIRED, + deviceCodeUrl: err.verificationUri, + userCode: err.userCode, + expiresIn: err.expiresIn, + message: `Complete Entra ID sign-in: Visit ${err.verificationUri} and enter code ${err.userCode}`, + }), + }], + isError: true as const, + }; + } + const reason = err instanceof RulesetAuthError ? err.reason : 'network-unreachable'; + return buildAuthFailureResponse( + reason, + resolved.rulesetPath, + resolved.scope, + `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${reason.replace('-', ' ')}.` + ); + } + } + } else if (effectiveRulesetPath) { + try { + statSync(effectiveRulesetPath); + } catch { + return mcpError( + ERROR_CODES.RULESET_NOT_FOUND, + `The ruleset file '${effectiveRulesetPath}' does not exist. Check the path and try again.`, + { rulesetPath: effectiveRulesetPath } + ); + } + } + let largeSpecWarning: string | undefined; try { @@ -32,6 +116,7 @@ export function registerGradeTool(server: McpServer): void { largeSpecWarning = `Specification exceeds 500KB (${stat.size} bytes); diagnostic results may be truncated`; } } catch { + if (tempRulesetFile) try { unlinkSync(tempRulesetFile); } catch { /* ignore */ } return mcpError( ERROR_CODES.SPEC_NOT_FOUND, `The specification file '${specPath}' does not exist. Check the path and try again.`, @@ -39,21 +124,9 @@ export function registerGradeTool(server: McpServer): void { ); } - if (rulesetPath) { - try { - statSync(rulesetPath); - } catch { - return mcpError( - ERROR_CODES.RULESET_NOT_FOUND, - `The ruleset file '${rulesetPath}' does not exist. Check the path and try again.`, - { rulesetPath } - ); - } - } - try { const engine = new GradeEngine(); - const result = await engine.grade({ specPath, rulesetPath }); + const result = await engine.grade({ specPath, rulesetPath: effectiveRulesetPath }); const response: Record = { specPath: result.specPath, @@ -77,6 +150,8 @@ export function registerGradeTool(server: McpServer): void { `GradeEngine error: ${message}`, { specPath } ); + } finally { + if (tempRulesetFile) try { unlinkSync(tempRulesetFile); } catch { /* ignore */ } } } ); diff --git a/packages/api-grade-mcp/src/tools/non-breaking.ts b/packages/api-grade-mcp/src/tools/non-breaking.ts index e0176a3..249cd11 100644 --- a/packages/api-grade-mcp/src/tools/non-breaking.ts +++ b/packages/api-grade-mcp/src/tools/non-breaking.ts @@ -1,13 +1,20 @@ -import { statSync, readFileSync } from 'node:fs'; +import { statSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildAuthFailureResponse, ERROR_CODES } from '../utils/errors.js'; +import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; +import { resolveRuleset } from '../config/resolve-ruleset.js'; +import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; +import { EntraAuthRequired, acquireEntraToken } from '../auth/entra.js'; import { classifyViolation, buildNonBreakingViolation } from '../utils/classify.js'; +import type { SessionState } from '../types.js'; const LARGE_SPEC_THRESHOLD_BYTES = 500_000; -export function registerNonBreakingTool(server: McpServer): void { +export function registerNonBreakingTool(server: McpServer, sessionState: SessionState): void { server.tool( 'get-non-breaking-violations', 'Return a classified, AI-actionable list of non-breaking violations in an API specification. Non-breaking violations are those whose fixes do not alter the API interface contract (paths, methods, required parameters, schema types, or response structures). Use this tool to obtain issues the AI can safely resolve — the AI generates the corrected specification content; the MCP server does not modify files.', @@ -21,8 +28,85 @@ export function registerNonBreakingTool(server: McpServer): void { .string() .optional() .describe('Optional path to a custom Spectral-compatible ruleset file'), + recoveryOption: z + .enum(['retry', 'use-builtin-once', 'use-builtin-session', 'cancel']) + .optional() + .describe( + 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response.' + ), }, - async ({ specPath, rulesetPath }) => { + async ({ specPath, rulesetPath, recoveryOption }) => { + if (recoveryOption === 'cancel') { + return mcpError(ERROR_CODES.REQUEST_CANCELLED, 'Grading request cancelled by user.', { specPath }); + } + + if (recoveryOption === 'use-builtin-session') { + sessionState.sessionRulesetOverride = 'builtin'; + } + + const workspaceConfig = await loadWorkspaceConfig(); + const globalConfig = await loadGlobalConfig(); + const resolved = resolveRuleset(rulesetPath, sessionState, workspaceConfig, globalConfig); + + let effectiveRulesetPath: string | undefined = resolved.rulesetPath ?? undefined; + let tempRulesetFile: string | undefined; + + if (resolved.rulesetPath?.startsWith('http')) { + if (recoveryOption === 'use-builtin-once') { + effectiveRulesetPath = undefined; + } else { + const timeoutMs = recoveryOption === 'retry' ? RETRY_FETCH_TIMEOUT_MS : INITIAL_FETCH_TIMEOUT_MS; + try { + let content: string; + if (resolved.auth?.type === 'github-pat') { + const token = resolved.auth.githubToken ?? process.env.GITHUB_TOKEN ?? ''; + content = await fetchRulesetContent(resolved.rulesetPath, token || undefined, timeoutMs); + } else if (resolved.auth?.type === 'entra-id' && resolved.auth.tenantId && resolved.auth.clientId) { + const token = await acquireEntraToken(resolved.auth.tenantId, resolved.auth.clientId); + content = await fetchRulesetContent(resolved.rulesetPath, token, timeoutMs); + } else { + content = await fetchRulesetContent(resolved.rulesetPath, undefined, timeoutMs); + } + tempRulesetFile = join(tmpdir(), `api-grade-ruleset-${Date.now()}.yaml`); + writeFileSync(tempRulesetFile, content); + effectiveRulesetPath = tempRulesetFile; + } catch (err) { + if (err instanceof EntraAuthRequired) { + return { + content: [{ + type: 'text', + text: JSON.stringify({ + error: ERROR_CODES.ENTRA_AUTH_REQUIRED, + deviceCodeUrl: err.verificationUri, + userCode: err.userCode, + expiresIn: err.expiresIn, + message: `Complete Entra ID sign-in: Visit ${err.verificationUri} and enter code ${err.userCode}`, + }), + }], + isError: true as const, + }; + } + const reason = err instanceof RulesetAuthError ? err.reason : 'network-unreachable'; + return buildAuthFailureResponse( + reason, + resolved.rulesetPath, + resolved.scope, + `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${reason.replace('-', ' ')}.` + ); + } + } + } else if (effectiveRulesetPath) { + try { + statSync(effectiveRulesetPath); + } catch { + return mcpError( + ERROR_CODES.RULESET_NOT_FOUND, + `The ruleset file '${effectiveRulesetPath}' does not exist. Check the path and try again.`, + { rulesetPath: effectiveRulesetPath } + ); + } + } + let largeSpecWarning: string | undefined; let specContent = ''; @@ -33,6 +117,7 @@ export function registerNonBreakingTool(server: McpServer): void { } specContent = readFileSync(specPath, 'utf-8'); } catch { + if (tempRulesetFile) try { unlinkSync(tempRulesetFile); } catch { /* ignore */ } return mcpError( ERROR_CODES.SPEC_NOT_FOUND, `The specification file '${specPath}' does not exist. Check the path and try again.`, @@ -40,21 +125,9 @@ export function registerNonBreakingTool(server: McpServer): void { ); } - if (rulesetPath) { - try { - statSync(rulesetPath); - } catch { - return mcpError( - ERROR_CODES.RULESET_NOT_FOUND, - `The ruleset file '${rulesetPath}' does not exist. Check the path and try again.`, - { rulesetPath } - ); - } - } - try { const engine = new GradeEngine(); - const result = await engine.grade({ specPath, rulesetPath }); + const result = await engine.grade({ specPath, rulesetPath: effectiveRulesetPath }); const nonBreakingViolations = result.diagnostics .filter((d) => classifyViolation(d) === 'nonBreaking') @@ -80,6 +153,8 @@ export function registerNonBreakingTool(server: McpServer): void { `GradeEngine error: ${message}`, { specPath } ); + } finally { + if (tempRulesetFile) try { unlinkSync(tempRulesetFile); } catch { /* ignore */ } } } ); diff --git a/packages/api-grade-mcp/src/types.ts b/packages/api-grade-mcp/src/types.ts new file mode 100644 index 0000000..c69cac4 --- /dev/null +++ b/packages/api-grade-mcp/src/types.ts @@ -0,0 +1,32 @@ +export interface AuthConfig { + type: 'github-pat' | 'entra-id'; + githubToken?: string; + tenantId?: string; + clientId?: string; +} + +export interface RulesetConfig { + rulesetPath: string | null; + auth: AuthConfig | null; +} + +export type RulesetScope = 'per-request' | 'session' | 'workspace' | 'global' | 'built-in'; + +export interface RulesetResolution { + rulesetPath: string | null; + scope: RulesetScope; + auth: AuthConfig | null; +} + +export interface SessionState { + defaultRuleset: RulesetConfig | null; + sessionRulesetOverride: 'builtin' | null; +} + +export type RecoveryOptionId = 'retry' | 'use-builtin-once' | 'use-builtin-session' | 'cancel'; + +export interface RecoveryOption { + id: RecoveryOptionId; + label: string; + description: string; +} diff --git a/packages/api-grade-mcp/src/utils/errors.ts b/packages/api-grade-mcp/src/utils/errors.ts index 557d7cb..42beeb6 100644 --- a/packages/api-grade-mcp/src/utils/errors.ts +++ b/packages/api-grade-mcp/src/utils/errors.ts @@ -4,6 +4,11 @@ export const ERROR_CODES = { RULESET_NOT_FOUND: 'RULESET_NOT_FOUND', INVALID_GRADE: 'INVALID_GRADE', GRADE_ENGINE_ERROR: 'GRADE_ENGINE_ERROR', + RULESET_AUTH_FAILED: 'RULESET_AUTH_FAILED', + ENTRA_AUTH_REQUIRED: 'ENTRA_AUTH_REQUIRED', + INVALID_AUTH_CONFIG: 'INVALID_AUTH_CONFIG', + CONFIG_WRITE_ERROR: 'CONFIG_WRITE_ERROR', + REQUEST_CANCELLED: 'REQUEST_CANCELLED', } as const; export type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES]; @@ -25,3 +30,46 @@ export function mcpError( isError: true, }; } + +const RECOVERY_OPTIONS = [ + { + id: 'retry', + label: 'Retry', + description: 'Attempt to fetch the ruleset again (re-run this grading request using the configured default).', + }, + { + id: 'use-builtin-once', + label: 'Use built-in default for this request', + description: 'Grade using the built-in api-grade ruleset for this one request only. The configured default remains active for future requests.', + }, + { + id: 'use-builtin-session', + label: 'Use built-in default for this session', + description: 'Grade using the built-in api-grade ruleset for all remaining requests this session. The configured default is not changed.', + }, + { + id: 'cancel', + label: 'Cancel', + description: 'Cancel this grading request without returning a result.', + }, +] as const; + +export function buildAuthFailureResponse( + failureReason: string, + rulesetUrl: string, + scope: string, + message: string +): { content: [{ type: 'text'; text: string }]; isError: true } { + const body = { + error: ERROR_CODES.RULESET_AUTH_FAILED, + failureReason, + rulesetUrl, + scope, + message, + recoveryOptions: RECOVERY_OPTIONS, + }; + return { + content: [{ type: 'text', text: JSON.stringify(body) }], + isError: true, + }; +} diff --git a/packages/api-grade-mcp/tests/integration/assert-grade.test.ts b/packages/api-grade-mcp/tests/integration/assert-grade.test.ts index 526e34f..08791a2 100644 --- a/packages/api-grade-mcp/tests/integration/assert-grade.test.ts +++ b/packages/api-grade-mcp/tests/integration/assert-grade.test.ts @@ -50,6 +50,18 @@ describe('assert-api-grade tool', () => { expect(body.message).toContain('X'); }); + it('returns RULESET_NOT_FOUND for non-existent local ruleset', async () => { + const server = createServer(); + const result = await callTool(server, 'assert-api-grade', { + specPath: OPENAPI_MUSEUM, + minimumGrade: 'F', + rulesetPath: '/nonexistent/ruleset.yaml', + }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('RULESET_NOT_FOUND'); + }); + it('returns SPEC_NOT_FOUND error for non-existent spec', async () => { const server = createServer(); const result = await callTool(server, 'assert-api-grade', { specPath: '/no/such/file.yaml', minimumGrade: 'C' }); diff --git a/packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts b/packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts new file mode 100644 index 0000000..f264aa5 --- /dev/null +++ b/packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts @@ -0,0 +1,96 @@ +import { describe, it, expect, afterEach } from 'vitest'; +import { rm } from 'node:fs/promises'; +import { writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { createServer } from '../../src/server.js'; +import { getWorkspaceConfigPath } from '../../src/config/ruleset-config.js'; + +type ToolRegistry = Record, extra: unknown) => Promise }>; + +async function callTool(server: ReturnType, toolName: string, args: Record) { + const tools = (server as unknown as { _registeredTools: ToolRegistry })._registeredTools; + const tool = tools[toolName]; + if (!tool) throw new Error(`${toolName} tool not registered`); + return tool.handler(args, {}) as Promise<{ content: [{ type: string; text: string }]; isError?: boolean }>; +} + +const API_GRADE_DIR = join(process.cwd(), '.api-grade'); + +afterEach(async () => { + try { await rm(API_GRADE_DIR, { recursive: true, force: true }); } catch { /* ok */ } +}); + +describe('configure-ruleset tool', () => { + it('scope: "session" stores in SessionState (visible via get-ruleset-config)', async () => { + const server = createServer(); + const result = await callTool(server, 'configure-ruleset', { + scope: 'session', + rulesetPath: 'https://example.com/ruleset.yaml', + }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body.scope).toBe('session'); + expect(body.rulesetPath).toBe('https://example.com/ruleset.yaml'); + + // Verify via get-ruleset-config + const configResult = await callTool(server, 'get-ruleset-config', {}); + const config = JSON.parse(configResult.content[0].text); + expect(config.session?.rulesetPath).toBe('https://example.com/ruleset.yaml'); + expect(config.effective.scope).toBe('session'); + }); + + it('scope: "workspace" writes .api-grade/config.json', async () => { + const server = createServer(); + const result = await callTool(server, 'configure-ruleset', { + scope: 'workspace', + rulesetPath: 'https://example.com/workspace-ruleset.yaml', + }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body.scope).toBe('workspace'); + expect(body.configFile).toBe(getWorkspaceConfigPath()); + }); + + it('rulesetPath: null clears the session scope', async () => { + const server = createServer(); + await callTool(server, 'configure-ruleset', { + scope: 'session', + rulesetPath: 'https://example.com/ruleset.yaml', + }); + const clearResult = await callTool(server, 'configure-ruleset', { + scope: 'session', + rulesetPath: null, + }); + expect(clearResult.isError).toBeFalsy(); + + const configResult = await callTool(server, 'get-ruleset-config', {}); + const config = JSON.parse(configResult.content[0].text); + expect(config.session).toBeNull(); + }); + + it('auth.type: "entra-id" without tenantId/clientId → INVALID_AUTH_CONFIG', async () => { + const server = createServer(); + const result = await callTool(server, 'configure-ruleset', { + scope: 'global', + rulesetPath: 'https://example.com/ruleset.yaml', + auth: { type: 'entra-id' }, + }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('INVALID_AUTH_CONFIG'); + }); + + it('unwritable workspace path → CONFIG_WRITE_ERROR', async () => { + const server = createServer(); + // Remove any pre-existing .api-grade dir/file, then create a file to block directory creation + await rm(API_GRADE_DIR, { recursive: true, force: true }).catch(() => {}); + writeFileSync(API_GRADE_DIR, 'blocking', 'utf-8'); + const result = await callTool(server, 'configure-ruleset', { + scope: 'workspace', + rulesetPath: 'https://example.com/ruleset.yaml', + }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('CONFIG_WRITE_ERROR'); + }); +}); diff --git a/packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts b/packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts new file mode 100644 index 0000000..79d8746 --- /dev/null +++ b/packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts @@ -0,0 +1,86 @@ +import { describe, it, expect, afterEach } from 'vitest'; +import { rm } from 'node:fs/promises'; +import { join } from 'node:path'; +import { createServer } from '../../src/server.js'; + +type ToolRegistry = Record, extra: unknown) => Promise }>; + +async function callTool(server: ReturnType, toolName: string, args: Record) { + const tools = (server as unknown as { _registeredTools: ToolRegistry })._registeredTools; + const tool = tools[toolName]; + if (!tool) throw new Error(`${toolName} tool not registered`); + return tool.handler(args, {}) as Promise<{ content: [{ type: string; text: string }]; isError?: boolean }>; +} + +afterEach(async () => { + try { await rm(join(process.cwd(), '.api-grade'), { recursive: true, force: true }); } catch { /* ok */ } +}); + +describe('get-ruleset-config tool', () => { + it('no defaults configured → all scopes null, effective is built-in', async () => { + const server = createServer(); + const result = await callTool(server, 'get-ruleset-config', {}); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body.session).toBeNull(); + expect(body.workspace).toBeNull(); + expect(body.global).toBeNull(); + expect(body.effective.scope).toBe('built-in'); + expect(body.builtIn).toBe('default'); + expect(body.precedenceOrder).toEqual(['session', 'workspace', 'global', 'built-in']); + }); + + it('session only → effective is session', async () => { + const server = createServer(); + await callTool(server, 'configure-ruleset', { + scope: 'session', + rulesetPath: 'https://session.example.com/ruleset.yaml', + }); + const result = await callTool(server, 'get-ruleset-config', {}); + const body = JSON.parse(result.content[0].text); + expect(body.session?.rulesetPath).toBe('https://session.example.com/ruleset.yaml'); + expect(body.effective.scope).toBe('session'); + }); + + it('workspace only → effective is workspace', async () => { + const server = createServer(); + await callTool(server, 'configure-ruleset', { + scope: 'workspace', + rulesetPath: 'https://workspace.example.com/ruleset.yaml', + }); + const result = await callTool(server, 'get-ruleset-config', {}); + const body = JSON.parse(result.content[0].text); + expect(body.workspace?.rulesetPath).toBe('https://workspace.example.com/ruleset.yaml'); + expect(body.effective.scope).toBe('workspace'); + }); + + it('session + workspace → effective is session (precedence)', async () => { + const server = createServer(); + await callTool(server, 'configure-ruleset', { + scope: 'workspace', + rulesetPath: 'https://workspace.example.com/ruleset.yaml', + }); + await callTool(server, 'configure-ruleset', { + scope: 'session', + rulesetPath: 'https://session.example.com/ruleset.yaml', + }); + const result = await callTool(server, 'get-ruleset-config', {}); + const body = JSON.parse(result.content[0].text); + expect(body.effective.scope).toBe('session'); + }); + + it('response never includes raw token values', async () => { + const server = createServer(); + await callTool(server, 'configure-ruleset', { + scope: 'session', + rulesetPath: 'https://example.com/ruleset.yaml', + auth: { type: 'github-pat', githubToken: 'secret-token-123' }, + }); + const result = await callTool(server, 'get-ruleset-config', {}); + const text = result.content[0].text; + expect(text).not.toContain('secret-token-123'); + const body = JSON.parse(text); + expect(body.session?.auth?.githubToken).toBeUndefined(); + expect(body.session?.auth?.tokenSource).toBeDefined(); + }); +}); diff --git a/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts b/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts index 84e24e0..aa86835 100644 --- a/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts +++ b/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts @@ -40,6 +40,17 @@ describe('grade-api-detailed tool', () => { } }); + it('returns RULESET_NOT_FOUND for non-existent local ruleset', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api-detailed', { + specPath: OPENAPI_POOR, + rulesetPath: '/nonexistent/ruleset.yaml', + }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('RULESET_NOT_FOUND'); + }); + it('returns SPEC_NOT_FOUND for non-existent spec', async () => { const server = createServer(); const result = await callTool(server, 'grade-api-detailed', { specPath: '/no/such/spec.yaml' }); diff --git a/packages/api-grade-mcp/tests/integration/grade.test.ts b/packages/api-grade-mcp/tests/integration/grade.test.ts index b07f55e..9851011 100644 --- a/packages/api-grade-mcp/tests/integration/grade.test.ts +++ b/packages/api-grade-mcp/tests/integration/grade.test.ts @@ -51,6 +51,17 @@ describe('grade-api tool', () => { expect(body.message).toContain('/does/not/exist.yaml'); }); + it('returns RULESET_NOT_FOUND for non-existent local ruleset', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api', { + specPath: OPENAPI_FIXTURE, + rulesetPath: '/nonexistent/ruleset.yaml', + }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('RULESET_NOT_FOUND'); + }); + it('returns largeSpecWarning for spec over 500KB', async () => { const tmp = resolve(tmpdir(), `large-spec-${Date.now()}.yaml`); const bigContent = 'openapi: "3.0.0"\ninfo:\n title: Big\n version: "1.0"\npaths: {}\n' + ' '.repeat(500_001); diff --git a/packages/api-grade-mcp/tests/integration/non-breaking.test.ts b/packages/api-grade-mcp/tests/integration/non-breaking.test.ts index 0a6c985..b99d4d2 100644 --- a/packages/api-grade-mcp/tests/integration/non-breaking.test.ts +++ b/packages/api-grade-mcp/tests/integration/non-breaking.test.ts @@ -67,6 +67,17 @@ describe('get-non-breaking-violations tool', () => { expect(body.nonBreakingCount).toBe(body.nonBreakingViolations.length); }); + it('returns RULESET_NOT_FOUND for non-existent local ruleset', async () => { + const server = createServer(); + const result = await callTool(server, 'get-non-breaking-violations', { + specPath: OPENAPI_POOR, + rulesetPath: '/nonexistent/ruleset.yaml', + }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('RULESET_NOT_FOUND'); + }); + it('returns SPEC_NOT_FOUND for non-existent spec', async () => { const server = createServer(); const result = await callTool(server, 'get-non-breaking-violations', { specPath: '/no/such/file.yaml' }); diff --git a/packages/api-grade-mcp/tests/unit/errors.test.ts b/packages/api-grade-mcp/tests/unit/errors.test.ts new file mode 100644 index 0000000..6d36df5 --- /dev/null +++ b/packages/api-grade-mcp/tests/unit/errors.test.ts @@ -0,0 +1,27 @@ +import { describe, it, expect } from 'vitest'; +import { buildAuthFailureResponse, ERROR_CODES } from '../../src/utils/errors.js'; + +describe('buildAuthFailureResponse', () => { + it('returns isError:true with RULESET_AUTH_FAILED and four recovery options', () => { + const result = buildAuthFailureResponse( + 'auth-failed', + 'https://example.com/ruleset.yaml', + 'workspace', + 'Could not fetch ruleset' + ); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe(ERROR_CODES.RULESET_AUTH_FAILED); + expect(body.failureReason).toBe('auth-failed'); + expect(body.rulesetUrl).toBe('https://example.com/ruleset.yaml'); + expect(body.scope).toBe('workspace'); + expect(body.message).toBe('Could not fetch ruleset'); + expect(Array.isArray(body.recoveryOptions)).toBe(true); + expect(body.recoveryOptions).toHaveLength(4); + const ids = body.recoveryOptions.map((o: { id: string }) => o.id); + expect(ids).toContain('retry'); + expect(ids).toContain('use-builtin-once'); + expect(ids).toContain('use-builtin-session'); + expect(ids).toContain('cancel'); + }); +}); diff --git a/packages/api-grade-mcp/tests/unit/github.test.ts b/packages/api-grade-mcp/tests/unit/github.test.ts new file mode 100644 index 0000000..b882b13 --- /dev/null +++ b/packages/api-grade-mcp/tests/unit/github.test.ts @@ -0,0 +1,97 @@ +import { describe, it, expect, vi, afterEach } from 'vitest'; +import { + fetchRulesetContent, + fetchRulesetWithGithubPat, + RulesetAuthError, + INITIAL_FETCH_TIMEOUT_MS, + RETRY_FETCH_TIMEOUT_MS, +} from '../../src/auth/github.js'; + +afterEach(() => { + vi.unstubAllGlobals(); +}); + +describe('INITIAL_FETCH_TIMEOUT_MS / RETRY_FETCH_TIMEOUT_MS', () => { + it('exports correct timeout constants', () => { + expect(INITIAL_FETCH_TIMEOUT_MS).toBe(5_000); + expect(RETRY_FETCH_TIMEOUT_MS).toBe(30_000); + }); +}); + +describe('RulesetAuthError', () => { + it('stores reason and url', () => { + const err = new RulesetAuthError('auth-failed', 'https://example.com/r.yaml'); + expect(err.reason).toBe('auth-failed'); + expect(err.url).toBe('https://example.com/r.yaml'); + expect(err).toBeInstanceOf(Error); + expect(err.name).toBe('RulesetAuthError'); + }); +}); + +describe('fetchRulesetContent', () => { + it('returns text content on 200 OK', async () => { + vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ + ok: true, + status: 200, + text: () => Promise.resolve('ruleset: content'), + })); + const result = await fetchRulesetContent('https://example.com/r.yaml', undefined, 5000); + expect(result).toBe('ruleset: content'); + }); + + it('sends Authorization header when token provided', async () => { + const mockFetch = vi.fn().mockResolvedValueOnce({ + ok: true, + status: 200, + text: () => Promise.resolve('content'), + }); + vi.stubGlobal('fetch', mockFetch); + await fetchRulesetContent('https://example.com/r.yaml', 'my-token', 5000); + const [, options] = mockFetch.mock.calls[0]; + expect(options.headers['Authorization']).toBe('Bearer my-token'); + }); + + it('throws RulesetAuthError("auth-failed") on 401', async () => { + vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ ok: false, status: 401 })); + await expect(fetchRulesetContent('https://example.com/r.yaml', 'bad', 5000)) + .rejects.toMatchObject({ reason: 'auth-failed' }); + }); + + it('throws RulesetAuthError("auth-failed") on 403', async () => { + vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ ok: false, status: 403 })); + await expect(fetchRulesetContent('https://example.com/r.yaml', 'bad', 5000)) + .rejects.toMatchObject({ reason: 'auth-failed' }); + }); + + it('throws RulesetAuthError("network-unreachable") on non-401/403 failure', async () => { + vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ ok: false, status: 500 })); + await expect(fetchRulesetContent('https://example.com/r.yaml', undefined, 5000)) + .rejects.toMatchObject({ reason: 'network-unreachable' }); + }); + + it('throws RulesetAuthError("network-unreachable") on AbortError (timeout)', async () => { + const abortError = new Error('The operation was aborted'); + abortError.name = 'AbortError'; + vi.stubGlobal('fetch', vi.fn().mockRejectedValueOnce(abortError)); + await expect(fetchRulesetContent('https://example.com/r.yaml', undefined, 5000)) + .rejects.toMatchObject({ reason: 'network-unreachable' }); + }); + + it('throws RulesetAuthError("network-unreachable") on other network errors', async () => { + vi.stubGlobal('fetch', vi.fn().mockRejectedValueOnce(new Error('ECONNREFUSED'))); + await expect(fetchRulesetContent('https://example.com/r.yaml', undefined, 5000)) + .rejects.toBeInstanceOf(RulesetAuthError); + }); +}); + +describe('fetchRulesetWithGithubPat', () => { + it('delegates to fetchRulesetContent with token', async () => { + vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ + ok: true, + status: 200, + text: () => Promise.resolve('pat-content'), + })); + const result = await fetchRulesetWithGithubPat('https://example.com/r.yaml', 'pat-token', 5000); + expect(result).toBe('pat-content'); + }); +}); diff --git a/packages/api-grade-mcp/tests/unit/resolve-ruleset.test.ts b/packages/api-grade-mcp/tests/unit/resolve-ruleset.test.ts new file mode 100644 index 0000000..fa3f1e9 --- /dev/null +++ b/packages/api-grade-mcp/tests/unit/resolve-ruleset.test.ts @@ -0,0 +1,70 @@ +import { describe, it, expect } from 'vitest'; +import { resolveRuleset } from '../../src/config/resolve-ruleset.js'; +import type { SessionState, RulesetConfig } from '../../src/types.js'; + +const EMPTY_SESSION: SessionState = { defaultRuleset: null, sessionRulesetOverride: null }; + +const WORKSPACE_CONFIG: RulesetConfig = { + rulesetPath: 'https://workspace.example.com/ruleset.yaml', + auth: { type: 'github-pat' }, +}; + +const GLOBAL_CONFIG: RulesetConfig = { + rulesetPath: 'https://global.example.com/ruleset.yaml', + auth: null, +}; + +const SESSION_RULESET: RulesetConfig = { + rulesetPath: 'https://session.example.com/ruleset.yaml', + auth: null, +}; + +describe('resolveRuleset() - precedence chain', () => { + it('per-request path wins over all other scopes', () => { + const session: SessionState = { defaultRuleset: SESSION_RULESET, sessionRulesetOverride: null }; + const result = resolveRuleset('/per-request/ruleset.yaml', session, WORKSPACE_CONFIG, GLOBAL_CONFIG); + expect(result.scope).toBe('per-request'); + expect(result.rulesetPath).toBe('/per-request/ruleset.yaml'); + expect(result.auth).toBeNull(); + }); + + it('sessionRulesetOverride: "builtin" short-circuits to built-in immediately', () => { + const session: SessionState = { defaultRuleset: SESSION_RULESET, sessionRulesetOverride: 'builtin' }; + const result = resolveRuleset(null, session, WORKSPACE_CONFIG, GLOBAL_CONFIG); + expect(result.scope).toBe('built-in'); + expect(result.rulesetPath).toBeNull(); + }); + + it('session default wins over workspace and global', () => { + const session: SessionState = { defaultRuleset: SESSION_RULESET, sessionRulesetOverride: null }; + const result = resolveRuleset(null, session, WORKSPACE_CONFIG, GLOBAL_CONFIG); + expect(result.scope).toBe('session'); + expect(result.rulesetPath).toBe(SESSION_RULESET.rulesetPath); + }); + + it('workspace wins over global when no session default', () => { + const result = resolveRuleset(null, EMPTY_SESSION, WORKSPACE_CONFIG, GLOBAL_CONFIG); + expect(result.scope).toBe('workspace'); + expect(result.rulesetPath).toBe(WORKSPACE_CONFIG.rulesetPath); + expect(result.auth).toEqual(WORKSPACE_CONFIG.auth); + }); + + it('global wins over built-in when no session or workspace default', () => { + const result = resolveRuleset(null, EMPTY_SESSION, null, GLOBAL_CONFIG); + expect(result.scope).toBe('global'); + expect(result.rulesetPath).toBe(GLOBAL_CONFIG.rulesetPath); + }); + + it('all null → built-in', () => { + const result = resolveRuleset(null, EMPTY_SESSION, null, null); + expect(result.scope).toBe('built-in'); + expect(result.rulesetPath).toBeNull(); + expect(result.auth).toBeNull(); + }); + + it('undefined per-request path does not win over session default', () => { + const session: SessionState = { defaultRuleset: SESSION_RULESET, sessionRulesetOverride: null }; + const result = resolveRuleset(undefined, session, null, null); + expect(result.scope).toBe('session'); + }); +}); diff --git a/packages/api-grade-mcp/tests/unit/ruleset-config.test.ts b/packages/api-grade-mcp/tests/unit/ruleset-config.test.ts new file mode 100644 index 0000000..31fb1ff --- /dev/null +++ b/packages/api-grade-mcp/tests/unit/ruleset-config.test.ts @@ -0,0 +1,87 @@ +import { describe, it, expect, afterEach, vi } from 'vitest'; +import { readFile, rm } from 'node:fs/promises'; +import { + loadWorkspaceConfig, + loadGlobalConfig, + saveWorkspaceConfig, + saveGlobalConfig, + getWorkspaceConfigPath, + getGlobalConfigPath, + ConfigWriteError, +} from '../../src/config/ruleset-config.js'; +import type { RulesetConfig } from '../../src/types.js'; + +const workspacePath = getWorkspaceConfigPath(); +const globalPath = getGlobalConfigPath(); + +const TEST_CONFIG: RulesetConfig = { + rulesetPath: 'https://example.com/ruleset.yaml', + auth: { type: 'github-pat' }, +}; + +afterEach(async () => { + try { await rm(workspacePath); } catch { /* not created */ } +}); + +describe('loadWorkspaceConfig()', () => { + it('returns null when no config file exists', async () => { + try { await rm(workspacePath); } catch { /* ok */ } + const result = await loadWorkspaceConfig(); + expect(result).toBeNull(); + }); + + it('returns the stored config after a write', async () => { + await saveWorkspaceConfig(TEST_CONFIG); + const result = await loadWorkspaceConfig(); + expect(result).toEqual(TEST_CONFIG); + }); +}); + +describe('loadGlobalConfig()', () => { + let savedContent: string | null = null; + + afterEach(async () => { + if (savedContent !== null) { + const { writeFile } = await import('node:fs/promises'); + await writeFile(globalPath, savedContent, 'utf-8'); + savedContent = null; + } else { + try { await rm(globalPath); } catch { /* not created */ } + } + }); + + it('returns null when no global config file exists', async () => { + try { + savedContent = await readFile(globalPath, 'utf-8'); + await rm(globalPath); + } catch { /* file doesn't exist, savedContent stays null */ } + const result = await loadGlobalConfig(); + expect(result).toBeNull(); + }); + + it('returns the stored config after a write', async () => { + try { savedContent = await readFile(globalPath, 'utf-8'); } catch { /* ok */ } + await saveGlobalConfig(TEST_CONFIG); + const result = await loadGlobalConfig(); + expect(result).toEqual(TEST_CONFIG); + }); +}); + +describe('saveWorkspaceConfig()', () => { + it('creates parent directories and writes config', async () => { + await saveWorkspaceConfig(TEST_CONFIG); + const raw = await readFile(workspacePath, 'utf-8'); + expect(JSON.parse(raw)).toEqual(TEST_CONFIG); + }); +}); + +describe('ConfigWriteError', () => { + it('is thrown when the write path is invalid', async () => { + vi.spyOn(process, 'cwd').mockReturnValue('/dev/null'); + try { + await expect(saveWorkspaceConfig({ rulesetPath: null, auth: null })).rejects.toBeInstanceOf(ConfigWriteError); + } finally { + vi.restoreAllMocks(); + } + }); +}); diff --git a/packages/api-grade-mcp/vitest.config.ts b/packages/api-grade-mcp/vitest.config.ts index e634b42..a1bfde9 100644 --- a/packages/api-grade-mcp/vitest.config.ts +++ b/packages/api-grade-mcp/vitest.config.ts @@ -5,9 +5,20 @@ export default defineConfig({ include: ['tests/**/*.test.ts'], globals: false, environment: 'node', + pool: 'forks', + poolOptions: { + forks: { + maxForks: 1, + minForks: 1, + }, + }, coverage: { provider: 'v8', include: ['src/**/*.ts'], + exclude: [ + 'src/index.ts', + 'src/auth/entra.ts', + ], thresholds: { lines: 80, }, diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index 9f4c068..8d37820 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -20,10 +20,10 @@ **Purpose**: Create the `packages/api-grade-mcp` package and wire it into the monorepo workspace. -- [ ] T001 Create directory structure `packages/api-grade-mcp/src/tools/`, `src/config/`, `src/auth/`, `src/utils/`, `tests/unit/`, `tests/integration/` per plan.md Project Structure -- [ ] T002 Create `packages/api-grade-mcp/package.json` with name `@dawmatt/api-grade-mcp`, type `module`, bin `api-grade-mcp → ./dist/index.js`, exports pointing to `./dist/server.js`, dependencies: `@dawmatt/api-grade-core: "*"`, `@modelcontextprotocol/sdk: "^1.0.0"`, `zod: "^3.22.0"`, devDependencies: `@azure/msal-node`, `vitest`, `@vitest/coverage-v8`, scripts: `build`, `typecheck`, `lint`, `test`, `test:coverage` -- [ ] T003 [P] Create `packages/api-grade-mcp/tsconfig.json` following the pattern of existing packages (`packages/api-grade-core/tsconfig.json`), targeting ESM with `NodeNext` module resolution -- [ ] T004 Update root `package.json` workspaces array to include `packages/api-grade-mcp`; update CI quality gate script in `package.json` (or relevant CI config) to run `yarn workspace api-grade-mcp run test:coverage` +- [X] T001 Create directory structure `packages/api-grade-mcp/src/tools/`, `src/config/`, `src/auth/`, `src/utils/`, `tests/unit/`, `tests/integration/` per plan.md Project Structure +- [X] T002 Create `packages/api-grade-mcp/package.json` with name `@dawmatt/api-grade-mcp`, type `module`, bin `api-grade-mcp → ./dist/index.js`, exports pointing to `./dist/server.js`, dependencies: `@dawmatt/api-grade-core: "*"`, `@modelcontextprotocol/sdk: "^1.0.0"`, `zod: "^3.22.0"`, devDependencies: `@azure/msal-node`, `vitest`, `@vitest/coverage-v8`, scripts: `build`, `typecheck`, `lint`, `test`, `test:coverage` +- [X] T003 [P] Create `packages/api-grade-mcp/tsconfig.json` following the pattern of existing packages (`packages/api-grade-core/tsconfig.json`), targeting ESM with `NodeNext` module resolution +- [X] T004 Update root `package.json` workspaces array to include `packages/api-grade-mcp`; update CI quality gate script in `package.json` (or relevant CI config) to run `yarn workspace api-grade-mcp run test:coverage` --- @@ -33,10 +33,10 @@ **⚠️ CRITICAL**: No user story work can begin until this phase is complete. -- [ ] T005 Create `packages/api-grade-mcp/src/utils/errors.ts` exporting all error code constants (`SPEC_NOT_FOUND`, `SPEC_PARSE_ERROR`, `RULESET_NOT_FOUND`, `INVALID_GRADE`, `GRADE_ENGINE_ERROR`, `RULESET_AUTH_FAILED`, `ENTRA_AUTH_REQUIRED`, `INVALID_AUTH_CONFIG`, `CONFIG_WRITE_ERROR`, `REQUEST_CANCELLED`) and a `buildErrorResponse(code, message, input)` helper that returns `{ content: [{ type: "text", text: JSON.stringify(...) }], isError: true }` -- [ ] T006 [P] Create `packages/api-grade-mcp/src/utils/classify.ts` implementing the non-breaking violation classifier from research.md: rule ID override list checked first, then breaking path patterns, then non-breaking path patterns, returning `"breaking" | "nonBreaking" | "unknown"` per violation; export `LARGE_SPEC_THRESHOLD_BYTES = 500_000` -- [ ] T007 Create `packages/api-grade-mcp/src/server.ts` exporting `createServer(): McpServer` factory; define `SessionState` interface (`defaultRuleset: RulesetConfig | null`, `sessionRulesetOverride: "builtin" | null`); initialise `sessionState` and call each `registerXxxTool(server, sessionState)` stub (stubs initially no-ops, replaced per story) -- [ ] T008 Create `packages/api-grade-mcp/src/index.ts` stdio entry point: calls `createServer()`, creates `StdioServerTransport`, and calls `await server.connect(transport)` following the pattern from research.md +- [X] T005 Create `packages/api-grade-mcp/src/utils/errors.ts` exporting all error code constants (`SPEC_NOT_FOUND`, `SPEC_PARSE_ERROR`, `RULESET_NOT_FOUND`, `INVALID_GRADE`, `GRADE_ENGINE_ERROR`, `RULESET_AUTH_FAILED`, `ENTRA_AUTH_REQUIRED`, `INVALID_AUTH_CONFIG`, `CONFIG_WRITE_ERROR`, `REQUEST_CANCELLED`) and a `buildErrorResponse(code, message, input)` helper that returns `{ content: [{ type: "text", text: JSON.stringify(...) }], isError: true }` +- [X] T006 [P] Create `packages/api-grade-mcp/src/utils/classify.ts` implementing the non-breaking violation classifier from research.md: rule ID override list checked first, then breaking path patterns, then non-breaking path patterns, returning `"breaking" | "nonBreaking" | "unknown"` per violation; export `LARGE_SPEC_THRESHOLD_BYTES = 500_000` +- [X] T007 Create `packages/api-grade-mcp/src/server.ts` exporting `createServer(): McpServer` factory; define `SessionState` interface (`defaultRuleset: RulesetConfig | null`, `sessionRulesetOverride: "builtin" | null`); initialise `sessionState` and call each `registerXxxTool(server, sessionState)` stub (stubs initially no-ops, replaced per story) +- [X] T008 Create `packages/api-grade-mcp/src/index.ts` stdio entry point: calls `createServer()`, creates `StdioServerTransport`, and calls `await server.connect(transport)` following the pattern from research.md **Checkpoint**: Package scaffolding complete — user story implementation can now begin. @@ -52,13 +52,13 @@ > **Write these tests FIRST and confirm they fail before implementing T011.** -- [ ] T009 [P] [US1] Create `packages/api-grade-mcp/tests/unit/classify.test.ts` unit tests for the non-breaking classifier: assert each breaking path pattern returns `"breaking"`, each non-breaking pattern returns `"nonBreaking"`, each rule ID override is respected before path inspection, and ambiguous paths return `"unknown"` -- [ ] T010 [P] [US1] Create `packages/api-grade-mcp/tests/integration/grade.test.ts` integration tests for `grade-api`: valid OpenAPI file → full `GradeSummaryResponse` shape; valid AsyncAPI file → equivalent shape; non-existent file → `SPEC_NOT_FOUND` error with `isError: true`; file > 500KB → `GradeSummaryResponse` with `largeSpecWarning` field present +- [X] T009 [P] [US1] Create `packages/api-grade-mcp/tests/unit/classify.test.ts` unit tests for the non-breaking classifier: assert each breaking path pattern returns `"breaking"`, each non-breaking pattern returns `"nonBreaking"`, each rule ID override is respected before path inspection, and ambiguous paths return `"unknown"` +- [X] T010 [P] [US1] Create `packages/api-grade-mcp/tests/integration/grade.test.ts` integration tests for `grade-api`: valid OpenAPI file → full `GradeSummaryResponse` shape; valid AsyncAPI file → equivalent shape; non-existent file → `SPEC_NOT_FOUND` error with `isError: true`; file > 500KB → `GradeSummaryResponse` with `largeSpecWarning` field present ### Implementation for User Story 1 -- [ ] T011 [US1] Implement `packages/api-grade-mcp/src/tools/grade.ts` exporting `registerGradeTool(server, sessionState)`: registers `grade-api` with Zod schema (`specPath` required, `rulesetPath` optional); checks file existence before calling `GradeEngine.grade()`; projects `GradeSummaryResponse` (omitting `diagnostics[]`); reads file size to detect large spec and appends `largeSpecWarning`; returns structured errors for `SPEC_NOT_FOUND`, `SPEC_PARSE_ERROR`, `RULESET_NOT_FOUND`, `GRADE_ENGINE_ERROR` -- [ ] T012 [US1] Replace the `grade-api` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerGradeTool(server, sessionState)` call imported from `./tools/grade.ts` +- [X] T011 [US1] Implement `packages/api-grade-mcp/src/tools/grade.ts` exporting `registerGradeTool(server, sessionState)`: registers `grade-api` with Zod schema (`specPath` required, `rulesetPath` optional); checks file existence before calling `GradeEngine.grade()`; projects `GradeSummaryResponse` (omitting `diagnostics[]`); reads file size to detect large spec and appends `largeSpecWarning`; returns structured errors for `SPEC_NOT_FOUND`, `SPEC_PARSE_ERROR`, `RULESET_NOT_FOUND`, `GRADE_ENGINE_ERROR` +- [X] T012 [US1] Replace the `grade-api` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerGradeTool(server, sessionState)` call imported from `./tools/grade.ts` **Checkpoint**: `grade-api` tool is fully functional. Run the integration tests in `tests/integration/grade.test.ts` and confirm all pass. @@ -74,12 +74,12 @@ > **Write these tests FIRST and confirm they fail before implementing T015.** -- [ ] T014 [P] [US2] Create `packages/api-grade-mcp/tests/integration/assert-grade.test.ts` integration tests for `assert-api-grade`: assert grade C on a B-grade spec → `passed: true`; assert grade A on a D-grade spec → `passed: false` with correct `actual`; `minimumGrade: "X"` → `INVALID_GRADE` error; all five valid grades (A/B/C/D/F) accepted without error +- [X] T014 [P] [US2] Create `packages/api-grade-mcp/tests/integration/assert-grade.test.ts` integration tests for `assert-api-grade`: assert grade C on a B-grade spec → `passed: true`; assert grade A on a D-grade spec → `passed: false` with correct `actual`; `minimumGrade: "X"` → `INVALID_GRADE` error; all five valid grades (A/B/C/D/F) accepted without error ### Implementation for User Story 2 -- [ ] T015 [US2] Implement `packages/api-grade-mcp/src/tools/assert-grade.ts` exporting `registerAssertGradeTool(server, sessionState)`: registers `assert-api-grade` with Zod schema (`specPath` required, `minimumGrade` enum `["A","B","C","D","F"]` required, `rulesetPath` optional); calls `GradeEngine.grade()`; compares `actual` vs `minimum` using `LETTER_GRADE_ORDER` from `api-grade-core`; returns `AssertionResult`; handles `INVALID_GRADE` and standard spec errors -- [ ] T016 [US2] Replace the `assert-api-grade` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerAssertGradeTool(server, sessionState)` call imported from `./tools/assert-grade.ts` +- [X] T015 [US2] Implement `packages/api-grade-mcp/src/tools/assert-grade.ts` exporting `registerAssertGradeTool(server, sessionState)`: registers `assert-api-grade` with Zod schema (`specPath` required, `minimumGrade` enum `["A","B","C","D","F"]` required, `rulesetPath` optional); calls `GradeEngine.grade()`; compares `actual` vs `minimum` using `LETTER_GRADE_ORDER` from `api-grade-core`; returns `AssertionResult`; handles `INVALID_GRADE` and standard spec errors +- [X] T016 [US2] Replace the `assert-api-grade` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerAssertGradeTool(server, sessionState)` call imported from `./tools/assert-grade.ts` **Checkpoint**: `assert-api-grade` tool is fully functional. Run `tests/integration/assert-grade.test.ts` and confirm all pass. @@ -95,12 +95,12 @@ > **Write these tests FIRST and confirm they fail before implementing T018.** -- [ ] T017 [P] [US3] Create `packages/api-grade-mcp/tests/integration/grade-detailed.test.ts` integration tests for `grade-api-detailed`: low-quality OpenAPI → full `GradeResult` with non-empty `diagnostics[]` containing correct Diagnostic shape; high-quality spec → `diagnostics[]` with zero or minimal entries; spec > 500KB → `truncated: true`, `diagnostics.length <= 100`, `largeSpecWarning` present +- [X] T017 [P] [US3] Create `packages/api-grade-mcp/tests/integration/grade-detailed.test.ts` integration tests for `grade-api-detailed`: low-quality OpenAPI → full `GradeResult` with non-empty `diagnostics[]` containing correct Diagnostic shape; high-quality spec → `diagnostics[]` with zero or minimal entries; spec > 500KB → `truncated: true`, `diagnostics.length <= 100`, `largeSpecWarning` present ### Implementation for User Story 3 -- [ ] T018 [US3] Implement `packages/api-grade-mcp/src/tools/grade-detailed.ts` exporting `registerGradeDetailedTool(server, sessionState)`: registers `grade-api-detailed` with same Zod schema as `grade-api`; returns full `GradeResult` including `diagnostics[]`; for large specs truncates `diagnostics` to first 100 entries and sets `truncated: true`; adds `largeSpecWarning`; handles same error codes as `grade-api` -- [ ] T019 [US3] Replace the `grade-api-detailed` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerGradeDetailedTool(server, sessionState)` call imported from `./tools/grade-detailed.ts` +- [X] T018 [US3] Implement `packages/api-grade-mcp/src/tools/grade-detailed.ts` exporting `registerGradeDetailedTool(server, sessionState)`: registers `grade-api-detailed` with same Zod schema as `grade-api`; returns full `GradeResult` including `diagnostics[]`; for large specs truncates `diagnostics` to first 100 entries and sets `truncated: true`; adds `largeSpecWarning`; handles same error codes as `grade-api` +- [X] T019 [US3] Replace the `grade-api-detailed` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerGradeDetailedTool(server, sessionState)` call imported from `./tools/grade-detailed.ts` **Checkpoint**: `grade-api-detailed` tool is fully functional. Run `tests/integration/grade-detailed.test.ts` and confirm all pass. @@ -116,21 +116,21 @@ > **Write these tests FIRST and confirm they fail before implementing T024–T031.** -- [ ] T020 [P] [US5] Create `packages/api-grade-mcp/tests/unit/ruleset-config.test.ts` unit tests for `config/ruleset-config.ts`: load from non-existent file returns `null`; write then re-read at workspace path returns correct `RulesetConfig`; write then re-read at global path (`os.homedir()`) returns correct config; write error (unwritable path) throws `CONFIG_WRITE_ERROR` -- [ ] T021 [P] [US5] Create `packages/api-grade-mcp/tests/unit/resolve-ruleset.test.ts` unit tests for all 5-level precedence scenarios: per-request wins over all others; `sessionRulesetOverride: "builtin"` short-circuits to built-in immediately; session default wins over workspace and global; workspace wins over global; global wins over built-in; all null → built-in -- [ ] T022 [P] [US5] Create `packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts` integration tests for `configure-ruleset`: `scope: "session"` stores in `SessionState.defaultRuleset`; `scope: "workspace"` writes `.api-grade/config.json`; `scope: "global"` writes `~/.api-grade/config.json`; `rulesetPath: null` clears the scope; `auth.type: "entra-id"` without `tenantId`/`clientId` → `INVALID_AUTH_CONFIG`; unwritable workspace path → `CONFIG_WRITE_ERROR` -- [ ] T023 [P] [US5] Create `packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts` integration tests for `get-ruleset-config`: no defaults configured → all scopes null, effective is built-in; session only → effective is session; workspace only → effective is workspace; session + workspace → effective is session (precedence); response never includes raw token values +- [X] T020 [P] [US5] Create `packages/api-grade-mcp/tests/unit/ruleset-config.test.ts` unit tests for `config/ruleset-config.ts`: load from non-existent file returns `null`; write then re-read at workspace path returns correct `RulesetConfig`; write then re-read at global path (`os.homedir()`) returns correct config; write error (unwritable path) throws `CONFIG_WRITE_ERROR` +- [X] T021 [P] [US5] Create `packages/api-grade-mcp/tests/unit/resolve-ruleset.test.ts` unit tests for all 5-level precedence scenarios: per-request wins over all others; `sessionRulesetOverride: "builtin"` short-circuits to built-in immediately; session default wins over workspace and global; workspace wins over global; global wins over built-in; all null → built-in +- [X] T022 [P] [US5] Create `packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts` integration tests for `configure-ruleset`: `scope: "session"` stores in `SessionState.defaultRuleset`; `scope: "workspace"` writes `.api-grade/config.json`; `scope: "global"` writes `~/.api-grade/config.json`; `rulesetPath: null` clears the scope; `auth.type: "entra-id"` without `tenantId`/`clientId` → `INVALID_AUTH_CONFIG`; unwritable workspace path → `CONFIG_WRITE_ERROR` +- [X] T023 [P] [US5] Create `packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts` integration tests for `get-ruleset-config`: no defaults configured → all scopes null, effective is built-in; session only → effective is session; workspace only → effective is workspace; session + workspace → effective is session (precedence); response never includes raw token values ### Implementation for User Story 5 -- [ ] T024 [US5] Implement `packages/api-grade-mcp/src/config/ruleset-config.ts` exporting `loadWorkspaceConfig()`, `loadGlobalConfig()`, `saveWorkspaceConfig(config)`, `saveGlobalConfig(config)` using `fs/promises`; workspace path = `path.join(process.cwd(), ".api-grade/config.json")`; global path = `path.join(os.homedir(), ".api-grade/config.json")`; non-existent file returns `null`; write creates parent directory with `{ recursive: true }` before writing -- [ ] T025 [US5] Implement `packages/api-grade-mcp/src/config/resolve-ruleset.ts` exporting `resolveRuleset(perRequestPath, sessionState, workspaceConfig, globalConfig): RulesetResolution` implementing the 5-level precedence chain from FR-017; `sessionRulesetOverride: "builtin"` on `SessionState` short-circuits immediately to `{ scope: "built-in", rulesetPath: null, auth: null }`; first non-null source wins -- [ ] T026 [US5] Implement `packages/api-grade-mcp/src/auth/github.ts` exporting `fetchRulesetWithGithubPat(url, token, timeoutMs): Promise` using native `fetch`, `AbortController`, `Authorization: Bearer` header; maps HTTP 401/403 → throws `RulesetAuthError("auth-failed")`; abort (`AbortError`) → throws `RulesetAuthError("network-unreachable")`; export `INITIAL_FETCH_TIMEOUT_MS = 5_000` and `RETRY_FETCH_TIMEOUT_MS = 30_000` -- [ ] T027 [US5] Implement `packages/api-grade-mcp/src/auth/entra.ts` exporting `acquireEntraToken(tenantId, clientId): Promise` using `@azure/msal-node` `PublicClientApplication` with disk-persisted token cache at `~/.api-grade/entra-token-cache.json` via `cachePlugin` (`beforeCacheAccess`/`afterCacheAccess`); tries silent acquisition first; on cache miss throws `EntraAuthRequired(userCode, verificationUri, expiresIn)` via `deviceCodeCallback`; never opens browser directly -- [ ] T028 [US5] Implement `packages/api-grade-mcp/src/tools/configure-ruleset.ts` exporting `registerConfigureRulesetTool(server, sessionState)`: registers `configure-ruleset` with Zod schema (`scope` enum required, `rulesetPath` optional string/null, `auth` object optional); validates `entra-id` requires `tenantId` + `clientId`; for `session` scope updates `sessionState.defaultRuleset` and clears `sessionState.sessionRulesetOverride` when `rulesetPath` is non-null (per research.md clearing rule); for `workspace`/`global` calls appropriate `saveXxxConfig()`; returns confirmation with `configFile` path for persistent scopes -- [ ] T029 [US5] Implement `packages/api-grade-mcp/src/tools/get-ruleset-config.ts` exporting `registerGetRulesetConfigTool(server, sessionState)`: registers `get-ruleset-config` (no required inputs); loads workspace and global configs; calls `resolveRuleset()` to determine effective scope; returns all scopes, effective scope, `precedenceOrder`, and `note` about per-request precedence; strips raw token values from `auth` fields (shows only `tokenSource: "config-file" | "env-var" | "none"`) -- [ ] T030 [US5] ⚠️ Update `packages/api-grade-mcp/src/tools/grade.ts`, `grade-detailed.ts`, and `assert-grade.ts` to accept `recoveryOption` optional parameter (enum `["retry","use-builtin-once","use-builtin-session","cancel"]`); call `resolveRuleset()` before each `GradeEngine.grade()` call; if resolved to a remote URL fetch it using the correct auth module with `INITIAL_FETCH_TIMEOUT_MS` (or `RETRY_FETCH_TIMEOUT_MS` when `recoveryOption: "retry"`); on fetch failure return `AuthFailureRecoveryResponse`; on `recoveryOption: "use-builtin-session"` set `sessionState.sessionRulesetOverride = "builtin"`; on `recoveryOption: "cancel"` return `REQUEST_CANCELLED` error — **highest-risk task; touches all grading tools** -- [ ] T031 [US5] Wire all US5 tools into `packages/api-grade-mcp/src/server.ts` `createServer()`: replace stubs with real `registerConfigureRulesetTool(server, sessionState)` and `registerGetRulesetConfigTool(server, sessionState)` calls; load workspace and global configs at server startup and pass to each grading tool registration +- [X] T024 [US5] Implement `packages/api-grade-mcp/src/config/ruleset-config.ts` exporting `loadWorkspaceConfig()`, `loadGlobalConfig()`, `saveWorkspaceConfig(config)`, `saveGlobalConfig(config)` using `fs/promises`; workspace path = `path.join(process.cwd(), ".api-grade/config.json")`; global path = `path.join(os.homedir(), ".api-grade/config.json")`; non-existent file returns `null`; write creates parent directory with `{ recursive: true }` before writing +- [X] T025 [US5] Implement `packages/api-grade-mcp/src/config/resolve-ruleset.ts` exporting `resolveRuleset(perRequestPath, sessionState, workspaceConfig, globalConfig): RulesetResolution` implementing the 5-level precedence chain from FR-017; `sessionRulesetOverride: "builtin"` on `SessionState` short-circuits immediately to `{ scope: "built-in", rulesetPath: null, auth: null }`; first non-null source wins +- [X] T026 [US5] Implement `packages/api-grade-mcp/src/auth/github.ts` exporting `fetchRulesetWithGithubPat(url, token, timeoutMs): Promise` using native `fetch`, `AbortController`, `Authorization: Bearer` header; maps HTTP 401/403 → throws `RulesetAuthError("auth-failed")`; abort (`AbortError`) → throws `RulesetAuthError("network-unreachable")`; export `INITIAL_FETCH_TIMEOUT_MS = 5_000` and `RETRY_FETCH_TIMEOUT_MS = 30_000` +- [X] T027 [US5] Implement `packages/api-grade-mcp/src/auth/entra.ts` exporting `acquireEntraToken(tenantId, clientId): Promise` using `@azure/msal-node` `PublicClientApplication` with disk-persisted token cache at `~/.api-grade/entra-token-cache.json` via `cachePlugin` (`beforeCacheAccess`/`afterCacheAccess`); tries silent acquisition first; on cache miss throws `EntraAuthRequired(userCode, verificationUri, expiresIn)` via `deviceCodeCallback`; never opens browser directly +- [X] T028 [US5] Implement `packages/api-grade-mcp/src/tools/configure-ruleset.ts` exporting `registerConfigureRulesetTool(server, sessionState)`: registers `configure-ruleset` with Zod schema (`scope` enum required, `rulesetPath` optional string/null, `auth` object optional); validates `entra-id` requires `tenantId` + `clientId`; for `session` scope updates `sessionState.defaultRuleset` and clears `sessionState.sessionRulesetOverride` when `rulesetPath` is non-null (per research.md clearing rule); for `workspace`/`global` calls appropriate `saveXxxConfig()`; returns confirmation with `configFile` path for persistent scopes +- [X] T029 [US5] Implement `packages/api-grade-mcp/src/tools/get-ruleset-config.ts` exporting `registerGetRulesetConfigTool(server, sessionState)`: registers `get-ruleset-config` (no required inputs); loads workspace and global configs; calls `resolveRuleset()` to determine effective scope; returns all scopes, effective scope, `precedenceOrder`, and `note` about per-request precedence; strips raw token values from `auth` fields (shows only `tokenSource: "config-file" | "env-var" | "none"`) +- [X] T030 [US5] ⚠️ Update `packages/api-grade-mcp/src/tools/grade.ts`, `grade-detailed.ts`, and `assert-grade.ts` to accept `recoveryOption` optional parameter (enum `["retry","use-builtin-once","use-builtin-session","cancel"]`); call `resolveRuleset()` before each `GradeEngine.grade()` call; if resolved to a remote URL fetch it using the correct auth module with `INITIAL_FETCH_TIMEOUT_MS` (or `RETRY_FETCH_TIMEOUT_MS` when `recoveryOption: "retry"`); on fetch failure return `AuthFailureRecoveryResponse`; on `recoveryOption: "use-builtin-session"` set `sessionState.sessionRulesetOverride = "builtin"`; on `recoveryOption: "cancel"` return `REQUEST_CANCELLED` error — **highest-risk task; touches all grading tools** +- [X] T031 [US5] Wire all US5 tools into `packages/api-grade-mcp/src/server.ts` `createServer()`: replace stubs with real `registerConfigureRulesetTool(server, sessionState)` and `registerGetRulesetConfigTool(server, sessionState)` calls; load workspace and global configs at server startup and pass to each grading tool registration **Checkpoint**: All six tools registered. Session, workspace, and global ruleset configuration works. Auth failure returns four recovery options. Run all unit and integration tests and confirm all pass. @@ -146,12 +146,12 @@ > **Write these tests FIRST and confirm they fail before implementing T033.** -- [ ] T032 [P] [US4] Create `packages/api-grade-mcp/tests/integration/non-breaking.test.ts` integration tests for `get-non-breaking-violations`: spec with known non-breaking violations → `nonBreakingViolations[]` contains entries with all FR-012 fields (`ruleId`, `message`, `severity`, `path`, `location`, `currentValue`, `expectedImprovement`); spec with only breaking violations → `nonBreakingCount: 0`, `nonBreakingViolations: []`; spec > 500KB → `largeSpecWarning` present; `currentValue` is `null` for absent fields, not empty string +- [X] T032 [P] [US4] Create `packages/api-grade-mcp/tests/integration/non-breaking.test.ts` integration tests for `get-non-breaking-violations`: spec with known non-breaking violations → `nonBreakingViolations[]` contains entries with all FR-012 fields (`ruleId`, `message`, `severity`, `path`, `location`, `currentValue`, `expectedImprovement`); spec with only breaking violations → `nonBreakingCount: 0`, `nonBreakingViolations: []`; spec > 500KB → `largeSpecWarning` present; `currentValue` is `null` for absent fields, not empty string ### Implementation for User Story 4 -- [ ] T033 [US4] Implement `packages/api-grade-mcp/src/tools/non-breaking.ts` exporting `registerNonBreakingTool(server, sessionState)`: registers `get-non-breaking-violations` with same Zod schema as `grade-api` plus `recoveryOption`; calls `GradeEngine.grade()` with resolved ruleset; passes each `Diagnostic` through `classify()`; for non-breaking violations builds `NonBreakingViolation` shape with `location` (dot-joined path), `currentValue` (read from spec AST at path, or null if absent), `expectedImprovement` (derived from rule message per research.md logic); returns `NonBreakingViolationResult`; applies large spec warning -- [ ] T034 [US4] Replace the `get-non-breaking-violations` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerNonBreakingTool(server, sessionState)` call imported from `./tools/non-breaking.ts` +- [X] T033 [US4] Implement `packages/api-grade-mcp/src/tools/non-breaking.ts` exporting `registerNonBreakingTool(server, sessionState)`: registers `get-non-breaking-violations` with same Zod schema as `grade-api` plus `recoveryOption`; calls `GradeEngine.grade()` with resolved ruleset; passes each `Diagnostic` through `classify()`; for non-breaking violations builds `NonBreakingViolation` shape with `location` (dot-joined path), `currentValue` (read from spec AST at path, or null if absent), `expectedImprovement` (derived from rule message per research.md logic); returns `NonBreakingViolationResult`; applies large spec warning +- [X] T034 [US4] Replace the `get-non-breaking-violations` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerNonBreakingTool(server, sessionState)` call imported from `./tools/non-breaking.ts` **Checkpoint**: All four grading tools + two configuration tools are fully functional. Run the full test suite and confirm all pass. @@ -161,15 +161,15 @@ **Purpose**: Documentation, monorepo updates, and explicit AI environment verification across all three required targets. -- [ ] T035 [P] Create `docs/mcp/quick-start.md` user-facing installation and host configuration guide covering Claude Code (`claude mcp add` command + `.claude/settings.json`), GitHub Copilot in VS Code (`.vscode/mcp.json`, Agent mode requirement), and GitHub Copilot Studio (custom MCP Action setup) per quickstart.md design reference (FR-025) -- [ ] T036 [P] Create `docs/mcp/configuration.md` reference covering all three default ruleset scopes (session/workspace/global), `.api-grade/config.json` file format, `~/.api-grade/config.json` global path, GitHub Enterprise PAT auth (env var `GITHUB_TOKEN`, config `auth.type: "github-pat"`), Entra ID device-code flow (`tenantId`/`clientId`, `~/.api-grade/entra-token-cache.json` persistence), precedence order diagram (FR-025) -- [ ] T037 [P] Create `docs/mcp/troubleshooting.md` covering auth failure recovery (the four options: retry/use-builtin-once/use-builtin-session/cancel), token expiry (`GITHUB_TOKEN` rotation, Entra token cache), network failures (VPN disconnect, corporate firewall), tools not appearing in AI tool (Node 20+, valid JSON config, restart), `SPEC_NOT_FOUND` (use absolute paths), large spec warning (FR-025) -- [ ] T038 [P] Create `docs/package/api-grade-mcp.md` package documentation page listing all six tools with purpose and input/output summary, configuration overview (three scopes), link to `docs/mcp/` for full reference -- [ ] T039 Update `README.md` to add `@dawmatt/api-grade-mcp` to the Components section (alongside Core Package, CLI, Backstage plugin) and to the Documentation section (linking to `docs/mcp/`) -- [ ] T040 Update `CONTRIBUTING.md` to add `packages/api-grade-mcp` to the monorepo packages table with description, and update any scripts table to reflect the `api-grade-mcp` workspace -- [ ] T041 [P] Update `docs/index.md` to add MCP Server rows (overview, configuration reference, troubleshooting, quick-start) alongside the existing CLI and Backstage integration rows -- [ ] T042 [P] Update `docs/getting-started.md` to extend the MCP section to mention default ruleset configuration capability and link to `docs/mcp/configuration.md` -- [ ] T043 [P] Update `docs/package/README.md` to add `@dawmatt/api-grade-mcp` to the monorepo packages table +- [X] T035 [P] Create `docs/mcp/quick-start.md` user-facing installation and host configuration guide covering Claude Code (`claude mcp add` command + `.claude/settings.json`), GitHub Copilot in VS Code (`.vscode/mcp.json`, Agent mode requirement), and GitHub Copilot Studio (custom MCP Action setup) per quickstart.md design reference (FR-025) +- [X] T036 [P] Create `docs/mcp/configuration.md` reference covering all three default ruleset scopes (session/workspace/global), `.api-grade/config.json` file format, `~/.api-grade/config.json` global path, GitHub Enterprise PAT auth (env var `GITHUB_TOKEN`, config `auth.type: "github-pat"`), Entra ID device-code flow (`tenantId`/`clientId`, `~/.api-grade/entra-token-cache.json` persistence), precedence order diagram (FR-025) +- [X] T037 [P] Create `docs/mcp/troubleshooting.md` covering auth failure recovery (the four options: retry/use-builtin-once/use-builtin-session/cancel), token expiry (`GITHUB_TOKEN` rotation, Entra token cache), network failures (VPN disconnect, corporate firewall), tools not appearing in AI tool (Node 20+, valid JSON config, restart), `SPEC_NOT_FOUND` (use absolute paths), large spec warning (FR-025) +- [X] T038 [P] Create `docs/package/api-grade-mcp.md` package documentation page listing all six tools with purpose and input/output summary, configuration overview (three scopes), link to `docs/mcp/` for full reference +- [X] T039 Update `README.md` to add `@dawmatt/api-grade-mcp` to the Components section (alongside Core Package, CLI, Backstage plugin) and to the Documentation section (linking to `docs/mcp/`) +- [X] T040 Update `CONTRIBUTING.md` to add `packages/api-grade-mcp` to the monorepo packages table with description, and update any scripts table to reflect the `api-grade-mcp` workspace +- [X] T041 [P] Update `docs/index.md` to add MCP Server rows (overview, configuration reference, troubleshooting, quick-start) alongside the existing CLI and Backstage integration rows +- [X] T042 [P] Update `docs/getting-started.md` to extend the MCP section to mention default ruleset configuration capability and link to `docs/mcp/configuration.md` +- [X] T043 [P] Update `docs/package/README.md` to add `@dawmatt/api-grade-mcp` to the monorepo packages table - [ ] T044 Verify all six MCP tools function correctly in all three required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `get-non-breaking-violations`, `configure-ruleset`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work; (3) GitHub Copilot Studio — configure as custom MCP Action and confirm grading succeeds (FR-014, SC-002, SC-006) --- From 0c180f0397e4370546b36fa740ae4c7d6efb2620 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Fri, 19 Jun 2026 11:55:45 +1000 Subject: [PATCH 06/20] Manual MCP testing plan --- .../checklists/t044-verification.md | 112 ++++++++++++++++++ specs/007-ai-support/tasks.md | 2 +- 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 specs/007-ai-support/checklists/t044-verification.md diff --git a/specs/007-ai-support/checklists/t044-verification.md b/specs/007-ai-support/checklists/t044-verification.md new file mode 100644 index 0000000..fcdac76 --- /dev/null +++ b/specs/007-ai-support/checklists/t044-verification.md @@ -0,0 +1,112 @@ +# T044 — Three-Environment Verification Checklist + +**Satisfies**: FR-014, SC-002, constitution AI Integration Requirements (MUST) + +**Prerequisite**: All six tools registered and passing (`yarn workspace @dawmatt/api-grade-mcp run test` — 65/65 ✅) + +--- + +## Environment 1: Claude Code + +**Register the server (local binary, pre-publication):** + +```sh +claude mcp add api-grade -- node /path/to/packages/api-grade-mcp/dist/index.js +``` + +Or add to `.claude/settings.json`: + +```json +{ + "mcpServers": { + "api-grade": { + "command": "node", + "args": ["/path/to/packages/api-grade-mcp/dist/index.js"] + } + } +} +``` + +**Checklist:** + +- [ ] All six tools discoverable (`grade-api`, `grade-api-detailed`, `assert-api-grade`, `get-non-breaking-violations`, `configure-ruleset`, `get-ruleset-config`) +- [ ] `grade-api` with a valid OpenAPI spec → response includes `letterGrade`, `numericScore`, `gradeLabel`, `summary` +- [ ] `grade-api` with a valid AsyncAPI spec → equivalent structured result (SC-003) +- [ ] `assert-api-grade` with `minimumGrade: "C"` on a passing spec → `passed: true` with `actual` grade +- [ ] `assert-api-grade` with `minimumGrade: "A"` on a low-quality spec → `passed: false` with `actual` grade +- [ ] `grade-api-detailed` on a low-quality spec → `diagnostics[]` with `ruleId`, `message`, `severity`, `path` on each entry +- [ ] `get-non-breaking-violations` on a spec with known non-breaking issues → `nonBreakingViolations[]` with `ruleId`, `location`, `currentValue`, `expectedImprovement` +- [ ] `configure-ruleset` with `scope: "session"` and a local ruleset path → confirmation returned +- [ ] `get-ruleset-config` after above → session scope shown as effective + +**Verification date**: ___________ +**Claude Code version**: ___________ + +--- + +## Environment 2: GitHub Copilot (VS Code Agent mode) + +**Prerequisites**: VS Code 1.99+, GitHub Copilot extension, Agent mode enabled. + +**Register the server — create `.vscode/mcp.json` in the project root:** + +```json +{ + "servers": { + "api-grade": { + "type": "stdio", + "command": "node", + "args": ["/path/to/packages/api-grade-mcp/dist/index.js"] + } + } +} +``` + +**Checklist:** + +- [ ] Open Copilot Chat → switch to Agent mode +- [ ] All six tools visible to the agent +- [ ] `grade-api` with a valid OpenAPI spec → structured grade result returned +- [ ] `grade-api` with a valid AsyncAPI spec → equivalent structured result (SC-003) +- [ ] `assert-api-grade` → pass/fail result with actual grade +- [ ] `grade-api-detailed` → `diagnostics[]` populated with correct shape +- [ ] `get-non-breaking-violations` → classified violation list returned +- [ ] `get-ruleset-config` → scope information returned + +**Verification date**: ___________ +**VS Code version**: ___________ +**GitHub Copilot extension version**: ___________ + +--- + +## Environment 3: GitHub Copilot Studio + +> ⚠️ **Blocked on npm publication.** Copilot Studio is cloud-hosted and cannot reach a local binary. Complete this environment after `@dawmatt/api-grade-mcp` is published to npmjs. + +**After publication — configure as MCP Action:** + +1. In your Copilot Studio agent, add a new **Action** → **MCP Server** +2. Set: **Command** = `npx`, **Arguments** = `-y @dawmatt/api-grade-mcp`, **Transport** = `stdio` +3. Publish the agent + +**Checklist:** + +- [ ] All six tools discoverable in the Copilot Studio action catalogue (SC-006) +- [ ] `grade-api` with a valid OpenAPI spec → structured grade result returned +- [ ] `assert-api-grade` → pass/fail result with actual grade +- [ ] At least one additional tool (`grade-api-detailed` or `get-non-breaking-violations`) invoked successfully + +**Verification date**: ___________ +**Copilot Studio agent version / environment**: ___________ + +--- + +## Sign-off + +All three environments verified: + +- [ ] Environment 1: Claude Code ✅ +- [ ] Environment 2: GitHub Copilot (VS Code Agent mode) ✅ +- [ ] Environment 3: GitHub Copilot Studio ✅ + +Mark T044 `[X]` in `tasks.md` once all three are checked. diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index 8d37820..677eced 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -170,7 +170,7 @@ - [X] T041 [P] Update `docs/index.md` to add MCP Server rows (overview, configuration reference, troubleshooting, quick-start) alongside the existing CLI and Backstage integration rows - [X] T042 [P] Update `docs/getting-started.md` to extend the MCP section to mention default ruleset configuration capability and link to `docs/mcp/configuration.md` - [X] T043 [P] Update `docs/package/README.md` to add `@dawmatt/api-grade-mcp` to the monorepo packages table -- [ ] T044 Verify all six MCP tools function correctly in all three required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `get-non-breaking-violations`, `configure-ruleset`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work; (3) GitHub Copilot Studio — configure as custom MCP Action and confirm grading succeeds (FR-014, SC-002, SC-006) +- [ ] T044 Verify all six MCP tools function correctly in all three required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `get-non-breaking-violations`, `configure-ruleset`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work; (3) GitHub Copilot Studio — configure as custom MCP Action and confirm grading succeeds (FR-014, SC-002, SC-006) — **see [`checklists/t044-verification.md`](checklists/t044-verification.md) for step-by-step verification checklist per environment** --- From 07b8832c243c484196be229f5c83983ffce35c93 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Fri, 19 Jun 2026 14:08:11 +1000 Subject: [PATCH 07/20] Rename tool to set-ruleset-config --- CONTRIBUTING.md | 2 +- docs/getting-started.md | 2 +- docs/mcp/README.md | 2 +- docs/mcp/configuration.md | 4 ++-- docs/mcp/quick-start.md | 2 +- docs/mcp/troubleshooting.md | 6 +++--- docs/package/api-grade-mcp.md | 2 +- packages/api-grade-mcp/README.md | 2 +- packages/api-grade-mcp/src/server.ts | 4 ++-- .../src/tools/get-ruleset-config.ts | 2 +- ...figure-ruleset.ts => set-ruleset-config.ts} | 4 ++-- .../integration/get-ruleset-config.test.ts | 10 +++++----- ...eset.test.ts => set-ruleset-config.test.ts} | 14 +++++++------- specs/007-ai-support/contracts/mcp-tools.md | 4 ++-- specs/007-ai-support/data-model.md | 4 ++-- specs/007-ai-support/plan.md | 8 ++++---- specs/007-ai-support/quickstart.md | 16 ++++++++-------- specs/007-ai-support/research.md | 6 +++--- specs/007-ai-support/spec.md | 12 ++++++------ specs/007-ai-support/tasks.md | 18 +++++++++--------- 20 files changed, 62 insertions(+), 62 deletions(-) rename packages/api-grade-mcp/src/tools/{configure-ruleset.ts => set-ruleset-config.ts} (98%) rename packages/api-grade-mcp/tests/integration/{configure-ruleset.test.ts => set-ruleset-config.test.ts} (89%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0f8f8fa..9e2845b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,7 +68,7 @@ tests/ |---------|------|-------------| | `@dawmatt/api-grade` | `/` (root) | CLI tool (`api-grade` binary) | | `@dawmatt/api-grade-core` | `packages/api-grade-core/` | Standalone grading library used by all other packages | -| `@dawmatt/api-grade-mcp` | `packages/api-grade-mcp/` | MCP server exposing six AI tools (`grade-api`, `grade-api-detailed`, `assert-api-grade`, `get-non-breaking-violations`, `configure-ruleset`, `get-ruleset-config`) | +| `@dawmatt/api-grade-mcp` | `packages/api-grade-mcp/` | MCP server exposing six AI tools (`grade-api`, `grade-api-detailed`, `assert-api-grade`, `get-non-breaking-violations`, `set-ruleset-config`, `get-ruleset-config`) | | `@dawmatt/backstage-plugin-api-grade` | `packages/backstage-plugin-api-grade/` | Backstage frontend card plugin | | `@dawmatt/backstage-plugin-api-grade-backend` | `packages/backstage-plugin-api-grade-backend/` | Backstage backend grading plugin | diff --git a/docs/getting-started.md b/docs/getting-started.md index 2f2fde8..4cbd689 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -55,7 +55,7 @@ Two Backstage plugin packages that display API grades directly on your Backstage ### MCP Server (`@dawmatt/api-grade-mcp`) -An MCP (Model Context Protocol) server that exposes api-grade as six AI tools: `grade-api`, `grade-api-detailed`, `assert-api-grade`, `get-non-breaking-violations`, `configure-ruleset`, and `get-ruleset-config`. Register it in Claude Code, GitHub Copilot (VS Code Agent mode), or any MCP-compatible AI host and let the AI grade specs directly. +An MCP (Model Context Protocol) server that exposes api-grade as six AI tools: `grade-api`, `grade-api-detailed`, `assert-api-grade`, `get-non-breaking-violations`, `set-ruleset-config`, and `get-ruleset-config`. Register it in Claude Code, GitHub Copilot (VS Code Agent mode), or any MCP-compatible AI host and let the AI grade specs directly. ```bash claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp diff --git a/docs/mcp/README.md b/docs/mcp/README.md index cbad611..a6fd0e4 100644 --- a/docs/mcp/README.md +++ b/docs/mcp/README.md @@ -28,7 +28,7 @@ AI tool (Claude Code, Copilot, etc.) | `grade-api-detailed` | Full grade with all violations and diagnostics | | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | | `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | -| `configure-ruleset` | Set the default Spectral ruleset at session, workspace, or global scope | +| `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | | `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | --- diff --git a/docs/mcp/configuration.md b/docs/mcp/configuration.md index 12aa397..ed82825 100644 --- a/docs/mcp/configuration.md +++ b/docs/mcp/configuration.md @@ -27,7 +27,7 @@ The first non-null value in this chain wins. Applies to all grading requests for the current MCP server session. Cleared when the server restarts. ``` -configure-ruleset +set-ruleset-config scope: session rulesetPath: /workspace/rulesets/company-standards.yaml ``` @@ -176,7 +176,7 @@ Raw token values are never returned — the response shows only `tokenSource: "c To clear a scope's default: ``` -configure-ruleset +set-ruleset-config scope: workspace rulesetPath: null ``` diff --git a/docs/mcp/quick-start.md b/docs/mcp/quick-start.md index 35dacf4..568ac7b 100644 --- a/docs/mcp/quick-start.md +++ b/docs/mcp/quick-start.md @@ -139,7 +139,7 @@ Reload Cursor after saving. | `grade-api-detailed` | Full grade with all violations, diagnostics, and recommendations | | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | | `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | -| `configure-ruleset` | Set the default Spectral ruleset at session, workspace, or global scope | +| `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | | `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | --- diff --git a/docs/mcp/troubleshooting.md b/docs/mcp/troubleshooting.md index a16688c..0263d66 100644 --- a/docs/mcp/troubleshooting.md +++ b/docs/mcp/troubleshooting.md @@ -38,7 +38,7 @@ openapi.yaml **Cause**: The `rulesetPath` supplied in the request (or the configured default) points to a local file that doesn't exist. -**Fix**: Verify the path is correct and the file exists. For configured defaults, use `get-ruleset-config` to see what path is active, then correct it with `configure-ruleset`. +**Fix**: Verify the path is correct and the file exists. For configured defaults, use `get-ruleset-config` to see what path is active, then correct it with `set-ruleset-config`. --- @@ -53,8 +53,8 @@ openapi.yaml **Fixes**: - **Token expired (`github-pat`)**: Rotate the `GITHUB_TOKEN` env var and restart the AI tool - **VPN disconnected**: Reconnect to VPN, then use the `retry` recovery option -- **Wrong URL**: Use `configure-ruleset` to correct the `rulesetPath` -- **Temporary bypass**: Use `configure-ruleset scope: session rulesetPath: null` to clear the session default and fall back to the built-in ruleset +- **Wrong URL**: Use `set-ruleset-config` to correct the `rulesetPath` +- **Temporary bypass**: Use `set-ruleset-config scope: session rulesetPath: null` to clear the session default and fall back to the built-in ruleset --- diff --git a/docs/package/api-grade-mcp.md b/docs/package/api-grade-mcp.md index aa111b0..b0dc8d4 100644 --- a/docs/package/api-grade-mcp.md +++ b/docs/package/api-grade-mcp.md @@ -122,7 +122,7 @@ Return a classified, AI-actionable list of non-breaking violations — those who --- -### `configure-ruleset` +### `set-ruleset-config` Set the default Spectral ruleset at session, workspace, or global scope. The configured default applies to all subsequent grading requests without needing to supply `rulesetPath` each time. diff --git a/packages/api-grade-mcp/README.md b/packages/api-grade-mcp/README.md index 40b3af4..645339b 100644 --- a/packages/api-grade-mcp/README.md +++ b/packages/api-grade-mcp/README.md @@ -61,7 +61,7 @@ Create `.vscode/mcp.json` in your project root: | `grade-api-detailed` | Full grade with all violations and diagnostics | | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | | `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | -| `configure-ruleset` | Set the default Spectral ruleset at session, workspace, or global scope | +| `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | | `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | ## Usage Examples diff --git a/packages/api-grade-mcp/src/server.ts b/packages/api-grade-mcp/src/server.ts index 73e64c5..9fec844 100644 --- a/packages/api-grade-mcp/src/server.ts +++ b/packages/api-grade-mcp/src/server.ts @@ -6,7 +6,7 @@ import { registerGradeTool } from './tools/grade.js'; import { registerAssertGradeTool } from './tools/assert-grade.js'; import { registerGradeDetailedTool } from './tools/grade-detailed.js'; import { registerNonBreakingTool } from './tools/non-breaking.js'; -import { registerConfigureRulesetTool } from './tools/configure-ruleset.js'; +import { registerSetRulesetConfigTool } from './tools/set-ruleset-config.js'; import { registerGetRulesetConfigTool } from './tools/get-ruleset-config.js'; import type { SessionState } from './types.js'; @@ -28,7 +28,7 @@ export function createServer(): McpServer { registerAssertGradeTool(server, sessionState); registerGradeDetailedTool(server, sessionState); registerNonBreakingTool(server, sessionState); - registerConfigureRulesetTool(server, sessionState); + registerSetRulesetConfigTool(server, sessionState); registerGetRulesetConfigTool(server, sessionState); return server; } diff --git a/packages/api-grade-mcp/src/tools/get-ruleset-config.ts b/packages/api-grade-mcp/src/tools/get-ruleset-config.ts index 74ed642..4b77dcc 100644 --- a/packages/api-grade-mcp/src/tools/get-ruleset-config.ts +++ b/packages/api-grade-mcp/src/tools/get-ruleset-config.ts @@ -12,7 +12,7 @@ function sanitizeAuth(auth: AuthConfig | null | undefined, hasToken: boolean): R export function registerGetRulesetConfigTool(server: McpServer, sessionState: SessionState): void { server.tool( 'get-ruleset-config', - 'Return the active ruleset configuration at every scope (session, workspace, global), indicate which scope is currently in effect (the effective ruleset), and show the full resolution chain. Use this to diagnose why a particular ruleset is being applied or to confirm a configure-ruleset call took effect.', + 'Return the active ruleset configuration at every scope (session, workspace, global), indicate which scope is currently in effect (the effective ruleset), and show the full resolution chain. Use this to diagnose why a particular ruleset is being applied or to confirm a set-ruleset-config call took effect.', {}, async () => { const workspaceConfig = await loadWorkspaceConfig(); diff --git a/packages/api-grade-mcp/src/tools/configure-ruleset.ts b/packages/api-grade-mcp/src/tools/set-ruleset-config.ts similarity index 98% rename from packages/api-grade-mcp/src/tools/configure-ruleset.ts rename to packages/api-grade-mcp/src/tools/set-ruleset-config.ts index 2ce2c5e..e902650 100644 --- a/packages/api-grade-mcp/src/tools/configure-ruleset.ts +++ b/packages/api-grade-mcp/src/tools/set-ruleset-config.ts @@ -10,9 +10,9 @@ import { } from '../config/ruleset-config.js'; import type { SessionState, RulesetConfig, AuthConfig } from '../types.js'; -export function registerConfigureRulesetTool(server: McpServer, sessionState: SessionState): void { +export function registerSetRulesetConfigTool(server: McpServer, sessionState: SessionState): void { server.tool( - 'configure-ruleset', + 'set-ruleset-config', 'Set the default ruleset used by this MCP server when no rulesetPath is supplied on a grading request. Supports three scopes: session (in-memory, resets on server restart), workspace (persisted to .api-grade/config.json in the workspace root), and global (persisted to ~/.api-grade/config.json). Optionally configure authentication for rulesets hosted in secured locations.', { scope: z diff --git a/packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts b/packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts index 79d8746..b368ed3 100644 --- a/packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts +++ b/packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts @@ -32,7 +32,7 @@ describe('get-ruleset-config tool', () => { it('session only → effective is session', async () => { const server = createServer(); - await callTool(server, 'configure-ruleset', { + await callTool(server, 'set-ruleset-config', { scope: 'session', rulesetPath: 'https://session.example.com/ruleset.yaml', }); @@ -44,7 +44,7 @@ describe('get-ruleset-config tool', () => { it('workspace only → effective is workspace', async () => { const server = createServer(); - await callTool(server, 'configure-ruleset', { + await callTool(server, 'set-ruleset-config', { scope: 'workspace', rulesetPath: 'https://workspace.example.com/ruleset.yaml', }); @@ -56,11 +56,11 @@ describe('get-ruleset-config tool', () => { it('session + workspace → effective is session (precedence)', async () => { const server = createServer(); - await callTool(server, 'configure-ruleset', { + await callTool(server, 'set-ruleset-config', { scope: 'workspace', rulesetPath: 'https://workspace.example.com/ruleset.yaml', }); - await callTool(server, 'configure-ruleset', { + await callTool(server, 'set-ruleset-config', { scope: 'session', rulesetPath: 'https://session.example.com/ruleset.yaml', }); @@ -71,7 +71,7 @@ describe('get-ruleset-config tool', () => { it('response never includes raw token values', async () => { const server = createServer(); - await callTool(server, 'configure-ruleset', { + await callTool(server, 'set-ruleset-config', { scope: 'session', rulesetPath: 'https://example.com/ruleset.yaml', auth: { type: 'github-pat', githubToken: 'secret-token-123' }, diff --git a/packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts b/packages/api-grade-mcp/tests/integration/set-ruleset-config.test.ts similarity index 89% rename from packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts rename to packages/api-grade-mcp/tests/integration/set-ruleset-config.test.ts index f264aa5..f0a9332 100644 --- a/packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts +++ b/packages/api-grade-mcp/tests/integration/set-ruleset-config.test.ts @@ -20,10 +20,10 @@ afterEach(async () => { try { await rm(API_GRADE_DIR, { recursive: true, force: true }); } catch { /* ok */ } }); -describe('configure-ruleset tool', () => { +describe('set-ruleset-config tool', () => { it('scope: "session" stores in SessionState (visible via get-ruleset-config)', async () => { const server = createServer(); - const result = await callTool(server, 'configure-ruleset', { + const result = await callTool(server, 'set-ruleset-config', { scope: 'session', rulesetPath: 'https://example.com/ruleset.yaml', }); @@ -41,7 +41,7 @@ describe('configure-ruleset tool', () => { it('scope: "workspace" writes .api-grade/config.json', async () => { const server = createServer(); - const result = await callTool(server, 'configure-ruleset', { + const result = await callTool(server, 'set-ruleset-config', { scope: 'workspace', rulesetPath: 'https://example.com/workspace-ruleset.yaml', }); @@ -53,11 +53,11 @@ describe('configure-ruleset tool', () => { it('rulesetPath: null clears the session scope', async () => { const server = createServer(); - await callTool(server, 'configure-ruleset', { + await callTool(server, 'set-ruleset-config', { scope: 'session', rulesetPath: 'https://example.com/ruleset.yaml', }); - const clearResult = await callTool(server, 'configure-ruleset', { + const clearResult = await callTool(server, 'set-ruleset-config', { scope: 'session', rulesetPath: null, }); @@ -70,7 +70,7 @@ describe('configure-ruleset tool', () => { it('auth.type: "entra-id" without tenantId/clientId → INVALID_AUTH_CONFIG', async () => { const server = createServer(); - const result = await callTool(server, 'configure-ruleset', { + const result = await callTool(server, 'set-ruleset-config', { scope: 'global', rulesetPath: 'https://example.com/ruleset.yaml', auth: { type: 'entra-id' }, @@ -85,7 +85,7 @@ describe('configure-ruleset tool', () => { // Remove any pre-existing .api-grade dir/file, then create a file to block directory creation await rm(API_GRADE_DIR, { recursive: true, force: true }).catch(() => {}); writeFileSync(API_GRADE_DIR, 'blocking', 'utf-8'); - const result = await callTool(server, 'configure-ruleset', { + const result = await callTool(server, 'set-ruleset-config', { scope: 'workspace', rulesetPath: 'https://example.com/ruleset.yaml', }); diff --git a/specs/007-ai-support/contracts/mcp-tools.md b/specs/007-ai-support/contracts/mcp-tools.md index 7625537..90cec4b 100644 --- a/specs/007-ai-support/contracts/mcp-tools.md +++ b/specs/007-ai-support/contracts/mcp-tools.md @@ -266,7 +266,7 @@ --- -## Tool 5: `configure-ruleset` +## Tool 5: `set-ruleset-config` **Purpose**: Set the default ruleset used by this MCP server when no `rulesetPath` is supplied on a grading request. Supports three scopes: `session` (in-memory, resets on server restart), `workspace` (persisted to `.api-grade/config.json` in the workspace root), and `global` (persisted to `~/.api-grade/config.json`). Optionally configure authentication for rulesets hosted in secured locations. @@ -361,7 +361,7 @@ Response confirms the scope was cleared and which scope will now take effect. ## Tool 6: `get-ruleset-config` -**Purpose**: Return the active ruleset configuration at every scope (session, workspace, global), indicate which scope is currently in effect (the effective ruleset), and show the full resolution chain. Use this to diagnose why a particular ruleset is being applied or to confirm a `configure-ruleset` call took effect. +**Purpose**: Return the active ruleset configuration at every scope (session, workspace, global), indicate which scope is currently in effect (the effective ruleset), and show the full resolution chain. Use this to diagnose why a particular ruleset is being applied or to confirm a `set-ruleset-config` call took effect. **Input Schema**: diff --git a/specs/007-ai-support/data-model.md b/specs/007-ai-support/data-model.md index 6a466ac..72b05a9 100644 --- a/specs/007-ai-support/data-model.md +++ b/specs/007-ai-support/data-model.md @@ -209,8 +209,8 @@ Grading operations remain stateless — no session, no cache. US5 introduces two | Field | Type | Description | |---|---|---| -| `defaultRuleset` | `RulesetConfig \| null` | Session-level default set via `configure-ruleset scope: session`; `null` if not configured | -| `sessionRulesetOverride` | `"builtin" \| null` | Set to `"builtin"` when the user selects `use-builtin-session`; takes precedence over `defaultRuleset` for all subsequent requests. Cleared implicitly when `configure-ruleset scope: session` is called with a non-null `rulesetPath`. | +| `defaultRuleset` | `RulesetConfig \| null` | Session-level default set via `set-ruleset-config scope: session`; `null` if not configured | +| `sessionRulesetOverride` | `"builtin" \| null` | Set to `"builtin"` when the user selects `use-builtin-session`; takes precedence over `defaultRuleset` for all subsequent requests. Cleared implicitly when `set-ruleset-config scope: session` is called with a non-null `rulesetPath`. | - Session-level Entra ID token cache (held by the MSAL `PublicClientApplication` instance) diff --git a/specs/007-ai-support/plan.md b/specs/007-ai-support/plan.md index 335a15c..bd799be 100644 --- a/specs/007-ai-support/plan.md +++ b/specs/007-ai-support/plan.md @@ -69,7 +69,7 @@ Deliver a new npm package (`@dawmatt/api-grade-mcp`) that exposes api-grade capa | VI. Educational Excellence | ✅ Pass | Auth failure recovery messages explain the failure reason and guide the user; tool descriptions updated to reflect configuration capability | | CI/CD Integration | ✅ Pass | No changes to CI/CD-oriented CLI behaviour | | YAGNI | ✅ Pass | Auth limited to GitHub PAT and Entra ID (other SSO schemes out of scope per spec); no remote URL spec fetching; no SSE transport; no additional MCP surfaces | -| AI Integration Requirements | ✅ Pass | `configure-ruleset` and `get-ruleset-config` are fully self-describing; all six tools discoverable without additional documentation | +| AI Integration Requirements | ✅ Pass | `set-ruleset-config` and `get-ruleset-config` are fully self-describing; all six tools discoverable without additional documentation | | Development Workflow | ✅ Pass | All tasks follow the existing phase/branch/PR pattern; T039 (cross-cutting grading tool update) is the highest-risk task and is explicitly flagged in tasks.md notes | Tool contracts confirmed to align with `GradeResult` and `Diagnostic` types from `api-grade-core` without requiring changes to the core package. `RulesetConfig`, `AuthConfig`, `SessionState`, `RulesetResolution`, and `AuthFailureRecoveryResponse` are all MCP-layer types defined in `packages/api-grade-mcp/src/`. @@ -96,7 +96,7 @@ docs/ ├── getting-started.md # UPDATE: extend MCP section to mention configuration capability ├── package/ │ ├── README.md # UPDATE: add @dawmatt/api-grade-mcp to monorepo packages table -│ └── api-grade-mcp.md # UPDATE: add configure-ruleset + get-ruleset-config tools; add configuration overview; link to docs/mcp/ +│ └── api-grade-mcp.md # UPDATE: add set-ruleset-config + get-ruleset-config tools; add configuration overview; link to docs/mcp/ └── mcp/ # NEW directory — user-facing MCP documentation (FR-025) ├── quick-start.md # NEW: polished install + host config guide for all 3 required environments ├── configuration.md # NEW: ruleset configuration reference (3 scopes, config files, GitHub PAT, Entra ID, env vars) @@ -115,7 +115,7 @@ packages/api-grade-mcp/ │ │ ├── grade-detailed.ts # grade-api-detailed tool │ │ ├── assert-grade.ts # assert-api-grade tool │ │ ├── non-breaking.ts # get-non-breaking-violations tool -│ │ ├── configure-ruleset.ts # configure-ruleset tool (US5) +│ │ ├── set-ruleset-config.ts # set-ruleset-config tool (US5) │ │ └── get-ruleset-config.ts # get-ruleset-config tool (US5) │ ├── config/ │ │ ├── ruleset-config.ts # Load/save RulesetConfig at session/workspace/global scope (US5) @@ -136,7 +136,7 @@ packages/api-grade-mcp/ │ ├── grade-detailed.test.ts │ ├── assert-grade.test.ts │ ├── non-breaking.test.ts -│ ├── configure-ruleset.test.ts # configure-ruleset tool tests (US5) +│ ├── set-ruleset-config.test.ts # set-ruleset-config tool tests (US5) │ └── get-ruleset-config.test.ts # get-ruleset-config tool tests (US5) ├── package.json # @dawmatt/api-grade-mcp; bin: api-grade-mcp └── tsconfig.json diff --git a/specs/007-ai-support/quickstart.md b/specs/007-ai-support/quickstart.md index 914667d..256ebf7 100644 --- a/specs/007-ai-support/quickstart.md +++ b/specs/007-ai-support/quickstart.md @@ -152,7 +152,7 @@ Once configured, the AI tool has access to six api-grade capabilities: | `grade-api-detailed` | Full grade with all violations and recommendations | | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | | `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | -| `configure-ruleset` | Set the default Spectral ruleset at session, workspace, or global scope | +| `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | | `get-ruleset-config` | Show the active ruleset configuration at all scopes | --- @@ -201,25 +201,25 @@ To avoid supplying the path on every request, configure a default ruleset instea ## Configuring a Default Ruleset -Use `configure-ruleset` to set a default so you never have to supply `rulesetPath` explicitly. +Use `set-ruleset-config` to set a default so you never have to supply `rulesetPath` explicitly. ### Session default (current session only) > Set the default ruleset for this session to `/workspace/rulesets/company-standards.yaml` -The AI calls `configure-ruleset` with `scope: "session"`. All subsequent grading requests use this ruleset automatically until the MCP server restarts. +The AI calls `set-ruleset-config` with `scope: "session"`. All subsequent grading requests use this ruleset automatically until the MCP server restarts. ### Workspace default (persisted to this project) > Set the workspace default ruleset to `https://github.example.com/org/standards/raw/main/ruleset.yaml` -The AI calls `configure-ruleset` with `scope: "workspace"`. The setting is saved to `.api-grade/config.json` in the project root and survives MCP server restarts. Commit this file to share the standard with your team. +The AI calls `set-ruleset-config` with `scope: "workspace"`. The setting is saved to `.api-grade/config.json` in the project root and survives MCP server restarts. Commit this file to share the standard with your team. ### Global default (all projects) > Set my global default ruleset to `/Users/jane/rulesets/personal-standards.yaml` -The AI calls `configure-ruleset` with `scope: "global"`. The setting is saved to `~/.api-grade/config.json` and applies to all projects unless overridden by a workspace or session default. +The AI calls `set-ruleset-config` with `scope: "global"`. The setting is saved to `~/.api-grade/config.json` and applies to all projects unless overridden by a workspace or session default. ### Checking the active configuration @@ -241,13 +241,13 @@ Set the `GITHUB_TOKEN` environment variable before starting the AI tool, or ask > Set the workspace default ruleset to `https://github.example.com/org/standards/raw/main/ruleset.yaml` with GitHub PAT authentication -The AI calls `configure-ruleset` with `auth: { type: "github-pat" }`. At runtime the server reads the token from the `GITHUB_TOKEN` environment variable. +The AI calls `set-ruleset-config` with `auth: { type: "github-pat" }`. At runtime the server reads the token from the `GITHUB_TOKEN` environment variable. ### Microsoft Entra ID (SharePoint / enterprise sites) > Set the workspace default ruleset to `https://mycompany.sharepoint.com/sites/api-standards/ruleset.yaml` with Entra ID authentication, tenant ID `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` and client ID `yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy` -The AI calls `configure-ruleset` with `auth: { type: "entra-id", tenantId: "...", clientId: "..." }`. On the next grading request the server will initiate the device-code flow and return a code for you to enter at `https://microsoft.com/devicelogin`. Once authenticated, the token is cached to `~/.api-grade/entra-token-cache.json` and reused on subsequent requests. +The AI calls `set-ruleset-config` with `auth: { type: "entra-id", tenantId: "...", clientId: "..." }`. On the next grading request the server will initiate the device-code flow and return a code for you to enter at `https://microsoft.com/devicelogin`. Once authenticated, the token is cached to `~/.api-grade/entra-token-cache.json` and reused on subsequent requests. ### When authentication fails @@ -288,7 +288,7 @@ You should see a JSON response listing all six tools. - Specifications over 500KB trigger a warning; grading still proceeds but detailed results may be truncated. Consider splitting large specs before grading. **`RULESET_AUTH_FAILED` on every grading request** -- The configured default ruleset is unreachable. Use `get-ruleset-config` to see what's configured, then either fix the auth (check `GITHUB_TOKEN` env var, reconnect to VPN) or clear the default with `configure-ruleset scope: session rulesetPath: null`. +- The configured default ruleset is unreachable. Use `get-ruleset-config` to see what's configured, then either fix the auth (check `GITHUB_TOKEN` env var, reconnect to VPN) or clear the default with `set-ruleset-config scope: session rulesetPath: null`. **Entra ID device-code flow not completing** - The code expires after a short window (typically 15 minutes). If you miss the window, retry the grading request — the server will initiate a new device-code flow. diff --git a/specs/007-ai-support/research.md b/specs/007-ai-support/research.md index b38e0b0..7496a46 100644 --- a/specs/007-ai-support/research.md +++ b/specs/007-ai-support/research.md @@ -204,7 +204,7 @@ The `expectedImprovement` is derived from the rule message and the rule's known ### Decision: Native `fetch` with `Authorization: Bearer` header; token from env var or session config -**Rationale**: Node 20+ includes `fetch` natively, so no additional HTTP client is needed. GitHub Enterprise raw file URLs use standard Bearer token auth. Token precedence: `GITHUB_TOKEN` environment variable → `auth.githubToken` supplied transiently on `configure-ruleset scope: session`. The token is never persisted to workspace or global config files (FR-021), so the workspace config stores only `auth.type: "github-pat"` as a hint. +**Rationale**: Node 20+ includes `fetch` natively, so no additional HTTP client is needed. GitHub Enterprise raw file URLs use standard Bearer token auth. Token precedence: `GITHUB_TOKEN` environment variable → `auth.githubToken` supplied transiently on `set-ruleset-config scope: session`. The token is never persisted to workspace or global config files (FR-021), so the workspace config stores only `auth.type: "github-pat"` as a hint. **Implementation pattern**: ```typescript @@ -356,13 +356,13 @@ export function createServer(): McpServer { registerGradeDetailedTool(server, sessionState); registerAssertGradeTool(server, sessionState); registerNonBreakingTool(server, sessionState); - registerConfigureRulesetTool(server, sessionState); + registerSetRulesetConfigTool(server, sessionState); registerGetRulesetConfigTool(server, sessionState); return server; } ``` -**`sessionRulesetOverride` clearing rule** (clarified 2026-06-19): A `configure-ruleset scope: session` call with a non-null `rulesetPath` MUST set `sessionRulesetOverride` to `null` — the user is explicitly configuring a default, which supersedes the "use built-in" session override. Calling `configure-ruleset` with `rulesetPath: null` does NOT clear the override (it only clears `defaultRuleset`). +**`sessionRulesetOverride` clearing rule** (clarified 2026-06-19): A `set-ruleset-config scope: session` call with a non-null `rulesetPath` MUST set `sessionRulesetOverride` to `null` — the user is explicitly configuring a default, which supersedes the "use built-in" session override. Calling `set-ruleset-config` with `rulesetPath: null` does NOT clear the override (it only clears `defaultRuleset`). **Alternatives considered**: Class-based server with state as instance fields — heavier abstraction with no benefit at this scale; rejected per YAGNI. diff --git a/specs/007-ai-support/spec.md b/specs/007-ai-support/spec.md index 5760e75..620262c 100644 --- a/specs/007-ai-support/spec.md +++ b/specs/007-ai-support/spec.md @@ -24,7 +24,7 @@ - Q: Should Entra ID tokens be persisted across MCP server restarts? → A: Yes — cache to disk at `~/.api-grade/entra-token-cache.json` using MSAL Node's `TokenCacheContext` API. Persisted to the user home directory only (never the workspace), consistent with Azure CLI behaviour. - Q: What does a grading tool return when the user selects the `cancel` recovery option? → A: A structured error response with code `REQUEST_CANCELLED` and a human-readable message — consistent with all other terminal error shapes. - Q: What timeout applies when fetching a remote ruleset? → A: 5 seconds on the initial attempt (ensuring the auth-failure recovery response arrives well within SC-001's 10-second budget); 30 seconds when the user explicitly selects the `retry` recovery option (acknowledging they are willing to wait). -- Q: How is the `use-builtin-session` recovery choice represented in session state without conflating it with "no default configured"? → A: A separate `sessionRulesetOverride: "builtin" | null` field on `SessionState`. When set to `"builtin"`, all grading tools bypass configured defaults for the remainder of the session. A subsequent `configure-ruleset scope: session` call with a non-null `rulesetPath` clears the override implicitly; `configure-ruleset` with `rulesetPath: null` does not clear the override. +- Q: How is the `use-builtin-session` recovery choice represented in session state without conflating it with "no default configured"? → A: A separate `sessionRulesetOverride: "builtin" | null` field on `SessionState`. When set to `"builtin"`, all grading tools bypass configured defaults for the remainder of the session. A subsequent `set-ruleset-config scope: session` call with a non-null `rulesetPath` clears the override implicitly; `set-ruleset-config` with `rulesetPath: null` does not clear the override. --- @@ -88,9 +88,9 @@ A developer using the api-grade MCP server wants to set a default ruleset that a **Acceptance Scenarios**: -1. **Given** an AI tool calls `configure-ruleset` with `scope: "session"` and a ruleset path, **When** a subsequent `grade-api` call is made without a `rulesetPath`, **Then** grading uses the session-configured ruleset and `rulesetSource` in the response reflects it. -2. **Given** an AI tool calls `configure-ruleset` with `scope: "workspace"`, **When** the MCP server is restarted in the same workspace, **Then** the workspace-level default is still active and applied to grading requests. -3. **Given** an AI tool calls `configure-ruleset` with `scope: "global"`, **When** grading is requested from a different workspace with no workspace-level config, **Then** the global default ruleset is applied. +1. **Given** an AI tool calls `set-ruleset-config` with `scope: "session"` and a ruleset path, **When** a subsequent `grade-api` call is made without a `rulesetPath`, **Then** grading uses the session-configured ruleset and `rulesetSource` in the response reflects it. +2. **Given** an AI tool calls `set-ruleset-config` with `scope: "workspace"`, **When** the MCP server is restarted in the same workspace, **Then** the workspace-level default is still active and applied to grading requests. +3. **Given** an AI tool calls `set-ruleset-config` with `scope: "global"`, **When** grading is requested from a different workspace with no workspace-level config, **Then** the global default ruleset is applied. 4. **Given** session, workspace, and global defaults are all configured, **When** a `grade-api` call is made without an explicit `rulesetPath`, **Then** the session-level default takes precedence over workspace and global defaults. 5. **Given** a per-request `rulesetPath` is supplied, **When** the `grade-api` tool is invoked, **Then** the per-request path takes precedence over all configured defaults. 6. **Given** a default ruleset is configured with a GitHub Enterprise URL and a valid PAT, **When** a grading request is made, **Then** the ruleset is fetched successfully using the token and grading proceeds. @@ -140,7 +140,7 @@ A developer using an AI assistant not only wants to know which issues are affect - **FR-012**: For each non-breaking violation returned, the system MUST include sufficient context (violation rule, affected location, current value if present, expected improvement) for the AI to generate a correct fix without needing to re-parse the specification. - **FR-008**: The system MUST return structured error responses (not unhandled exceptions) when invoked with invalid inputs such as missing files, invalid grade values, or inaccessible rulesets. - **FR-013**: When an API specification exceeds a defined size threshold, the system MUST still attempt grading and return a best-effort result with a warning field indicating the specification is large and that results may be incomplete. -- **FR-015**: The system MUST provide a `configure-ruleset` MCP tool that sets a default ruleset at a specified scope (`session`, `workspace`, or `global`). Session-level configuration is held in memory and resets when the MCP server process restarts. Workspace-level configuration is persisted to `.api-grade/config.json` relative to the MCP server's working directory (CWD), which MCP hosts set to the workspace root. Global configuration is persisted to `~/.api-grade/config.json`. +- **FR-015**: The system MUST provide a `set-ruleset-config` MCP tool that sets a default ruleset at a specified scope (`session`, `workspace`, or `global`). Session-level configuration is held in memory and resets when the MCP server process restarts. Workspace-level configuration is persisted to `.api-grade/config.json` relative to the MCP server's working directory (CWD), which MCP hosts set to the workspace root. Global configuration is persisted to `~/.api-grade/config.json`. - **FR-016**: The system MUST provide a `get-ruleset-config` MCP tool that returns the currently active ruleset configuration at every scope (session, workspace, global) and indicates which scope is currently in effect (the effective ruleset). - **FR-017**: Ruleset resolution MUST follow this strict precedence order, from most to least specific: (1) per-request `rulesetPath` parameter → (2) session-level default → (3) workspace-level default → (4) global default → (5) built-in default. The first configured source in this order is used. - **FR-018**: The system MUST support GitHub Enterprise token-based authentication (PAT) when fetching rulesets from GitHub Enterprise URLs. The token MUST be sourced from the `GITHUB_TOKEN` environment variable if present, or from an `auth.githubToken` field in the workspace or global config file. Bearer token authentication uses an `Authorization: Bearer ` HTTP header. @@ -177,7 +177,7 @@ A developer using an AI assistant not only wants to know which issues are affect - **SC-004**: Grade assertion correctly identifies pass/fail for all valid grade levels (A through F) with 100% accuracy. - **SC-005**: An AI tool applying non-breaking fixes produces a corrected specification where all targeted violations are resolved and no breaking changes are introduced, as verified by re-grading. - **SC-006**: All MCP tool definitions are self-describing — a capable AI tool can discover and invoke all grading capabilities correctly using only the tool definitions, with no additional documentation required. -- **SC-007**: A developer can configure a workspace-level default ruleset once via `configure-ruleset`, restart the MCP server, and confirm that all subsequent grading requests in that workspace use the configured ruleset without re-supplying the path. +- **SC-007**: A developer can configure a workspace-level default ruleset once via `set-ruleset-config`, restart the MCP server, and confirm that all subsequent grading requests in that workspace use the configured ruleset without re-supplying the path. - **SC-008**: When a configured default ruleset requires authentication and credentials are unavailable or invalid, 100% of grading requests return the four structured recovery options rather than an unhandled error or silent fallback to the built-in default. - **SC-009**: A developer unfamiliar with the MCP server can configure a workspace-level default ruleset with Entra ID authentication using only the published documentation under `docs/mcp/`, without consulting source code or design artefacts in `specs/`. diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index 677eced..1a8543c 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -108,9 +108,9 @@ ## Phase 6: User Story 5 — Configure Default Ruleset (Priority: P2) -**Goal**: Expose `configure-ruleset` and `get-ruleset-config` tools; add config/auth modules; update all four grading tools to support the 5-level precedence chain, remote ruleset fetching, auth failure recovery, and the `recoveryOption` parameter. +**Goal**: Expose `set-ruleset-config` and `get-ruleset-config` tools; add config/auth modules; update all four grading tools to support the 5-level precedence chain, remote ruleset fetching, auth failure recovery, and the `recoveryOption` parameter. -**Independent Test**: Call `configure-ruleset` with `scope: "session"` and a local ruleset path → confirm `get-ruleset-config` reports the session default as effective. Restart the server; configure `scope: "workspace"` → confirm the workspace config file exists at `.api-grade/config.json` and subsequent `grade-api` calls use it. Call with a GitHub Enterprise URL + `auth: { type: "github-pat" }` → confirm `GITHUB_TOKEN` env var is used for the fetch. Call with an unreachable URL → confirm `AuthFailureRecoveryResponse` with four recovery options arrives within 10 seconds. +**Independent Test**: Call `set-ruleset-config` with `scope: "session"` and a local ruleset path → confirm `get-ruleset-config` reports the session default as effective. Restart the server; configure `scope: "workspace"` → confirm the workspace config file exists at `.api-grade/config.json` and subsequent `grade-api` calls use it. Call with a GitHub Enterprise URL + `auth: { type: "github-pat" }` → confirm `GITHUB_TOKEN` env var is used for the fetch. Call with an unreachable URL → confirm `AuthFailureRecoveryResponse` with four recovery options arrives within 10 seconds. ### Tests for User Story 5 @@ -118,7 +118,7 @@ - [X] T020 [P] [US5] Create `packages/api-grade-mcp/tests/unit/ruleset-config.test.ts` unit tests for `config/ruleset-config.ts`: load from non-existent file returns `null`; write then re-read at workspace path returns correct `RulesetConfig`; write then re-read at global path (`os.homedir()`) returns correct config; write error (unwritable path) throws `CONFIG_WRITE_ERROR` - [X] T021 [P] [US5] Create `packages/api-grade-mcp/tests/unit/resolve-ruleset.test.ts` unit tests for all 5-level precedence scenarios: per-request wins over all others; `sessionRulesetOverride: "builtin"` short-circuits to built-in immediately; session default wins over workspace and global; workspace wins over global; global wins over built-in; all null → built-in -- [X] T022 [P] [US5] Create `packages/api-grade-mcp/tests/integration/configure-ruleset.test.ts` integration tests for `configure-ruleset`: `scope: "session"` stores in `SessionState.defaultRuleset`; `scope: "workspace"` writes `.api-grade/config.json`; `scope: "global"` writes `~/.api-grade/config.json`; `rulesetPath: null` clears the scope; `auth.type: "entra-id"` without `tenantId`/`clientId` → `INVALID_AUTH_CONFIG`; unwritable workspace path → `CONFIG_WRITE_ERROR` +- [X] T022 [P] [US5] Create `packages/api-grade-mcp/tests/integration/set-ruleset-config.test.ts` integration tests for `set-ruleset-config`: `scope: "session"` stores in `SessionState.defaultRuleset`; `scope: "workspace"` writes `.api-grade/config.json`; `scope: "global"` writes `~/.api-grade/config.json`; `rulesetPath: null` clears the scope; `auth.type: "entra-id"` without `tenantId`/`clientId` → `INVALID_AUTH_CONFIG`; unwritable workspace path → `CONFIG_WRITE_ERROR` - [X] T023 [P] [US5] Create `packages/api-grade-mcp/tests/integration/get-ruleset-config.test.ts` integration tests for `get-ruleset-config`: no defaults configured → all scopes null, effective is built-in; session only → effective is session; workspace only → effective is workspace; session + workspace → effective is session (precedence); response never includes raw token values ### Implementation for User Story 5 @@ -127,10 +127,10 @@ - [X] T025 [US5] Implement `packages/api-grade-mcp/src/config/resolve-ruleset.ts` exporting `resolveRuleset(perRequestPath, sessionState, workspaceConfig, globalConfig): RulesetResolution` implementing the 5-level precedence chain from FR-017; `sessionRulesetOverride: "builtin"` on `SessionState` short-circuits immediately to `{ scope: "built-in", rulesetPath: null, auth: null }`; first non-null source wins - [X] T026 [US5] Implement `packages/api-grade-mcp/src/auth/github.ts` exporting `fetchRulesetWithGithubPat(url, token, timeoutMs): Promise` using native `fetch`, `AbortController`, `Authorization: Bearer` header; maps HTTP 401/403 → throws `RulesetAuthError("auth-failed")`; abort (`AbortError`) → throws `RulesetAuthError("network-unreachable")`; export `INITIAL_FETCH_TIMEOUT_MS = 5_000` and `RETRY_FETCH_TIMEOUT_MS = 30_000` - [X] T027 [US5] Implement `packages/api-grade-mcp/src/auth/entra.ts` exporting `acquireEntraToken(tenantId, clientId): Promise` using `@azure/msal-node` `PublicClientApplication` with disk-persisted token cache at `~/.api-grade/entra-token-cache.json` via `cachePlugin` (`beforeCacheAccess`/`afterCacheAccess`); tries silent acquisition first; on cache miss throws `EntraAuthRequired(userCode, verificationUri, expiresIn)` via `deviceCodeCallback`; never opens browser directly -- [X] T028 [US5] Implement `packages/api-grade-mcp/src/tools/configure-ruleset.ts` exporting `registerConfigureRulesetTool(server, sessionState)`: registers `configure-ruleset` with Zod schema (`scope` enum required, `rulesetPath` optional string/null, `auth` object optional); validates `entra-id` requires `tenantId` + `clientId`; for `session` scope updates `sessionState.defaultRuleset` and clears `sessionState.sessionRulesetOverride` when `rulesetPath` is non-null (per research.md clearing rule); for `workspace`/`global` calls appropriate `saveXxxConfig()`; returns confirmation with `configFile` path for persistent scopes +- [X] T028 [US5] Implement `packages/api-grade-mcp/src/tools/set-ruleset-config.ts` exporting `registerSetRulesetConfigTool(server, sessionState)`: registers `set-ruleset-config` with Zod schema (`scope` enum required, `rulesetPath` optional string/null, `auth` object optional); validates `entra-id` requires `tenantId` + `clientId`; for `session` scope updates `sessionState.defaultRuleset` and clears `sessionState.sessionRulesetOverride` when `rulesetPath` is non-null (per research.md clearing rule); for `workspace`/`global` calls appropriate `saveXxxConfig()`; returns confirmation with `configFile` path for persistent scopes - [X] T029 [US5] Implement `packages/api-grade-mcp/src/tools/get-ruleset-config.ts` exporting `registerGetRulesetConfigTool(server, sessionState)`: registers `get-ruleset-config` (no required inputs); loads workspace and global configs; calls `resolveRuleset()` to determine effective scope; returns all scopes, effective scope, `precedenceOrder`, and `note` about per-request precedence; strips raw token values from `auth` fields (shows only `tokenSource: "config-file" | "env-var" | "none"`) - [X] T030 [US5] ⚠️ Update `packages/api-grade-mcp/src/tools/grade.ts`, `grade-detailed.ts`, and `assert-grade.ts` to accept `recoveryOption` optional parameter (enum `["retry","use-builtin-once","use-builtin-session","cancel"]`); call `resolveRuleset()` before each `GradeEngine.grade()` call; if resolved to a remote URL fetch it using the correct auth module with `INITIAL_FETCH_TIMEOUT_MS` (or `RETRY_FETCH_TIMEOUT_MS` when `recoveryOption: "retry"`); on fetch failure return `AuthFailureRecoveryResponse`; on `recoveryOption: "use-builtin-session"` set `sessionState.sessionRulesetOverride = "builtin"`; on `recoveryOption: "cancel"` return `REQUEST_CANCELLED` error — **highest-risk task; touches all grading tools** -- [X] T031 [US5] Wire all US5 tools into `packages/api-grade-mcp/src/server.ts` `createServer()`: replace stubs with real `registerConfigureRulesetTool(server, sessionState)` and `registerGetRulesetConfigTool(server, sessionState)` calls; load workspace and global configs at server startup and pass to each grading tool registration +- [X] T031 [US5] Wire all US5 tools into `packages/api-grade-mcp/src/server.ts` `createServer()`: replace stubs with real `registerSetRulesetConfigTool(server, sessionState)` and `registerGetRulesetConfigTool(server, sessionState)` calls; load workspace and global configs at server startup and pass to each grading tool registration **Checkpoint**: All six tools registered. Session, workspace, and global ruleset configuration works. Auth failure returns four recovery options. Run all unit and integration tests and confirm all pass. @@ -170,7 +170,7 @@ - [X] T041 [P] Update `docs/index.md` to add MCP Server rows (overview, configuration reference, troubleshooting, quick-start) alongside the existing CLI and Backstage integration rows - [X] T042 [P] Update `docs/getting-started.md` to extend the MCP section to mention default ruleset configuration capability and link to `docs/mcp/configuration.md` - [X] T043 [P] Update `docs/package/README.md` to add `@dawmatt/api-grade-mcp` to the monorepo packages table -- [ ] T044 Verify all six MCP tools function correctly in all three required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `get-non-breaking-violations`, `configure-ruleset`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work; (3) GitHub Copilot Studio — configure as custom MCP Action and confirm grading succeeds (FR-014, SC-002, SC-006) — **see [`checklists/t044-verification.md`](checklists/t044-verification.md) for step-by-step verification checklist per environment** +- [ ] T044 Verify all six MCP tools function correctly in all three required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `get-non-breaking-violations`, `set-ruleset-config`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work; (3) GitHub Copilot Studio — configure as custom MCP Action and confirm grading succeeds (FR-014, SC-002, SC-006) — **see [`checklists/t044-verification.md`](checklists/t044-verification.md) for step-by-step verification checklist per environment** --- @@ -219,7 +219,7 @@ # All four US5 test files can be written simultaneously: Task T020: tests/unit/ruleset-config.test.ts Task T021: tests/unit/resolve-ruleset.test.ts -Task T022: tests/integration/configure-ruleset.test.ts +Task T022: tests/integration/set-ruleset-config.test.ts Task T023: tests/integration/get-ruleset-config.test.ts ``` @@ -249,7 +249,7 @@ Task T027: src/auth/entra.ts 2. US1 → `grade-api` working → MCP server usable for basic grading (MVP!) 3. US2 → `assert-api-grade` working → grade assertion available to AI tools 4. US3 → `grade-api-detailed` working → full diagnostics available -5. US5 → `configure-ruleset` + `get-ruleset-config` + auth → enterprise adoption unlocked +5. US5 → `set-ruleset-config` + `get-ruleset-config` + auth → enterprise adoption unlocked 6. US4 → `get-non-breaking-violations` working → AI-assisted fixing unlocked 7. Polish → documentation + three-environment verification → feature shippable @@ -258,7 +258,7 @@ Task T027: src/auth/entra.ts After Foundational phase is complete: - **Developer A**: US1 (grade-api) → US4 (non-breaking, uses classifier) - **Developer B**: US2 (assert-api-grade) + US3 (grade-api-detailed) -- **Developer C**: US5 (configure-ruleset, config/auth modules) +- **Developer C**: US5 (set-ruleset-config, config/auth modules) - All converge for T030 (cross-cutting grading tool update) and Phase 8 (verification + docs) --- From 326cc730c7165d727130746c3c2a845ad0691bd9 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Fri, 19 Jun 2026 14:23:23 +1000 Subject: [PATCH 08/20] Renamed tool to grade-api-quick-fixes-only --- CONTRIBUTING.md | 2 +- docs/getting-started.md | 2 +- docs/mcp/README.md | 4 +-- docs/mcp/quick-start.md | 4 +-- docs/package/api-grade-mcp.md | 6 ++-- packages/api-grade-mcp/README.md | 4 +-- packages/api-grade-mcp/src/server.ts | 4 +-- .../{non-breaking.ts => quick-fixes-only.ts} | 16 ++++----- packages/api-grade-mcp/src/utils/classify.ts | 6 ++-- ...aking.test.ts => quick-fixes-only.test.ts} | 34 +++++++++---------- specs/007-ai-support/contracts/mcp-tools.md | 20 +++++------ specs/007-ai-support/data-model.md | 12 +++---- specs/007-ai-support/plan.md | 4 +-- specs/007-ai-support/quickstart.md | 10 +++--- specs/007-ai-support/research.md | 16 ++++----- specs/007-ai-support/spec.md | 28 +++++++-------- specs/007-ai-support/tasks.md | 18 +++++----- 17 files changed, 95 insertions(+), 95 deletions(-) rename packages/api-grade-mcp/src/tools/{non-breaking.ts => quick-fixes-only.ts} (88%) rename packages/api-grade-mcp/tests/integration/{non-breaking.test.ts => quick-fixes-only.test.ts} (68%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9e2845b..e2249a9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,7 +68,7 @@ tests/ |---------|------|-------------| | `@dawmatt/api-grade` | `/` (root) | CLI tool (`api-grade` binary) | | `@dawmatt/api-grade-core` | `packages/api-grade-core/` | Standalone grading library used by all other packages | -| `@dawmatt/api-grade-mcp` | `packages/api-grade-mcp/` | MCP server exposing six AI tools (`grade-api`, `grade-api-detailed`, `assert-api-grade`, `get-non-breaking-violations`, `set-ruleset-config`, `get-ruleset-config`) | +| `@dawmatt/api-grade-mcp` | `packages/api-grade-mcp/` | MCP server exposing six AI tools (`grade-api`, `grade-api-detailed`, `assert-api-grade`, `grade-api-quick-fixes-only`, `set-ruleset-config`, `get-ruleset-config`) | | `@dawmatt/backstage-plugin-api-grade` | `packages/backstage-plugin-api-grade/` | Backstage frontend card plugin | | `@dawmatt/backstage-plugin-api-grade-backend` | `packages/backstage-plugin-api-grade-backend/` | Backstage backend grading plugin | diff --git a/docs/getting-started.md b/docs/getting-started.md index 4cbd689..df2f1ad 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -55,7 +55,7 @@ Two Backstage plugin packages that display API grades directly on your Backstage ### MCP Server (`@dawmatt/api-grade-mcp`) -An MCP (Model Context Protocol) server that exposes api-grade as six AI tools: `grade-api`, `grade-api-detailed`, `assert-api-grade`, `get-non-breaking-violations`, `set-ruleset-config`, and `get-ruleset-config`. Register it in Claude Code, GitHub Copilot (VS Code Agent mode), or any MCP-compatible AI host and let the AI grade specs directly. +An MCP (Model Context Protocol) server that exposes api-grade as six AI tools: `grade-api`, `grade-api-detailed`, `assert-api-grade`, `grade-api-quick-fixes-only`, `set-ruleset-config`, and `get-ruleset-config`. Register it in Claude Code, GitHub Copilot (VS Code Agent mode), or any MCP-compatible AI host and let the AI grade specs directly. ```bash claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp diff --git a/docs/mcp/README.md b/docs/mcp/README.md index a6fd0e4..0dc57e1 100644 --- a/docs/mcp/README.md +++ b/docs/mcp/README.md @@ -8,7 +8,7 @@ Grade OpenAPI and AsyncAPI specifications directly from your AI tool — Claude ## Overview -`@dawmatt/api-grade-mcp` is an MCP (Model Context Protocol) server that wraps the `@dawmatt/api-grade-core` grading engine and exposes it as six MCP tools. Once registered in an AI host, the AI can grade specs, assert grade thresholds, retrieve detailed diagnostics, obtain a classified list of fixable non-breaking violations, and manage a default ruleset — all without manual CLI invocation. +`@dawmatt/api-grade-mcp` is an MCP (Model Context Protocol) server that wraps the `@dawmatt/api-grade-core` grading engine and exposes it as six MCP tools. Once registered in an AI host, the AI can grade specs, assert grade thresholds, retrieve detailed diagnostics, obtain a classified list of quick fixes (safe, non-breaking improvements), and manage a default ruleset — all without manual CLI invocation. ``` AI tool (Claude Code, Copilot, etc.) @@ -27,7 +27,7 @@ AI tool (Claude Code, Copilot, etc.) | `grade-api` | Letter grade, score, and summary — token-efficient overview | | `grade-api-detailed` | Full grade with all violations and diagnostics | | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | -| `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | +| `grade-api-quick-fixes-only` | Classified list of quick fixes (safe, non-breaking improvements) for AI-assisted correction | | `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | | `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | diff --git a/docs/mcp/quick-start.md b/docs/mcp/quick-start.md index 568ac7b..53cecbb 100644 --- a/docs/mcp/quick-start.md +++ b/docs/mcp/quick-start.md @@ -138,7 +138,7 @@ Reload Cursor after saving. | `grade-api` | Quick grade: letter grade, numeric score, and summary | | `grade-api-detailed` | Full grade with all violations, diagnostics, and recommendations | | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | -| `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | +| `grade-api-quick-fixes-only` | Classified list of quick fixes (safe, non-breaking improvements) for AI-assisted correction | | `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | | `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | @@ -158,7 +158,7 @@ Once configured, ask your AI tool naturally: > Check whether `/workspace/my-api/openapi.yaml` meets a minimum grade of B **AI-assisted fix:** -> Fix the non-breaking issues in `/workspace/my-api/openapi.yaml` +> Apply quick fixes to `/workspace/my-api/openapi.yaml` --- diff --git a/docs/package/api-grade-mcp.md b/docs/package/api-grade-mcp.md index b0dc8d4..6d046b6 100644 --- a/docs/package/api-grade-mcp.md +++ b/docs/package/api-grade-mcp.md @@ -112,13 +112,13 @@ Assert that an API specification meets a minimum grade threshold (A > B > C > D --- -### `get-non-breaking-violations` +### `grade-api-quick-fixes-only` -Return a classified, AI-actionable list of non-breaking violations — those whose fixes do not alter paths, methods, required parameters, schema types, or response structures. Each violation includes `ruleId`, `path`, `location`, `currentValue`, and `expectedImprovement`. +Return a classified, AI-actionable list of quick fixes — improvements that can be made via non-breaking changes (those that do not alter paths, methods, required parameters, schema types, or response structures). Each quick fix includes `ruleId`, `path`, `location`, `currentValue`, and `expectedImprovement`. **Input**: `specPath` (required), `rulesetPath` (optional), `recoveryOption` (optional) -**Use when**: Asking the AI to generate fixes for documentation and metadata issues without risking breaking changes. +**Use when**: Asking the AI to generate fixes for documentation and metadata issues without risking breaking changes. Use this tool instead of `grade-api-detailed` when the goal is AI-assisted correction. --- diff --git a/packages/api-grade-mcp/README.md b/packages/api-grade-mcp/README.md index 645339b..586749f 100644 --- a/packages/api-grade-mcp/README.md +++ b/packages/api-grade-mcp/README.md @@ -60,7 +60,7 @@ Create `.vscode/mcp.json` in your project root: | `grade-api` | Letter grade, score, and summary — token-efficient overview | | `grade-api-detailed` | Full grade with all violations and diagnostics | | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | -| `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | +| `grade-api-quick-fixes-only` | Classified list of quick fixes (safe, non-breaking improvements) for AI-assisted correction | | `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | | `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | @@ -77,7 +77,7 @@ Check whether /workspace/my-api/openapi.yaml meets a minimum grade of B ``` ``` -Fix the non-breaking issues in /workspace/my-api/openapi.yaml +Apply quick fixes to /workspace/my-api/openapi.yaml ``` ``` diff --git a/packages/api-grade-mcp/src/server.ts b/packages/api-grade-mcp/src/server.ts index 9fec844..95721bd 100644 --- a/packages/api-grade-mcp/src/server.ts +++ b/packages/api-grade-mcp/src/server.ts @@ -5,7 +5,7 @@ import { resolve, dirname } from 'node:path'; import { registerGradeTool } from './tools/grade.js'; import { registerAssertGradeTool } from './tools/assert-grade.js'; import { registerGradeDetailedTool } from './tools/grade-detailed.js'; -import { registerNonBreakingTool } from './tools/non-breaking.js'; +import { registerQuickFixesOnlyTool } from './tools/quick-fixes-only.js'; import { registerSetRulesetConfigTool } from './tools/set-ruleset-config.js'; import { registerGetRulesetConfigTool } from './tools/get-ruleset-config.js'; import type { SessionState } from './types.js'; @@ -27,7 +27,7 @@ export function createServer(): McpServer { registerGradeTool(server, sessionState); registerAssertGradeTool(server, sessionState); registerGradeDetailedTool(server, sessionState); - registerNonBreakingTool(server, sessionState); + registerQuickFixesOnlyTool(server, sessionState); registerSetRulesetConfigTool(server, sessionState); registerGetRulesetConfigTool(server, sessionState); return server; diff --git a/packages/api-grade-mcp/src/tools/non-breaking.ts b/packages/api-grade-mcp/src/tools/quick-fixes-only.ts similarity index 88% rename from packages/api-grade-mcp/src/tools/non-breaking.ts rename to packages/api-grade-mcp/src/tools/quick-fixes-only.ts index 249cd11..45a1f60 100644 --- a/packages/api-grade-mcp/src/tools/non-breaking.ts +++ b/packages/api-grade-mcp/src/tools/quick-fixes-only.ts @@ -9,15 +9,15 @@ import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config. import { resolveRuleset } from '../config/resolve-ruleset.js'; import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; import { EntraAuthRequired, acquireEntraToken } from '../auth/entra.js'; -import { classifyViolation, buildNonBreakingViolation } from '../utils/classify.js'; +import { classifyViolation, buildQuickFix } from '../utils/classify.js'; import type { SessionState } from '../types.js'; const LARGE_SPEC_THRESHOLD_BYTES = 500_000; -export function registerNonBreakingTool(server: McpServer, sessionState: SessionState): void { +export function registerQuickFixesOnlyTool(server: McpServer, sessionState: SessionState): void { server.tool( - 'get-non-breaking-violations', - 'Return a classified, AI-actionable list of non-breaking violations in an API specification. Non-breaking violations are those whose fixes do not alter the API interface contract (paths, methods, required parameters, schema types, or response structures). Use this tool to obtain issues the AI can safely resolve — the AI generates the corrected specification content; the MCP server does not modify files.', + 'grade-api-quick-fixes-only', + 'Return a classified, AI-actionable list of quick fixes for an API specification. Quick fixes are improvements that can be made via non-breaking changes — those that do not alter the API interface contract (paths, methods, required parameters, schema types, or response structures). Use this tool (not grade-api-detailed) when the goal is for the AI to safely resolve violations; the AI generates the corrected specification content and the MCP server does not modify files.', { specPath: z .string() @@ -129,16 +129,16 @@ export function registerNonBreakingTool(server: McpServer, sessionState: Session const engine = new GradeEngine(); const result = await engine.grade({ specPath, rulesetPath: effectiveRulesetPath }); - const nonBreakingViolations = result.diagnostics + const quickFixes = result.diagnostics .filter((d) => classifyViolation(d) === 'nonBreaking') - .map((d) => buildNonBreakingViolation(d, specContent)); + .map((d) => buildQuickFix(d, specContent)); const response: Record = { specPath: result.specPath, format: result.format, totalViolations: result.diagnostics.length, - nonBreakingCount: nonBreakingViolations.length, - nonBreakingViolations, + quickFixCount: quickFixes.length, + quickFixes, }; if (largeSpecWarning) { diff --git a/packages/api-grade-mcp/src/utils/classify.ts b/packages/api-grade-mcp/src/utils/classify.ts index 8bc88eb..10c7598 100644 --- a/packages/api-grade-mcp/src/utils/classify.ts +++ b/packages/api-grade-mcp/src/utils/classify.ts @@ -68,7 +68,7 @@ const SEVERITY_LABELS: Record = { 3: 'hint', }; -export interface NonBreakingViolation { +export interface QuickFix { ruleId: string; message: string; severity: string; @@ -78,10 +78,10 @@ export interface NonBreakingViolation { expectedImprovement: string; } -export function buildNonBreakingViolation( +export function buildQuickFix( diagnostic: Diagnostic, specContent: string -): NonBreakingViolation { +): QuickFix { const path = (diagnostic.path ?? []) as string[]; const location = path.join('.'); diff --git a/packages/api-grade-mcp/tests/integration/non-breaking.test.ts b/packages/api-grade-mcp/tests/integration/quick-fixes-only.test.ts similarity index 68% rename from packages/api-grade-mcp/tests/integration/non-breaking.test.ts rename to packages/api-grade-mcp/tests/integration/quick-fixes-only.test.ts index b99d4d2..941d466 100644 --- a/packages/api-grade-mcp/tests/integration/non-breaking.test.ts +++ b/packages/api-grade-mcp/tests/integration/quick-fixes-only.test.ts @@ -17,24 +17,24 @@ async function callTool(server: ReturnType, toolName: strin return tool.handler(args, {}) as Promise<{ content: [{ type: string; text: string }]; isError?: boolean }>; } -describe('get-non-breaking-violations tool', () => { - it('returns non-empty nonBreakingViolations for a spec with documentation gaps', async () => { +describe('grade-api-quick-fixes-only tool', () => { + it('returns non-empty quickFixes for a spec with documentation gaps (quick fix opportunities)', async () => { const server = createServer(); - const result = await callTool(server, 'get-non-breaking-violations', { specPath: OPENAPI_POOR }); + const result = await callTool(server, 'grade-api-quick-fixes-only', { specPath: OPENAPI_POOR }); expect(result.isError).toBeFalsy(); const body = JSON.parse(result.content[0].text); - expect(body).toHaveProperty('nonBreakingViolations'); - expect(body).toHaveProperty('nonBreakingCount'); + expect(body).toHaveProperty('quickFixes'); + expect(body).toHaveProperty('quickFixCount'); expect(body).toHaveProperty('totalViolations'); }); it('each violation has all required fields', async () => { const server = createServer(); - const result = await callTool(server, 'get-non-breaking-violations', { specPath: OPENAPI_POOR }); + const result = await callTool(server, 'grade-api-quick-fixes-only', { specPath: OPENAPI_POOR }); expect(result.isError).toBeFalsy(); const body = JSON.parse(result.content[0].text); - if (body.nonBreakingViolations.length > 0) { - const v = body.nonBreakingViolations[0]; + if (body.quickFixes.length > 0) { + const v = body.quickFixes[0]; expect(v).toHaveProperty('ruleId'); expect(v).toHaveProperty('message'); expect(v).toHaveProperty('severity'); @@ -47,29 +47,29 @@ describe('get-non-breaking-violations tool', () => { } }); - it('no violation in nonBreakingViolations is a breaking change', async () => { + it('no violation in quickFixes is a breaking change', async () => { const server = createServer(); - const result = await callTool(server, 'get-non-breaking-violations', { specPath: OPENAPI_POOR }); + const result = await callTool(server, 'grade-api-quick-fixes-only', { specPath: OPENAPI_POOR }); expect(result.isError).toBeFalsy(); const body = JSON.parse(result.content[0].text); - for (const v of body.nonBreakingViolations) { + for (const v of body.quickFixes) { expect(v.path).not.toContain('required'); expect(v.path).not.toContain('type'); } }); - it('nonBreakingCount matches nonBreakingViolations length', async () => { + it('quickFixCount matches quickFixes length', async () => { const server = createServer(); - const result = await callTool(server, 'get-non-breaking-violations', { specPath: OPENAPI_MUSEUM }); + const result = await callTool(server, 'grade-api-quick-fixes-only', { specPath: OPENAPI_MUSEUM }); expect(result.isError).toBeFalsy(); const body = JSON.parse(result.content[0].text); - expect(typeof body.nonBreakingCount).toBe('number'); - expect(body.nonBreakingCount).toBe(body.nonBreakingViolations.length); + expect(typeof body.quickFixCount).toBe('number'); + expect(body.quickFixCount).toBe(body.quickFixes.length); }); it('returns RULESET_NOT_FOUND for non-existent local ruleset', async () => { const server = createServer(); - const result = await callTool(server, 'get-non-breaking-violations', { + const result = await callTool(server, 'grade-api-quick-fixes-only', { specPath: OPENAPI_POOR, rulesetPath: '/nonexistent/ruleset.yaml', }); @@ -80,7 +80,7 @@ describe('get-non-breaking-violations tool', () => { it('returns SPEC_NOT_FOUND for non-existent spec', async () => { const server = createServer(); - const result = await callTool(server, 'get-non-breaking-violations', { specPath: '/no/such/file.yaml' }); + const result = await callTool(server, 'grade-api-quick-fixes-only', { specPath: '/no/such/file.yaml' }); expect(result.isError).toBe(true); const body = JSON.parse(result.content[0].text); expect(body.error).toBe('SPEC_NOT_FOUND'); diff --git a/specs/007-ai-support/contracts/mcp-tools.md b/specs/007-ai-support/contracts/mcp-tools.md index 90cec4b..8d5a859 100644 --- a/specs/007-ai-support/contracts/mcp-tools.md +++ b/specs/007-ai-support/contracts/mcp-tools.md @@ -188,9 +188,9 @@ --- -## Tool 4: `get-non-breaking-violations` +## Tool 4: `grade-api-quick-fixes-only` -**Purpose**: Return a classified, AI-actionable list of non-breaking violations in an API specification. Non-breaking violations are those whose fixes do not alter the API's interface contract (paths, methods, required parameters, schema types, or response structures). Use this tool to obtain the list of issues for the AI to resolve — the AI then generates the corrected specification content. +**Purpose**: Return a classified, AI-actionable list of quick fixes for an API specification. Quick fixes are safe, non-breaking improvements — those that do not alter the API's interface contract (paths, methods, required parameters, schema types, or response structures). Use this tool (not `grade-api-detailed`) when the goal is for the AI to safely resolve violations — the AI then generates the corrected specification content. **Input Schema**: @@ -218,8 +218,8 @@ "specPath": "/path/to/petstore.yaml", "format": "openapi-3", "totalViolations": 17, - "nonBreakingCount": 11, - "nonBreakingViolations": [ + "quickFixCount": 11, + "quickFixes": [ { "ruleId": "operation-description", "message": "Operation must have a description", @@ -242,15 +242,15 @@ } ``` -**When no non-breaking violations exist**: +**When no quick fixes are available**: ```json { "specPath": "/path/to/museum.yaml", "format": "openapi-3", "totalViolations": 2, - "nonBreakingCount": 0, - "nonBreakingViolations": [] + "quickFixCount": 0, + "quickFixes": [] } ``` @@ -260,7 +260,7 @@ **Two-step workflow note** (for AI tool documentation): -> This tool identifies and classifies non-breaking violations. After calling this tool, the AI model generates corrections to the specification content based on the returned list. The MCP server does not modify the specification file; the AI applies the changes. +> This tool identifies and classifies quick fixes (safe, non-breaking improvements). After calling this tool, the AI model generates corrections to the specification content based on the returned list. The MCP server does not modify the specification file; the AI applies the changes. --- @@ -416,7 +416,7 @@ Response confirms the scope was cleared and which scope will now take effect. ## Auth Failure Recovery Response -When a grading tool (`grade-api`, `grade-api-detailed`, `assert-api-grade`, or `get-non-breaking-violations`) is invoked and the configured default ruleset cannot be fetched due to an authentication, authorisation, or network failure, the tool returns this structured response instead of an unhandled error: +When a grading tool (`grade-api`, `grade-api-detailed`, `assert-api-grade`, or `grade-api-quick-fixes-only`) is invoked and the configured default ruleset cannot be fetched due to an authentication, authorisation, or network failure, the tool returns this structured response instead of an unhandled error. (`grade-api-quick-fixes-only` participates in the same auth failure recovery flow as the other grading tools.) ```json { @@ -474,7 +474,7 @@ When a grading tool (`grade-api`, `grade-api-detailed`, `assert-api-grade`, or ` } ``` -**Updated grading tool schemas**: `grade-api`, `grade-api-detailed`, `assert-api-grade`, and `get-non-breaking-violations` all accept one additional optional input field: +**Updated grading tool schemas**: `grade-api`, `grade-api-detailed`, `assert-api-grade`, and `grade-api-quick-fixes-only` all accept one additional optional input field: ```json "recoveryOption": { diff --git a/specs/007-ai-support/data-model.md b/specs/007-ai-support/data-model.md index 72b05a9..424f327 100644 --- a/specs/007-ai-support/data-model.md +++ b/specs/007-ai-support/data-model.md @@ -138,9 +138,9 @@ Returned when `type: "entra-id"` auth is needed but no cached token is available --- -### NonBreakingViolation +### QuickFix -A single non-breaking violation, enriched with AI-actionable context (per FR-012). +A single quick fix (a safe, non-breaking improvement), enriched with AI-actionable context (per FR-012). | Field | Type | Required | Description | |---|---|---|---| @@ -157,17 +157,17 @@ A single non-breaking violation, enriched with AI-actionable context (per FR-012 - `currentValue` is `null` when the field is absent (missing field violations), not when the value is empty string - `expectedImprovement` is derived by the classifier; never empty -### NonBreakingViolationResult +### QuickFixResult -The top-level response shape for the `get-non-breaking-violations` tool. +The top-level response shape for the `grade-api-quick-fixes-only` tool. | Field | Type | Required | Description | |---|---|---|---| | `specPath` | `string` | ✅ | Path of the analysed specification | | `format` | `ApiFormat` | ✅ | Detected specification format | | `totalViolations` | `number` | ✅ | Total violations found (all severities) | -| `nonBreakingCount` | `number` | ✅ | Count of non-breaking violations in the result | -| `nonBreakingViolations` | `NonBreakingViolation[]` | ✅ | Classified, AI-actionable list | +| `quickFixCount` | `number` | ✅ | Count of quick fixes (safe, non-breaking improvements) in the result | +| `quickFixes` | `QuickFix[]` | ✅ | Classified, AI-actionable list of quick fixes | | `largeSpecWarning?` | `string` | — | Present when spec exceeds 500KB threshold | --- diff --git a/specs/007-ai-support/plan.md b/specs/007-ai-support/plan.md index bd799be..87dce32 100644 --- a/specs/007-ai-support/plan.md +++ b/specs/007-ai-support/plan.md @@ -114,7 +114,7 @@ packages/api-grade-mcp/ │ │ ├── grade.ts # grade-api tool │ │ ├── grade-detailed.ts # grade-api-detailed tool │ │ ├── assert-grade.ts # assert-api-grade tool -│ │ ├── non-breaking.ts # get-non-breaking-violations tool +│ │ ├── quick-fixes-only.ts # grade-api-quick-fixes-only tool │ │ ├── set-ruleset-config.ts # set-ruleset-config tool (US5) │ │ └── get-ruleset-config.ts # get-ruleset-config tool (US5) │ ├── config/ @@ -135,7 +135,7 @@ packages/api-grade-mcp/ │ ├── grade.test.ts │ ├── grade-detailed.test.ts │ ├── assert-grade.test.ts -│ ├── non-breaking.test.ts +│ ├── quick-fixes-only.test.ts │ ├── set-ruleset-config.test.ts # set-ruleset-config tool tests (US5) │ └── get-ruleset-config.test.ts # get-ruleset-config tool tests (US5) ├── package.json # @dawmatt/api-grade-mcp; bin: api-grade-mcp diff --git a/specs/007-ai-support/quickstart.md b/specs/007-ai-support/quickstart.md index 256ebf7..065d9f3 100644 --- a/specs/007-ai-support/quickstart.md +++ b/specs/007-ai-support/quickstart.md @@ -151,7 +151,7 @@ Once configured, the AI tool has access to six api-grade capabilities: | `grade-api` | Quick grade: letter grade, score, and summary | | `grade-api-detailed` | Full grade with all violations and recommendations | | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | -| `get-non-breaking-violations` | Classified list of fixable violations for AI-assisted correction | +| `grade-api-quick-fixes-only` | Classified list of fixable violations for AI-assisted correction | | `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | | `get-ruleset-config` | Show the active ruleset configuration at all scopes | @@ -179,12 +179,12 @@ The AI calls `grade-api-detailed` and summarises the findings. The AI calls `assert-api-grade` with `minimumGrade: "B"` and reports pass or fail. -### AI-assisted fix of non-breaking issues +### AI-assisted quick fixes -> Fix the non-breaking issues in `/workspace/my-api/openapi.yaml` +> Apply quick fixes to `/workspace/my-api/openapi.yaml` -The AI calls `get-non-breaking-violations`, receives the classified list, and generates -corrections for the fixable issues — adding missing descriptions, summaries, and metadata +The AI calls `grade-api-quick-fixes-only`, receives the classified list of quick fixes, and generates +corrections — adding missing descriptions, summaries, and metadata without altering the API's interface contract (paths, methods, parameters, schemas). --- diff --git a/specs/007-ai-support/research.md b/specs/007-ai-support/research.md index 7496a46..de4cb30 100644 --- a/specs/007-ai-support/research.md +++ b/specs/007-ai-support/research.md @@ -104,19 +104,19 @@ All four MCP tools use `grade(GradeRequest)` with a file path. `gradeContent` is | `grade-api` | `engine.grade({ specPath, rulesetPath })` | `{ specPath, format, letterGrade, gradeLabel, numericScore, summary }` — diagnostics array omitted | | `grade-api-detailed` | `engine.grade({ specPath, rulesetPath })` | Full `GradeResult` including `diagnostics[]` | | `assert-api-grade` | `engine.grade({ specPath, rulesetPath })` | `{ passed, actual, minimum, specPath }` | -| `get-non-breaking-violations` | `engine.grade({ specPath, rulesetPath })` | `{ specPath, totalViolations, nonBreakingViolations[] }` | +| `grade-api-quick-fixes-only` | `engine.grade({ specPath, rulesetPath })` | `{ specPath, totalViolations, quickFixCount, quickFixes[] }` | `grade-api` omits the `diagnostics` array to keep the response token-efficient for the common case (AI wants a summary, not full detail). `grade-api-detailed` returns the full result. --- -## Non-Breaking Violation Classification +## Quick Fix Classification (Non-Breaking Violation Detection) ### Decision: Path-based classification with rule ID override list -**Rationale**: Spectral diagnostics include a `path` array (JSON pointer segments to the offending location) and a `ruleId` string. Classification uses the path first — if the path points to a documentation or metadata location, the violation is non-breaking. Rule ID overrides handle cases where path inspection alone is ambiguous. +**Rationale**: Spectral diagnostics include a `path` array (JSON pointer segments to the offending location) and a `ruleId` string. Classification uses the path first — if the path points to a documentation or metadata location, the violation is non-breaking (i.e., a quick fix). Rule ID overrides handle cases where path inspection alone is ambiguous. -**Non-breaking path patterns** (violation is non-breaking if path includes ANY of these at any level): +**Non-breaking path patterns** (violation qualifies as a quick fix if path includes ANY of these at any level): | Path segment | Example location | Non-breaking because | |---|---|---| @@ -146,7 +146,7 @@ All four MCP tools use `grade(GradeRequest)` with a file path. `gradeContent` is **Classification algorithm**: 1. Check if any path segment matches a breaking pattern → `breaking` 2. Else check if any path segment matches a non-breaking pattern → `nonBreaking` -3. Else → `unknown` (not included in `get-non-breaking-violations` output; surfaced separately) +3. Else → `unknown` (not included in `grade-api-quick-fixes-only` output; surfaced separately) **Rule ID overrides** (applied before path inspection): @@ -160,9 +160,9 @@ All four MCP tools use `grade(GradeRequest)` with a file path. `gradeContent` is | `oas3-examples-*` | nonBreaking | Examples only | | `tag-description` | nonBreaking | Tag metadata | -**FR-012 context fields** (returned per non-breaking violation): +**FR-012 context fields** (returned per quick fix — a safe, non-breaking improvement): ```typescript -interface NonBreakingViolation { +interface QuickFix { ruleId: string; // e.g. "operation-description" message: string; // e.g. "Operation must have a description" severity: string; // "error" | "warn" | "info" | "hint" @@ -355,7 +355,7 @@ export function createServer(): McpServer { registerGradeTool(server, sessionState); registerGradeDetailedTool(server, sessionState); registerAssertGradeTool(server, sessionState); - registerNonBreakingTool(server, sessionState); + registerQuickFixesOnlyTool(server, sessionState); registerSetRulesetConfigTool(server, sessionState); registerGetRulesetConfigTool(server, sessionState); return server; diff --git a/specs/007-ai-support/spec.md b/specs/007-ai-support/spec.md index 620262c..b3c698f 100644 --- a/specs/007-ai-support/spec.md +++ b/specs/007-ai-support/spec.md @@ -13,8 +13,8 @@ ### Session 2026-06-18 - Q: What integration mechanism should be used to expose api-grade capabilities to AI tools? → A: MCP server (Model Context Protocol) -- Q: What constitutes a "non-breaking" violation eligible for AI-assisted auto-fix? → A: Any violation that doesn't alter the API's interface contract (includes documentation, metadata, optional fields, examples, and extensions) -- Q: What does the MCP tool return when an AI tool requests resolution of non-breaking issues? → A: A structured list of non-breaking issues for the AI to resolve (the AI model performs the content generation; the MCP tool identifies and classifies the violations) +- Q: What constitutes a "quick fix" eligible for AI-assisted auto-fix? → A: Any violation that doesn't alter the API's interface contract (includes documentation, metadata, optional fields, examples, and extensions); these are returned by `grade-api-quick-fixes-only` +- Q: What does `grade-api-quick-fixes-only` return? → A: A structured list of quick fixes (safe, non-breaking improvements) for the AI to apply (the AI model performs the content generation; the MCP tool identifies and classifies the violations) - Q: How should the MCP server handle very large API specifications? → A: Best-effort — grade and return results, but include a warning in the response when the spec exceeds a defined size threshold - Q: Should the MCP server support concurrent grading requests? → A: Yes — multiple simultaneous requests are supported, bounded only by available system resources @@ -99,19 +99,19 @@ A developer using the api-grade MCP server wants to set a default ruleset that a --- -### User Story 4 - AI-Assisted Resolution of Non-Breaking Issues (Priority: P3) +### User Story 4 - AI-Assisted Quick Fixes (Priority: P3) -A developer using an AI assistant not only wants to know which issues are affecting their API grade, but wants the AI to automatically resolve the non-breaking, fixable issues identified by the grading — improving the API specification without introducing breaking changes. The MCP server provides the classified list of fixable violations; the AI model generates the actual corrections. +A developer using an AI assistant not only wants to know which issues are affecting their API grade, but wants the AI to automatically apply quick fixes — safe, non-breaking improvements identified by the grading — without introducing breaking changes. The MCP server provides the classified list of quick fixes; the AI model generates the actual corrections. **Why this priority**: This is the most advanced use of the feature and builds directly on User Stories 1 and 3. It requires grading and diagnostic information to be available first. Delivering this independently of the basic grading scenarios is possible but delivers less standalone value. -**Independent Test**: Can be tested independently by providing an AI tool with an API specification containing known non-breaking issues (e.g., missing descriptions, incomplete metadata, absent examples), having it invoke the resolve capability, and confirming the output specification has those issues fixed while the API's interface contract (paths, methods, required parameters, schema types, response structures) is unchanged. +**Independent Test**: Can be tested independently by providing an AI tool with an API specification containing known quick-fix opportunities (e.g., missing descriptions, incomplete metadata, absent examples), having it invoke the quick-fix capability, and confirming the output specification has those issues fixed while the API's interface contract (paths, methods, required parameters, schema types, response structures) is unchanged. **Acceptance Scenarios**: -1. **Given** an API specification with non-breaking violations (e.g., missing operation descriptions, incomplete info block), **When** an AI tool invokes the resolve capability, **Then** the AI produces a corrected specification where those violations are addressed and no breaking changes are introduced. -2. **Given** an API specification where all violations are breaking changes, **When** an AI tool invokes the resolve capability, **Then** the result indicates no automatic fixes were applied and the original specification is unchanged. -3. **Given** an AI tool resolves non-breaking issues on a specification, **When** the corrected specification is re-graded, **Then** the grade is equal to or higher than the original grade. +1. **Given** an API specification with quick-fix opportunities (e.g., missing operation descriptions, incomplete info block), **When** an AI tool invokes `grade-api-quick-fixes-only`, **Then** the AI produces a corrected specification where those violations are addressed and no breaking changes are introduced. +2. **Given** an API specification where all violations are breaking changes, **When** an AI tool invokes `grade-api-quick-fixes-only`, **Then** the result indicates no quick fixes are available and `quickFixes: []`. +3. **Given** an AI tool applies quick fixes to a specification, **When** the corrected specification is re-graded, **Then** the grade is equal to or higher than the original grade. --- @@ -136,8 +136,8 @@ A developer using an AI assistant not only wants to know which issues are affect - **FR-004**: The system MUST support a grade assertion capability that accepts a minimum grade level and returns a structured pass/fail result with the actual grade. - **FR-005**: The system MUST provide detailed diagnostic output including per-category violation counts, individual violations with severity, and prioritised recommendations when requested by an AI tool. - **FR-006**: The system MUST allow AI tools to supply a custom spectral ruleset path as the basis for grading, consistent with the CLI's custom ruleset support. -- **FR-007**: The system MUST provide a capability that returns a structured list of non-breaking violations in an API specification — classified, located, and described — so that an AI tool can use that information to generate and apply fixes. A non-breaking violation is any violation whose fix does not alter the API's interface contract (i.e., does not change paths, methods, required parameters, schema types, or response structures); eligible fixes include adding or improving descriptions, summaries, tags, info block fields, optional fields, examples, and extensions. -- **FR-012**: For each non-breaking violation returned, the system MUST include sufficient context (violation rule, affected location, current value if present, expected improvement) for the AI to generate a correct fix without needing to re-parse the specification. +- **FR-007**: The system MUST provide a `grade-api-quick-fixes-only` MCP tool that returns a structured list of quick fixes for an API specification — classified, located, and described — so that an AI tool can use that information to generate and apply safe improvements. A quick fix is any violation whose fix does not alter the API's interface contract (i.e., does not change paths, methods, required parameters, schema types, or response structures); eligible quick fixes include adding or improving descriptions, summaries, tags, info block fields, optional fields, examples, and extensions. +- **FR-012**: For each quick fix returned by `grade-api-quick-fixes-only`, the system MUST include sufficient context (violation rule, affected location, current value if present, expected improvement) for the AI to generate a correct fix without needing to re-parse the specification. - **FR-008**: The system MUST return structured error responses (not unhandled exceptions) when invoked with invalid inputs such as missing files, invalid grade values, or inaccessible rulesets. - **FR-013**: When an API specification exceeds a defined size threshold, the system MUST still attempt grading and return a best-effort result with a warning field indicating the specification is large and that results may be incomplete. - **FR-015**: The system MUST provide a `set-ruleset-config` MCP tool that sets a default ruleset at a specified scope (`session`, `workspace`, or `global`). Session-level configuration is held in memory and resets when the MCP server process restarts. Workspace-level configuration is persisted to `.api-grade/config.json` relative to the MCP server's working directory (CWD), which MCP hosts set to the workspace root. Global configuration is persisted to `~/.api-grade/config.json`. @@ -160,8 +160,8 @@ A developer using an AI assistant not only wants to know which issues are affect - **Grade Result**: The structured output of a grading operation, including grade letter, numeric percentage, label, tone, and diagnostic summary. - **Diagnostic Detail**: The full structured output including per-category breakdowns, individual violations, severities, and prioritised recommendations. - **Assertion Result**: A structured pass/fail outcome indicating whether an API meets a specified minimum grade, including the actual grade achieved. -- **Non-Breaking Issue List**: The structured output of the resolve-assist capability — a classified, located list of non-breaking violations with sufficient context (rule, location, current value, expected improvement) for an AI model to generate corrections. -- **Resolved Specification**: The corrected API specification produced by an AI model after it processes the Non-Breaking Issue List and applies fixes. Non-breaking fixes include improvements to descriptions, summaries, tags, info blocks, optional fields, examples, and extensions — any change that leaves the API's interface contract (paths, methods, required parameters, schema types, response structures) unaltered. +- **Quick Fix List**: The structured output of the `grade-api-quick-fixes-only` tool — a classified, located list of safe improvements (non-breaking changes) with sufficient context (rule, location, current value, expected improvement) for an AI model to generate corrections. +- **Resolved Specification**: The corrected API specification produced by an AI model after it processes the Quick Fix List and applies improvements. Quick fixes include adding or improving descriptions, summaries, tags, info blocks, optional fields, examples, and extensions — any change that leaves the API's interface contract (paths, methods, required parameters, schema types, response structures) unaltered. - **Custom Ruleset**: An optional spectral-compatible ruleset file path or URL provided by the AI tool to customise grading behaviour on a per-request basis. - **Default Ruleset Configuration**: A persisted or in-memory setting that designates the ruleset to use when no per-request `rulesetPath` is supplied. Exists at three scopes — session (in-memory), workspace (`.api-grade/config.json`), and global (`~/.api-grade/config.json`) — with session taking precedence over workspace, and workspace over global. - **Auth Configuration**: Optional credentials (GitHub PAT, Entra ID tenant/client IDs) associated with a Default Ruleset Configuration that allow the MCP server to fetch rulesets from secured locations. Stored separately from ruleset paths to support safe source-control practices. @@ -175,7 +175,7 @@ A developer using an AI assistant not only wants to know which issues are affect - **SC-002**: All three grading functions (overall grade, detailed diagnostics, grade assertion) are accessible from Claude Code, GitHub Copilot (VS Code), and GitHub Copilot Studio without any additional configuration beyond supplying the API specification path. - **SC-003**: 100% of supported API specification formats (OpenAPI and AsyncAPI) can be graded successfully when invoked from an AI context. - **SC-004**: Grade assertion correctly identifies pass/fail for all valid grade levels (A through F) with 100% accuracy. -- **SC-005**: An AI tool applying non-breaking fixes produces a corrected specification where all targeted violations are resolved and no breaking changes are introduced, as verified by re-grading. +- **SC-005**: An AI tool applying quick fixes produces a corrected specification where all targeted violations are resolved and no breaking changes are introduced, as verified by re-grading. - **SC-006**: All MCP tool definitions are self-describing — a capable AI tool can discover and invoke all grading capabilities correctly using only the tool definitions, with no additional documentation required. - **SC-007**: A developer can configure a workspace-level default ruleset once via `set-ruleset-config`, restart the MCP server, and confirm that all subsequent grading requests in that workspace use the configured ruleset without re-supplying the path. - **SC-008**: When a configured default ruleset requires authentication and credentials are unavailable or invalid, 100% of grading requests return the four structured recovery options rather than an unhandled error or silent fallback to the built-in default. @@ -186,7 +186,7 @@ A developer using an AI assistant not only wants to know which issues are affect - The AI integration is delivered as an MCP (Model Context Protocol) server. The three explicitly required and verified target environments are Claude Code, GitHub Copilot (VS Code Agent mode), and GitHub Copilot Studio. The server is expected to work with other MCP-compatible hosts, but only these three are required for acceptance. - Remote URL-based API specification fetching is treated as a stretch goal; the primary supported input is a local file path. - The AI tool is responsible for presenting the structured JSON output to its end user in a human-readable form; api-grade provides the data, not the final presentation. -- The "resolve non-breaking issues" capability is a two-step workflow: the MCP server identifies, classifies, and returns non-breaking violations as a structured list; the calling AI model uses that list to generate the corrected specification content. The MCP server does not generate specification content. +- The quick-fix capability is a two-step workflow: the `grade-api-quick-fixes-only` tool identifies, classifies, and returns quick fixes as a structured list; the calling AI model uses that list to generate the corrected specification content. The MCP server does not generate specification content. - Default ruleset configuration is specific to the MCP server; the CLI continues to accept `--ruleset` on each invocation without persistent configuration. Parity between CLI and MCP ruleset configuration is not a goal of this feature. - The MCP server's working directory (CWD) is treated as the workspace root for resolving `.api-grade/config.json`. All three required MCP hosts (Claude Code, VS Code Copilot, Copilot Studio) start server processes with the workspace root as CWD; no `--workspace-root` argument or per-call parameter is needed. - Supported authentication mechanisms for secured rulesets are GitHub Enterprise PAT (token-based) and Microsoft Entra ID (OAuth 2.0 device-code flow). Other SSO or authentication schemes (NTLM, Kerberos, custom OAuth providers) are out of scope. diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index 1a8543c..ad531f7 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -136,22 +136,22 @@ --- -## Phase 7: User Story 4 — AI-Assisted Resolution of Non-Breaking Issues (Priority: P3) +## Phase 7: User Story 4 — AI-Assisted Quick Fixes (Priority: P3) -**Goal**: Expose `get-non-breaking-violations` as an MCP tool so AI tools receive a classified, AI-actionable list of non-breaking violations with sufficient context (`currentValue`, `location`, `expectedImprovement`) to generate spec corrections. +**Goal**: Expose `grade-api-quick-fixes-only` as an MCP tool so AI tools receive a classified, AI-actionable list of quick fixes (safe, non-breaking improvements) with sufficient context (`currentValue`, `location`, `expectedImprovement`) to generate spec corrections. -**Independent Test**: Call `get-non-breaking-violations` with a spec containing known non-breaking violations (missing operation descriptions, missing info description) — confirm each returned `NonBreakingViolation` has `ruleId`, `severity`, `path`, `location`, `currentValue`, and `expectedImprovement` populated. Call with a spec where all violations are breaking — confirm `nonBreakingViolations: []` and `nonBreakingCount: 0`. +**Independent Test**: Call `grade-api-quick-fixes-only` with a spec containing known quick-fix opportunities (missing operation descriptions, missing info description) — confirm each returned `QuickFix` has `ruleId`, `severity`, `path`, `location`, `currentValue`, and `expectedImprovement` populated. Call with a spec where all violations are breaking — confirm `quickFixes: []` and `quickFixCount: 0`. ### Tests for User Story 4 > **Write these tests FIRST and confirm they fail before implementing T033.** -- [X] T032 [P] [US4] Create `packages/api-grade-mcp/tests/integration/non-breaking.test.ts` integration tests for `get-non-breaking-violations`: spec with known non-breaking violations → `nonBreakingViolations[]` contains entries with all FR-012 fields (`ruleId`, `message`, `severity`, `path`, `location`, `currentValue`, `expectedImprovement`); spec with only breaking violations → `nonBreakingCount: 0`, `nonBreakingViolations: []`; spec > 500KB → `largeSpecWarning` present; `currentValue` is `null` for absent fields, not empty string +- [X] T032 [P] [US4] Create `packages/api-grade-mcp/tests/integration/quick-fixes-only.test.ts` integration tests for `grade-api-quick-fixes-only`: spec with known quick-fix opportunities → `quickFixes[]` contains entries with all FR-012 fields (`ruleId`, `message`, `severity`, `path`, `location`, `currentValue`, `expectedImprovement`); spec with only breaking violations → `quickFixCount: 0`, `quickFixes: []`; spec > 500KB → `largeSpecWarning` present; `currentValue` is `null` for absent fields, not empty string ### Implementation for User Story 4 -- [X] T033 [US4] Implement `packages/api-grade-mcp/src/tools/non-breaking.ts` exporting `registerNonBreakingTool(server, sessionState)`: registers `get-non-breaking-violations` with same Zod schema as `grade-api` plus `recoveryOption`; calls `GradeEngine.grade()` with resolved ruleset; passes each `Diagnostic` through `classify()`; for non-breaking violations builds `NonBreakingViolation` shape with `location` (dot-joined path), `currentValue` (read from spec AST at path, or null if absent), `expectedImprovement` (derived from rule message per research.md logic); returns `NonBreakingViolationResult`; applies large spec warning -- [X] T034 [US4] Replace the `get-non-breaking-violations` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerNonBreakingTool(server, sessionState)` call imported from `./tools/non-breaking.ts` +- [X] T033 [US4] Implement `packages/api-grade-mcp/src/tools/quick-fixes-only.ts` exporting `registerQuickFixesOnlyTool(server, sessionState)`: registers `grade-api-quick-fixes-only` with same Zod schema as `grade-api` plus `recoveryOption`; calls `GradeEngine.grade()` with resolved ruleset; passes each `Diagnostic` through `classifyViolation()`; for non-breaking violations builds `QuickFix` shape with `location` (dot-joined path), `currentValue` (read from spec AST at path, or null if absent), `expectedImprovement` (derived from rule message per research.md logic); returns `QuickFixResult`; applies large spec warning +- [X] T034 [US4] Replace the `grade-api-quick-fixes-only` stub in `packages/api-grade-mcp/src/server.ts` `createServer()` with a real `registerQuickFixesOnlyTool(server, sessionState)` call imported from `./tools/quick-fixes-only.ts` **Checkpoint**: All four grading tools + two configuration tools are fully functional. Run the full test suite and confirm all pass. @@ -170,7 +170,7 @@ - [X] T041 [P] Update `docs/index.md` to add MCP Server rows (overview, configuration reference, troubleshooting, quick-start) alongside the existing CLI and Backstage integration rows - [X] T042 [P] Update `docs/getting-started.md` to extend the MCP section to mention default ruleset configuration capability and link to `docs/mcp/configuration.md` - [X] T043 [P] Update `docs/package/README.md` to add `@dawmatt/api-grade-mcp` to the monorepo packages table -- [ ] T044 Verify all six MCP tools function correctly in all three required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `get-non-breaking-violations`, `set-ruleset-config`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work; (3) GitHub Copilot Studio — configure as custom MCP Action and confirm grading succeeds (FR-014, SC-002, SC-006) — **see [`checklists/t044-verification.md`](checklists/t044-verification.md) for step-by-step verification checklist per environment** +- [ ] T044 Verify all six MCP tools function correctly in all three required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `grade-api-quick-fixes-only`, `set-ruleset-config`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work; (3) GitHub Copilot Studio — configure as custom MCP Action and confirm grading succeeds (FR-014, SC-002, SC-006) — **see [`checklists/t044-verification.md`](checklists/t044-verification.md) for step-by-step verification checklist per environment** --- @@ -250,13 +250,13 @@ Task T027: src/auth/entra.ts 3. US2 → `assert-api-grade` working → grade assertion available to AI tools 4. US3 → `grade-api-detailed` working → full diagnostics available 5. US5 → `set-ruleset-config` + `get-ruleset-config` + auth → enterprise adoption unlocked -6. US4 → `get-non-breaking-violations` working → AI-assisted fixing unlocked +6. US4 → `grade-api-quick-fixes-only` working → AI-assisted quick fixing unlocked 7. Polish → documentation + three-environment verification → feature shippable ### Parallel Team Strategy After Foundational phase is complete: -- **Developer A**: US1 (grade-api) → US4 (non-breaking, uses classifier) +- **Developer A**: US1 (grade-api) → US4 (grade-api-quick-fixes-only, uses classifier) - **Developer B**: US2 (assert-api-grade) + US3 (grade-api-detailed) - **Developer C**: US5 (set-ruleset-config, config/auth modules) - All converge for T030 (cross-cutting grading tool update) and Phase 8 (verification + docs) From 92f439b9d6fbea2618139be7ddbe7b78b097304d Mon Sep 17 00:00:00 2001 From: DawMatt Date: Fri, 19 Jun 2026 15:18:02 +1000 Subject: [PATCH 09/20] Refine tool descriptions to improve discoverability and routing --- docs/mcp/README.md | 2 +- docs/mcp/quick-start.md | 2 +- docs/package/api-grade-mcp.md | 2 +- package-lock.json | 16172 +++++++++------- packages/api-grade-mcp/README.md | 2 +- .../src/tools/get-ruleset-config.ts | 2 +- .../src/tools/set-ruleset-config.ts | 2 +- specs/007-ai-support/contracts/mcp-tools.md | 2 +- specs/007-ai-support/quickstart.md | 6 +- yarn.lock | 4557 ++--- 10 files changed, 11432 insertions(+), 9317 deletions(-) diff --git a/docs/mcp/README.md b/docs/mcp/README.md index 0dc57e1..acb01bd 100644 --- a/docs/mcp/README.md +++ b/docs/mcp/README.md @@ -29,7 +29,7 @@ AI tool (Claude Code, Copilot, etc.) | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | | `grade-api-quick-fixes-only` | Classified list of quick fixes (safe, non-breaking improvements) for AI-assisted correction | | `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | -| `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | +| `get-ruleset-config` | Get the active Spectral ruleset and which scope is effective | --- diff --git a/docs/mcp/quick-start.md b/docs/mcp/quick-start.md index 53cecbb..949f21b 100644 --- a/docs/mcp/quick-start.md +++ b/docs/mcp/quick-start.md @@ -140,7 +140,7 @@ Reload Cursor after saving. | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | | `grade-api-quick-fixes-only` | Classified list of quick fixes (safe, non-breaking improvements) for AI-assisted correction | | `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | -| `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | +| `get-ruleset-config` | Get the active Spectral ruleset and which scope is effective | --- diff --git a/docs/package/api-grade-mcp.md b/docs/package/api-grade-mcp.md index 6d046b6..9194ae9 100644 --- a/docs/package/api-grade-mcp.md +++ b/docs/package/api-grade-mcp.md @@ -138,7 +138,7 @@ Scope precedence: session → workspace → global → built-in. ### `get-ruleset-config` -Show the active ruleset configuration at all scopes and which is currently effective. +Get the active Spectral ruleset at all scopes and which is currently effective. **Input**: none diff --git a/package-lock.json b/package-lock.json index 2c0c66c..17761bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,27 +1,30 @@ { - "name": "api-grade", - "version": "0.1.1", + "name": "@dawmatt/api-grade", + "version": "0.1.20", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "api-grade", - "version": "0.1.1", + "name": "@dawmatt/api-grade", + "version": "0.1.20", "license": "MIT", "workspaces": [ "packages/*" ], "dependencies": { - "api-grade-core": "*", + "@dawmatt/api-grade-core": "*", "commander": "^12.1.0" }, "bin": { "api-grade": "dist/cli/index.js" }, "devDependencies": { + "@eslint/js": "^10.0.1", "@types/node": "^20.12.0", "@vitest/coverage-v8": "^1.6.0", + "eslint": "^10.5.0", "typescript": "^5.4.5", + "typescript-eslint": "^8.61.1", "vitest": "^1.6.0" }, "engines": { @@ -106,8 +109,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -121,8 +124,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -133,8 +136,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", @@ -148,8 +151,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", @@ -164,8 +167,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -179,8 +182,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.6.2" } @@ -189,8 +192,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", @@ -201,8 +204,8 @@ "version": "3.370.0", "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.370.0.tgz", "integrity": "sha512-/W4arzC/+yVW/cvEXbuwvG0uly4yFSZnnIA+gkqgAm+0HVfacwcPpNf4BjyxjnvIdh03l7w2DriF6MlKUfiQ3A==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/types": "3.370.0", "tslib": "^2.5.0" @@ -215,8 +218,8 @@ "version": "3.370.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.370.0.tgz", "integrity": "sha512-8PGMKklSkRKjunFhzM2y5Jm0H2TBu7YRNISdYzXLUHKSP9zlMEYagseKVdmox0zKHf1LXVNuSlUV2b6SRrieCQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@smithy/types": "^1.1.0", "tslib": "^2.5.0" @@ -229,8 +232,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.5.0" }, @@ -242,8 +245,8 @@ "version": "3.1000.5", "resolved": "https://registry.npmjs.org/@aws-sdk/checksums/-/checksums-3.1000.5.tgz", "integrity": "sha512-zOXUUnilC6lgCsQtp77p/QNPmRlTES9Xi6tlDwbR6kfC/kz5PCzZckgHWm5z+8DskdwuMAbFDq61x3zr10GEEQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", @@ -262,8 +265,8 @@ "version": "3.1068.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-codecommit/-/client-codecommit-3.1068.0.tgz", "integrity": "sha512-2g2icHFmbjvDzzlVpKS3BG+4rL5K4tXlzZG6DwEQo+v+DxpKHR+EjxIOgpOlT4y0esVehuWdk9Xv2/N2ZyyTjQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -284,8 +287,8 @@ "version": "3.1068.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1068.0.tgz", "integrity": "sha512-by2Qj3f9BI9X4cY0n160R3uzkMpI6k9PmGA8QLAuzr8HzkiNrYFygMEPhIEdqBFHQPD/8AXNUs45HYjEDsQ33g==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -306,8 +309,8 @@ "version": "3.1068.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1068.0.tgz", "integrity": "sha512-lFgaIpxZvloNbJvQ337YPdMXhzI2zJdDw13nATVGnkAGNoNPx4ksD84AQAcuW75hsaaMaIuNmXU9sSx6+FTirA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", @@ -332,8 +335,8 @@ "version": "3.1068.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.1068.0.tgz", "integrity": "sha512-WCUEpfdsSSO7zsXi7GUwHR+A5HZDQNsGktFJxOm73ZU+WLlBKRDzKdWZdYOpNkgBpXxy5KCeVMvXuaq2s1zn7w==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -355,8 +358,8 @@ "version": "3.974.20", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.20.tgz", "integrity": "sha512-7sDi2B2N3mc3nf1nz6FyEx/FCrJ1N1QnBmraHHQNabFaeAh2IaOOLml48/rHOD1bICHgTRkbBgNTvUzEr5Z35g==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/types": "^3.973.12", "@aws-sdk/xml-builder": "^3.972.29", @@ -375,8 +378,8 @@ "version": "3.972.45", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.45.tgz", "integrity": "sha512-4L/REssieLON1hVsTzZucP1p2u5jmPNejyh/9BCGZXr93IalBbhRPCrtKIKwMTu9yRGr/bcKzhrQocByKLSzLQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/nested-clients": "^3.997.20", "@aws-sdk/types": "^3.973.12", @@ -392,8 +395,8 @@ "version": "3.972.46", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.46.tgz", "integrity": "sha512-+GPXVS2srMOlH74S+SmC1gVuP2TvUZ0siuC0onKO93q+udP+M72dmY8wJfVQ5CX9z/9X5A1HHwz5yRIGBtskvQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/core": "^3.974.20", "@aws-sdk/types": "^3.973.12", @@ -409,8 +412,8 @@ "version": "3.972.48", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.48.tgz", "integrity": "sha512-fA5loSdlocacRxyUXtpoHSMuk5rsIKRDzQYVMnMxjcmFeZshaJlJ8lymy/hYKji6sne/UmNGj5pxuEs6kq/Qcg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/core": "^3.974.20", "@aws-sdk/types": "^3.973.12", @@ -428,8 +431,8 @@ "version": "3.972.53", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.53.tgz", "integrity": "sha512-ZfdhIOR41q8TcWEnUac+gCOb+O2LBWdHLmjedXpXz4IEFW2ppNuFcm6p0sMTavpM+zD5TYfpH5Gp7guRyqSgsQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/core": "^3.974.20", "@aws-sdk/credential-provider-env": "^3.972.46", @@ -453,8 +456,8 @@ "version": "3.972.52", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.52.tgz", "integrity": "sha512-9hu2oR0qH7Fst5Tzdx+UWxm+w5zCXtErTLtOOW5hwwQc170CLwOeniRxyFY6s9mHfGEfC5zFukNBdKBwJR8mhQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/core": "^3.974.20", "@aws-sdk/nested-clients": "^3.997.20", @@ -471,8 +474,8 @@ "version": "3.972.55", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.55.tgz", "integrity": "sha512-zMGLa/dhESVqmCD7mmIFFKSwSFrJGScvCXcjvBZEVOOMauFS5JRQvLTMukFpMEFWiV6dTAlsen2ATDBulLPtbg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.46", "@aws-sdk/credential-provider-http": "^3.972.48", @@ -494,8 +497,8 @@ "version": "3.972.46", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.46.tgz", "integrity": "sha512-VUoNFBIjWrUN8NbFiQiuxQEgFjvziAlBRPK+ddh27aj65gk0BYu6bLZnrdrNZwpW6vAihtSUtEMQ1PUJ32QRPA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/core": "^3.974.20", "@aws-sdk/types": "^3.973.12", @@ -511,8 +514,8 @@ "version": "3.972.52", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.52.tgz", "integrity": "sha512-nb2/n4o/HQf+FVpVbZe9vCTFngmuDoIsltMgLAtjixaKzvzhB4J8WSDFyWgnErgLHk55ctWH+I4PU+LIHhyffg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/core": "^3.974.20", "@aws-sdk/nested-clients": "^3.997.20", @@ -530,8 +533,8 @@ "version": "3.972.52", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.52.tgz", "integrity": "sha512-lKj6aRSGbqLmpYmM24bY7a1Xmfcq2vkE3hv8CSPYfc1yCu0BPu/XEJ1L4Fm61MsU6ULLNSG8UGsffNoFUBjESA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/core": "^3.974.20", "@aws-sdk/nested-clients": "^3.997.20", @@ -548,8 +551,8 @@ "version": "3.1068.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.1068.0.tgz", "integrity": "sha512-DN7UewD/XKGfNGWXZsTECWRj3IsULkE7aG+fPwqPf13CnX4UmNvj80g1xieJ0lVdMQ2h0L3gZpn2ClIY06+/vQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/client-cognito-identity": "3.1068.0", "@aws-sdk/core": "^3.974.20", @@ -577,8 +580,8 @@ "version": "3.974.30", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.30.tgz", "integrity": "sha512-OaIhub+3yTgfFWPzKO8OzOZFIMUoJaiS5v67y3spQg7SoULGoMx4jKVBbE+uhnzkiZXQ+rEDS0RqrK4/aD1yJw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/checksums": "^3.1000.5", "tslib": "^2.6.2" @@ -591,8 +594,8 @@ "version": "3.972.51", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.51.tgz", "integrity": "sha512-keQgcIUTcHL0Qn7guhsuLaxQU36r9norCrxgaPH4DNCwon4TPtXdI/UdYuycl9vj3Dlwc3YR1dfL3U+6iIwJ6w==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/core": "^3.974.20", "@aws-sdk/signature-v4-multi-region": "^3.996.34", @@ -609,8 +612,8 @@ "version": "3.997.20", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.20.tgz", "integrity": "sha512-IYJuLpXp2DEILVQpQOy0PMpkftv0AHEOCn52o0atyOaumA0CdWQ3klPyXdViGYLbNpESsVFMVybvHUeZAuiGxA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -631,8 +634,8 @@ "version": "3.996.34", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.34.tgz", "integrity": "sha512-mx1L5qlumSOt/nKM3BFaHE2HVkWwz0i4Bw0pyYO42FfX/FeLlo8YI6csC0gSPprEk6fTIqI+CZN9RwUwKd5krQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/types": "^3.973.12", "@smithy/signature-v4": "^5.4.6", @@ -647,8 +650,8 @@ "version": "3.1066.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1066.0.tgz", "integrity": "sha512-UqEUJq7dqa44hneLDUcX7UJy95cg8YqEWyakRpvIPnrNS3Mq+UlQHgCDGu5pvwAPtlIW4qcYbvW6reG6++FyvA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/core": "^3.974.20", "@aws-sdk/nested-clients": "^3.997.20", @@ -665,8 +668,8 @@ "version": "3.973.12", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.12.tgz", "integrity": "sha512-43ajd1NF0RMgX5k0hxCNUyEdrtFUsb2aHT2QvpktSC/2Eyb2Jr/JPVqdp0XIoaHWikZJq5tNWSLO6kB5q2eMCA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@smithy/types": "^4.14.3", "tslib": "^2.6.2" @@ -679,8 +682,8 @@ "version": "3.972.15", "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.15.tgz", "integrity": "sha512-nF4CwAP6OxnWvUtEzu7MHB0Nzd/WqKoSaMzWEKNtV32eiY9pMFgOaH8m6dBWeyQy0L4AldP2HpAx/gLGyOxKkQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/core": "^3.974.20", "tslib": "^2.6.2" @@ -693,8 +696,8 @@ "version": "3.965.7", "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.7.tgz", "integrity": "sha512-M0D6oIpohdNHjc7udzTHEQyot0+0iuA36jc2I9Hps+f/GtKi2HO/pyijQnCnNcwZqLB5+rtn81z3eZK/GyjAmA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -706,8 +709,8 @@ "version": "3.972.29", "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.29.tgz", "integrity": "sha512-fk0niuGFxfi8yIJuMVM4mhwObkiQSuwZFj3tAPrLVx64Pk3BkrEIpqjzHKY4hKoEBUD6Jg/S74Zj9jy+5F3DnQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@smithy/types": "^4.14.3", "fast-xml-parser": "5.7.3", @@ -721,8 +724,8 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.0.0" } @@ -731,8 +734,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -744,8 +747,8 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-util": "^1.13.0", @@ -759,8 +762,8 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.2.tgz", "integrity": "sha512-1D2LpsU7y9xrqKjdIbsB7PlrRePw0xsVV8p+AKTlzITrWmscajryfJCdDJB/oGwvDI5HmRo04eMMADB67uwAwQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", @@ -778,8 +781,8 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.4.0.tgz", "integrity": "sha512-f1P96IB399YiN2ARYHP7EpZi3Bf3wH4SN2lGzrw7JVwm7bbsVYtf2iKSBwTywD2P62NOPZGHFSZi+6jjb75JuA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/abort-controller": "^2.1.2" }, @@ -795,8 +798,8 @@ "version": "2.7.2", "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz", "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.2.0", @@ -811,8 +814,8 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -824,8 +827,8 @@ "version": "1.24.0", "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.24.0.tgz", "integrity": "sha512-PpLsoDQ3AMmKZ0VU+0GrmqMxgp/sExjlVm4R+nLWngeoEGAzOIPVifaxKGU5gMv+nWELUoHfvrolWD+ZS/nFJg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", @@ -843,8 +846,8 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -856,8 +859,8 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/abort-controller": "^2.1.2", "@typespec/ts-http-runtime": "^0.3.0", @@ -871,8 +874,8 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/@azure/core-xml/-/core-xml-1.5.1.tgz", "integrity": "sha512-xcNRHqCoSp4AunOALEae6A8f3qATb83gSrm31Iqb01OzblvC3/W/bfXozcq78EzIdzZzuH1bZ2NvRR0TdX709w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-xml-parser": "^5.5.9", "tslib": "^2.8.1" @@ -885,8 +888,8 @@ "version": "4.13.1", "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.1.tgz", "integrity": "sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.9.0", @@ -908,8 +911,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" @@ -922,8 +925,8 @@ "version": "5.13.0", "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.13.0.tgz", "integrity": "sha512-Ea23x0U8XNFY+qJ9T44zO2BbY+AHdb+WdjmYnx36OhJ/KO+PGU5pmsNHf1DCElYX+6wyVRJz1HFeCPC/cHbRug==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/msal-common": "16.8.0" }, @@ -935,8 +938,8 @@ "version": "16.8.0", "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.8.0.tgz", "integrity": "sha512-5S4RHOcInL2Nu2U217tDZbWGI6StMfcWCrA7TWvWdJmXQ+cYrrIqr84AsN62fGh2MDBysiBJPt6CfWceJfloEA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -945,8 +948,8 @@ "version": "5.2.4", "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.2.4.tgz", "integrity": "sha512-rpBUg9dA8UpC2WiFt3KeDKVQmmmVrfxdRnW+F1ebgou/jX/0tAvYuonaq5RUo8OaqzOrj4x/HaI8DmY56RXZ2Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/msal-common": "16.8.0", "jsonwebtoken": "^9.0.0" @@ -959,8 +962,8 @@ "version": "12.32.0", "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.32.0.tgz", "integrity": "sha512-80LzSNnFQye2LCCBFghAJS6jJQJ7N4bfgZ6qDMgVGRtugZ7TLDKQZ2hczMigmZH3jAcMRdma/IygsC5+0gT7Tw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", @@ -985,8 +988,8 @@ "version": "12.4.0", "resolved": "https://registry.npmjs.org/@azure/storage-common/-/storage-common-12.4.0.tgz", "integrity": "sha512-kNhJKMxQb374KOVt63CZnGIpDcrKNzJeyANLJymxE9mCJSdRGzb+Iv9oSIiCj6tNMLypr530b9ObOiA/5OvwOg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", @@ -1006,6 +1009,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", @@ -1020,14 +1024,73 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, "license": "MIT" }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", @@ -1039,12 +1102,56 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/helper-globals": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -1053,8 +1160,8 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" @@ -1063,10 +1170,39 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1076,7 +1212,32 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { "node": ">=6.9.0" } @@ -1085,6 +1246,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.29.7" @@ -1096,10 +1258,43 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1109,8 +1304,8 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", @@ -1124,8 +1319,8 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -1143,6 +1338,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", @@ -1157,8 +1353,8 @@ "resolved": "https://registry.npmjs.org/@backstage/backend-common/-/backend-common-0.23.3.tgz", "integrity": "sha512-/OZRnxlNokdMfoQEfDRrjIuojPi6UL80smHuNpcvP/93fXkrYiMwISulDQPxCfm1Rm9JW8mnRORGFihKIALNpQ==", "deprecated": "This package has been deprecated. Please check https://backstage.io for how to migrate to the new backend system and its packages, such as @backstage/backend-defaults.", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-sdk/abort-controller": "^3.347.0", "@aws-sdk/client-codecommit": "^3.350.0", @@ -1237,8 +1433,8 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/@backstage/backend-plugin-api/-/backend-plugin-api-0.7.0.tgz", "integrity": "sha512-cq93C7UkS1t/D6VP3XZ8gLD8o3cRmbeSsIUGk+AYiUm0e8aSCWSAlBBiFYrylVOAuQXzEIgE9Gb3MNNFbl+Qug==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/cli-common": "^0.1.14", "@backstage/config": "^1.2.0", @@ -1257,8 +1453,8 @@ "version": "0.8.4", "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.8.4.tgz", "integrity": "sha512-zZSfXadycRCP/YG2Cf4p/hxDU4fhrYDAVneo9PKZMfy3O4ERdtrYehGuOspcak2NkeMmaj2KfsFuWFuWK2xBTQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/config": "^1.3.2", "@backstage/errors": "^1.2.7", @@ -1273,12 +1469,12 @@ "version": "11.1.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", + "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", - "peer": true, "bin": { "uuid": "dist/esm/bin/uuid" } @@ -1287,8 +1483,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -1297,8 +1493,8 @@ "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.2" }, @@ -1313,8 +1509,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -1329,8 +1525,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -1342,15 +1538,15 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/@backstage/backend-dev-utils/-/backend-dev-utils-0.1.7.tgz", "integrity": "sha512-05lbgXZGofBHcs/Yz2TTI3Brn98BcUU8ZFVx/sCz1EXG8/eFoZSEjr7F2cA1x2UKTIYIt7HGZEYxF1+1lqxNDQ==", - "license": "Apache-2.0", - "peer": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@backstage/backend-plugin-api": { "version": "0.6.21", "resolved": "https://registry.npmjs.org/@backstage/backend-plugin-api/-/backend-plugin-api-0.6.21.tgz", "integrity": "sha512-Cek3jgJmUY6oGDAYd7o/M6fezSnOIHzCBEsJHeE4vakdZ2vYOGVWPGIQmWSylEhK/oEL54JUslB5VjHo1onL9A==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/cli-common": "^0.1.14", "@backstage/config": "^1.2.0", @@ -1369,8 +1565,8 @@ "version": "1.15.2", "resolved": "https://registry.npmjs.org/@backstage/catalog-client/-/catalog-client-1.15.2.tgz", "integrity": "sha512-Q0Jjsp7rPEMYsqxumu681KlUOC/my1zkhk1YxBiggAHRFCVYUAXMM98WL2uN4IzzN+0r7bHxO5a2a7nGBk/n8w==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/catalog-model": "^1.9.0", "@backstage/errors": "^1.3.1", @@ -1385,8 +1581,8 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@backstage/catalog-model/-/catalog-model-1.9.0.tgz", "integrity": "sha512-Q3K2IGemrEKgHVJr2X0gztr2fXMeobJrskRvNJVUtVtmGs+cIXjwYhl6K3/a2gmAXqLRk7rPh8waULLqumVyLg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/errors": "^1.3.1", "@backstage/types": "^1.2.2", @@ -1400,8 +1596,8 @@ "version": "0.1.18", "resolved": "https://registry.npmjs.org/@backstage/cli-common/-/cli-common-0.1.18.tgz", "integrity": "sha512-6Ks0tnqJpZPppwq4F6Ft3AvmUUe7NAqzKtXMKSmePjBtGgoqVn/dB8HJSZcW4UMooiGGDjGEz2bpWQ/qH3bWQw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/errors": "^1.2.7", "cross-spawn": "^7.0.3", @@ -1413,8 +1609,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/@backstage/config/-/config-1.3.8.tgz", "integrity": "sha512-OEfwIyc+sdZfUmgV9YgmljsboL0ClulCipj7vE9t0QL3Qu7mgEkOzQmIL7sbCjh9DgvvvavIllo028e5MhioYQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/errors": "^1.3.1", "@backstage/types": "^1.2.2", @@ -1425,8 +1621,8 @@ "version": "1.10.11", "resolved": "https://registry.npmjs.org/@backstage/config-loader/-/config-loader-1.10.11.tgz", "integrity": "sha512-iELyjcP2S6Po/qbGSzvWrhUrAx4Co7XppdlrWAiGGAH9RGbOSVc4SpgTOhbIOYayKXiADyDcypSqJ4sloJn+Gw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/cli-common": "^0.2.2", "@backstage/config": "^1.3.8", @@ -1449,8 +1645,8 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/@backstage/cli-common/-/cli-common-0.2.2.tgz", "integrity": "sha512-wdquML3iQZaLcPJR1Z19dLahGhShwa0xmxkOI26wUJzcJhbqMt5MjD6F/Hg3p0kF3bvZP+dPC/LNXNDUsCOk4g==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/errors": "^1.3.1", "cross-spawn": "^7.0.3", @@ -1462,8 +1658,8 @@ "version": "1.20.1", "resolved": "https://registry.npmjs.org/@backstage/core-app-api/-/core-app-api-1.20.1.tgz", "integrity": "sha512-QQBYu+0oYroSYaf7NaXXujckUOa8B5yDOUgoksOZPBiNrUmHLn0L6HP4HUupXL6nd/Fj7/GeFlzNdvEQxwdwfw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/config": "^1.3.8", "@backstage/core-plugin-api": "^1.12.6", @@ -1495,8 +1691,8 @@ "version": "0.5.11", "resolved": "https://registry.npmjs.org/@backstage/core-compat-api/-/core-compat-api-0.5.11.tgz", "integrity": "sha512-8XsFgb7z3ZdvVhKPKcmVNTIh7AoYumszoyaj7PIFSzo3BzEEUzdapUak1qOnsODdIl+qbSQ1vwjHrw8AL9NE6A==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/core-plugin-api": "^1.12.6", "@backstage/errors": "^1.3.1", @@ -1520,184 +1716,64 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/frontend-app-api": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@backstage/frontend-app-api/-/frontend-app-api-0.16.3.tgz", - "integrity": "sha512-7JzgFn89CdX9wCbzsVRb5uv05MBKnKwPlG9AdAiN4YLJOAlIZqYlTeYRVPzPwj8pfhOAiT35s9rPAVHjAdWPhg==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/core-app-api": "^1.20.1", - "@backstage/core-plugin-api": "^1.12.6", - "@backstage/errors": "^1.3.1", - "@backstage/filter-predicates": "^0.1.3", - "@backstage/frontend-defaults": "^0.5.2", - "@backstage/frontend-plugin-api": "^0.17.0", - "@backstage/types": "^1.2.2", - "@backstage/version-bridge": "^1.0.12", - "lodash": "^4.17.21", - "zod": "^3.25.76 || ^4.0.0" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/frontend-defaults": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@backstage/frontend-defaults/-/frontend-defaults-0.5.2.tgz", - "integrity": "sha512-iJ/VsN7dCQKDnwuG2ad2/f7gXplX5Du97AeRvLcNEKo4/XJcV3XTSE+mkRiUOeqPMkOzjBAYZ1hOk+emaeNJxA==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/core-components": "^0.18.10", - "@backstage/errors": "^1.3.1", - "@backstage/frontend-app-api": "^0.16.3", - "@backstage/frontend-plugin-api": "^0.17.0", - "@backstage/plugin-app": "^0.4.6", - "@react-hookz/web": "^24.0.0" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/frontend-test-utils": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@backstage/frontend-test-utils/-/frontend-test-utils-0.6.0.tgz", - "integrity": "sha512-CyN9uukdWfYw/ac+kXUyfTPuSch1icvjll7UwEIlaZRZ+e5gqfcVu59Zy5sNfdjG75GREjA//WbgqVLboaenNA==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/core-app-api": "^1.20.1", - "@backstage/core-plugin-api": "^1.12.6", - "@backstage/filter-predicates": "^0.1.3", - "@backstage/frontend-app-api": "^0.16.3", - "@backstage/frontend-plugin-api": "^0.17.0", - "@backstage/plugin-app": "^0.4.6", - "@backstage/plugin-app-react": "^0.2.3", - "@backstage/plugin-permission-common": "^0.9.9", - "@backstage/plugin-permission-react": "^0.5.1", - "@backstage/test-utils": "^1.7.18", - "@backstage/types": "^1.2.2", - "@backstage/version-bridge": "^1.0.12", - "i18next": "^22.4.15", - "zen-observable": "^0.10.0", - "zod": "^3.25.76 || ^4.0.0" - }, - "peerDependencies": { - "@testing-library/react": "^16.0.0", - "@types/jest": "*", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@types/jest": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@backstage/plugin-app/-/plugin-app-0.4.6.tgz", - "integrity": "sha512-OC2GQyu2k1nJdIka6Sa+uM2/RtD9RwHHpsd6OQtNNRU7AVUIGBWokLcK9Nc9d1SMp3+qM8wg8kRaNQXE9rovXw==", + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@backstage/plugin-catalog-react/-/plugin-catalog-react-3.0.0.tgz", + "integrity": "sha512-Khny0+02jy1TbgrAX8fQjuBLLLs7gsfaHxW+EoCk2ebG7IlLgCiCfjCuhmrz0W08O+2uACzzNZe0grDSY6tykw==", + "dev": true, "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { + "@backstage/catalog-client": "^1.15.1", + "@backstage/catalog-model": "^1.9.0", + "@backstage/core-compat-api": "^0.5.11", "@backstage/core-components": "^0.18.10", "@backstage/core-plugin-api": "^1.12.6", + "@backstage/errors": "^1.3.1", "@backstage/filter-predicates": "^0.1.3", "@backstage/frontend-plugin-api": "^0.17.0", "@backstage/integration-react": "^1.2.18", - "@backstage/plugin-app-react": "^0.2.3", + "@backstage/plugin-permission-common": "^0.9.9", "@backstage/plugin-permission-react": "^0.5.1", - "@backstage/theme": "^0.7.3", "@backstage/types": "^1.2.2", "@backstage/ui": "^0.15.0", "@backstage/version-bridge": "^1.0.12", - "@material-ui/core": "^4.9.13", + "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.61", + "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@remixicon/react": ">=4.6.0 <4.9.0", - "motion": "^12.0.0", - "react-aria": "~3.48.0", - "react-stately": "~3.46.0", + "classnames": "^2.2.6", + "lodash": "^4.17.21", + "material-ui-popup-state": "^5.3.6", + "qs": "^6.9.4", "react-use": "^17.2.4", + "yaml": "^2.0.0", "zen-observable": "^0.10.0", "zod": "^4.0.0" }, "peerDependencies": { + "@backstage/frontend-test-utils": "^0.6.0", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { - "@types/react": { + "@backstage/frontend-test-utils": { "optional": true - } - } - }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/@backstage/theme": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@backstage/theme/-/theme-0.7.3.tgz", - "integrity": "sha512-EE9Mm6GjEMDwr/+iXmJfMq2jIJDCnjPbaua5YCtUN/E1Q/FOBcFmijJeTLn8gF0xeEiYxrZhQf0NBRlxfapR/g==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@emotion/react": "^11.10.5", - "@emotion/styled": "^11.10.5", - "@mui/material": "^5.12.2" - }, - "peerDependencies": { - "@material-ui/core": "^4.12.2", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { + }, "@types/react": { "optional": true } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/@material-ui/core": { + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core": { "version": "4.12.4", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/styles": "^4.11.5", @@ -1730,14 +1806,13 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/styles": { "version": "4.11.5", "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", @@ -1774,13 +1849,12 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/@material-ui/system": { + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/system": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.3", @@ -1805,13 +1879,12 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/utils": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -1825,13 +1898,12 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/@material-ui/icons": { + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/icons": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4" }, @@ -1850,14 +1922,13 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/@material-ui/lab": { + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/lab": { "version": "4.0.0-alpha.61", "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.3", @@ -1880,13 +1951,12 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/@material-ui/lab/node_modules/@material-ui/utils": { + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/lab/node_modules/@material-ui/utils": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -1900,116 +1970,141 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/clsx": { + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=6" } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/csstype": { + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/csstype": { "version": "2.6.21", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "license": "MIT", - "optional": true, - "peer": true + "dev": true, + "license": "MIT" }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-app/node_modules/react-is": { + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT", - "optional": true, - "peer": true + "dev": true, + "license": "MIT" }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@backstage/plugin-catalog-react/-/plugin-catalog-react-3.0.0.tgz", - "integrity": "sha512-Khny0+02jy1TbgrAX8fQjuBLLLs7gsfaHxW+EoCk2ebG7IlLgCiCfjCuhmrz0W08O+2uACzzNZe0grDSY6tykw==", + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-permission-common": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", + "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@backstage/catalog-client": "^1.15.1", - "@backstage/catalog-model": "^1.9.0", - "@backstage/core-compat-api": "^0.5.11", - "@backstage/core-components": "^0.18.10", - "@backstage/core-plugin-api": "^1.12.6", + "@backstage/config": "^1.3.8", "@backstage/errors": "^1.3.1", - "@backstage/filter-predicates": "^0.1.3", - "@backstage/frontend-plugin-api": "^0.17.0", - "@backstage/integration-react": "^1.2.18", - "@backstage/plugin-permission-common": "^0.9.9", - "@backstage/plugin-permission-react": "^0.5.1", "@backstage/types": "^1.2.2", - "@backstage/ui": "^0.15.0", - "@backstage/version-bridge": "^1.0.12", - "@material-ui/core": "^4.12.2", - "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.61", - "@react-hookz/web": "^24.0.0", - "@remixicon/react": ">=4.6.0 <4.9.0", - "classnames": "^2.2.6", - "lodash": "^4.17.21", - "material-ui-popup-state": "^5.3.6", - "qs": "^6.9.4", - "react-use": "^17.2.4", - "yaml": "^2.0.0", - "zen-observable": "^0.10.0", - "zod": "^4.0.0" - }, - "peerDependencies": { - "@backstage/frontend-test-utils": "^0.6.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@backstage/frontend-test-utils": { - "optional": true - }, - "@types/react": { - "optional": true - } + "cross-fetch": "^4.0.0", + "zod": "^3.25.76 || ^4.0.0", + "zod-to-json-schema": "^3.25.1" } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "license": "MIT", - "peer": true, + "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-permission-react": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-react/-/plugin-permission-react-0.5.1.tgz", + "integrity": "sha512-R7RBOol/ZW4yNGkxIPWEHghR8hkpS7LYqgE7RHxNAtp/L0NUQ1mp+HcOo9QQo1iWaqrqAEX3TA2WVqoolguoTA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" + "@backstage/config": "^1.3.8", + "@backstage/core-plugin-api": "^1.12.6", + "@backstage/plugin-permission-common": "^0.9.9", + "dataloader": "^2.0.0", + "swr": "^2.0.0" }, - "engines": { - "node": ">=8.0.0" + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@backstage/core-compat-api/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/core-compat-api/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@backstage/core-components": { + "version": "0.18.10", + "resolved": "https://registry.npmjs.org/@backstage/core-components/-/core-components-0.18.10.tgz", + "integrity": "sha512-3EZjTwhJGt4KJPNu3fKIHRajOKbCRd/i5q/bvnHoW9kRxtV1UXkmaRzSxjb4Kh9DYoWTvuq7/+EWGY9WKrz9fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/config": "^1.3.8", + "@backstage/core-plugin-api": "^1.12.6", + "@backstage/errors": "^1.3.1", + "@backstage/theme": "^0.7.3", + "@backstage/version-bridge": "^1.0.12", + "@dagrejs/dagre": "^1.1.4", + "@date-io/core": "^1.3.13", + "@material-table/core": "^3.1.0", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "4.0.0-alpha.61", + "@react-hookz/web": "^24.0.0", + "@testing-library/react": "^16.0.0", + "@types/react-sparklines": "^1.7.0", + "ansi-regex": "^6.0.1", + "classnames": "^2.2.6", + "csstype": "^3.0.2", + "d3-selection": "^3.0.0", + "d3-shape": "^3.0.0", + "d3-zoom": "^3.0.0", + "js-yaml": "^4.1.0", + "linkify-react": "4.3.2", + "linkifyjs": "4.3.2", + "lodash": "^4.17.21", + "parse5": "^6.0.0", + "qs": "^6.9.4", + "rc-progress": "3.5.1", + "react-full-screen": "^1.1.1", + "react-helmet": "6.1.0", + "react-hook-form": "^7.12.2", + "react-idle-timer": "5.7.2", + "react-markdown": "^8.0.0", + "react-sparklines": "^1.7.0", + "react-syntax-highlighter": "^15.4.5", + "react-use": "^17.3.2", + "react-virtualized-auto-sizer": "^1.0.11", + "react-window": "^1.8.6", + "rehype-raw": "^6.0.0", + "rehype-sanitize": "^5.0.0", + "remark-gfm": "^3.0.1", + "zen-observable": "^0.10.0", + "zod": "^3.25.76 || ^4.0.0" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { @@ -2017,13 +2112,94 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "node_modules/@backstage/core-components/node_modules/@backstage/theme": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@backstage/theme/-/theme-0.7.3.tgz", + "integrity": "sha512-EE9Mm6GjEMDwr/+iXmJfMq2jIJDCnjPbaua5YCtUN/E1Q/FOBcFmijJeTLn8gF0xeEiYxrZhQf0NBRlxfapR/g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@mui/material": "^5.12.2" + }, + "peerDependencies": { + "@material-ui/core": "^4.12.2", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@backstage/core-components/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/core-components/node_modules/@material-table/core": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@material-table/core/-/core-3.2.5.tgz", + "integrity": "sha512-TmVN/In15faabezW3COb4Ve5+YhqxFEQnf2Q2Cz3FVXXCFqJvtu3pkRLi+7N9UJ5bvistszz6wfHeiZZY1Rf9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@date-io/date-fns": "^1.3.13", + "@material-ui/pickers": "^3.2.10", + "@material-ui/styles": "^4.11.4", + "classnames": "^2.2.6", + "date-fns": "^2.16.1", + "debounce": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "prop-types": "^15.7.2", + "react-beautiful-dnd": "^13.0.0", + "react-double-scrollbar": "0.0.15", + "uuid": "^3.4.0" + }, + "peerDependencies": { + "@date-io/core": "^1.3.13", + "@material-ui/core": "^4.11.2", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/pickers": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@material-ui/pickers/-/pickers-3.3.11.tgz", + "integrity": "sha512-pDYjbjUeabapijS2FpSwK/ruJdk7IGeAshpLbKDa3PRRKRy7Nv6sXxAvUg2F+lID/NwUKgBmCYS5bzrl7Xxqzw==", + "deprecated": "This package no longer supported. It has been relaced by @mui/x-date-pickers", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.6.0", + "@date-io/core": "1.x", + "@types/styled-jsx": "^2.2.8", + "clsx": "^1.0.2", + "react-transition-group": "^4.0.0", + "rifm": "^0.7.0" + }, + "peerDependencies": { + "@date-io/core": "^1.3.6", + "@material-ui/core": "^4.0.0", + "prop-types": "^15.6.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/styles": { "version": "4.11.5", "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", @@ -2060,42 +2236,12 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/styles/node_modules/@material-ui/utils": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -2109,20 +2255,52 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/icons": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", - "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/styles/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4" + "engines": { + "node": ">=6" + } + }, + "node_modules/@backstage/core-components/node_modules/@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" }, "engines": { "node": ">=8.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, "peerDependencies": { - "@material-ui/core": "^4.0.0", "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" @@ -2133,25 +2311,39 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/lab": { - "version": "4.0.0-alpha.61", - "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", - "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", + "node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.3", "clsx": "^1.0.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" }, "engines": { "node": ">=8.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, "peerDependencies": { - "@material-ui/core": "^4.12.1", "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" @@ -2162,12 +2354,42 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/lab/node_modules/@material-ui/utils": { + "node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/@material-ui/utils": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -2181,62 +2403,69 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/clsx": { + "node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/csstype": { + "node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/csstype": { "version": "2.6.21", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-catalog-react/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "node_modules/@backstage/core-components/node_modules/@material-ui/icons": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", + "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "dev": true, "license": "MIT", - "peer": true - }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-permission-common": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", - "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", - "license": "Apache-2.0", - "peer": true, "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/errors": "^1.3.1", - "@backstage/types": "^1.2.2", - "cross-fetch": "^4.0.0", - "zod": "^3.25.76 || ^4.0.0", - "zod-to-json-schema": "^3.25.1" + "@babel/runtime": "^7.4.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@backstage/core-compat-api/node_modules/@backstage/plugin-permission-react": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-react/-/plugin-permission-react-0.5.1.tgz", - "integrity": "sha512-R7RBOol/ZW4yNGkxIPWEHghR8hkpS7LYqgE7RHxNAtp/L0NUQ1mp+HcOo9QQo1iWaqrqAEX3TA2WVqoolguoTA==", - "license": "Apache-2.0", - "peer": true, + "node_modules/@backstage/core-components/node_modules/@material-ui/lab": { + "version": "4.0.0-alpha.61", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", + "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, + "license": "MIT", "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/core-plugin-api": "^1.12.6", - "@backstage/plugin-permission-common": "^0.9.9", - "dataloader": "^2.0.0", - "swr": "^2.0.0" + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@material-ui/core": "^4.12.1", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2244,32 +2473,52 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "node_modules/@backstage/core-components/node_modules/@material-ui/lab/node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@backstage/core-components/node_modules/@material-ui/lab/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/@backstage/core-compat-api/node_modules/@mui/core-downloads-tracker": { + "node_modules/@backstage/core-components/node_modules/@mui/core-downloads-tracker": { "version": "5.18.0", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, - "node_modules/@backstage/core-compat-api/node_modules/@mui/material": { + "node_modules/@backstage/core-components/node_modules/@mui/material": { "version": "5.18.0", "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/core-downloads-tracker": "^5.18.0", @@ -2310,13 +2559,19 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@mui/private-theming": { + "node_modules/@backstage/core-components/node_modules/@mui/material/node_modules/react-is": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/core-components/node_modules/@mui/private-theming": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/utils": "^5.17.1", @@ -2339,13 +2594,12 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@mui/styled-engine": { + "node_modules/@backstage/core-components/node_modules/@mui/styled-engine": { "version": "5.18.0", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.13.5", @@ -2374,13 +2628,12 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@mui/system": { + "node_modules/@backstage/core-components/node_modules/@mui/system": { "version": "5.18.0", "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.17.1", @@ -2416,13 +2669,12 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@mui/types": { + "node_modules/@backstage/core-components/node_modules/@mui/types": { "version": "7.2.24", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -2432,13 +2684,12 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/@mui/utils": { + "node_modules/@backstage/core-components/node_modules/@mui/utils": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/types": "~7.2.15", @@ -2464,72 +2715,44 @@ } } }, - "node_modules/@backstage/core-compat-api/node_modules/react-is": { + "node_modules/@backstage/core-components/node_modules/@mui/utils/node_modules/react-is": { "version": "19.2.7", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "license": "MIT", - "optional": true, - "peer": true + "dev": true, + "license": "MIT" }, - "node_modules/@backstage/core-compat-api/node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "node_modules/@backstage/core-components/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/core-components/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/@backstage/core-components": { - "version": "0.18.10", - "resolved": "https://registry.npmjs.org/@backstage/core-components/-/core-components-0.18.10.tgz", - "integrity": "sha512-3EZjTwhJGt4KJPNu3fKIHRajOKbCRd/i5q/bvnHoW9kRxtV1UXkmaRzSxjb4Kh9DYoWTvuq7/+EWGY9WKrz9fg==", + "node_modules/@backstage/core-plugin-api": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/@backstage/core-plugin-api/-/core-plugin-api-1.12.6.tgz", + "integrity": "sha512-RCyiD5b3daod756VLRkuyqlxjGVsRqqSwB4X3vKxUaTgZiE0rzxKv/MH2gxo2U2YSP15Q9WoXqMstNWF3i5O6w==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/config": "^1.3.8", - "@backstage/core-plugin-api": "^1.12.6", "@backstage/errors": "^1.3.1", - "@backstage/theme": "^0.7.3", + "@backstage/frontend-plugin-api": "^0.17.0", + "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.12", - "@dagrejs/dagre": "^1.1.4", - "@date-io/core": "^1.3.13", - "@material-table/core": "^3.1.0", - "@material-ui/core": "^4.12.2", - "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.61", - "@react-hookz/web": "^24.0.0", - "@testing-library/react": "^16.0.0", - "@types/react-sparklines": "^1.7.0", - "ansi-regex": "^6.0.1", - "classnames": "^2.2.6", - "csstype": "^3.0.2", - "d3-selection": "^3.0.0", - "d3-shape": "^3.0.0", - "d3-zoom": "^3.0.0", - "js-yaml": "^4.1.0", - "linkify-react": "4.3.2", - "linkifyjs": "4.3.2", - "lodash": "^4.17.21", - "parse5": "^6.0.0", - "qs": "^6.9.4", - "rc-progress": "3.5.1", - "react-full-screen": "^1.1.1", - "react-helmet": "6.1.0", - "react-hook-form": "^7.12.2", - "react-idle-timer": "5.7.2", - "react-markdown": "^8.0.0", - "react-sparklines": "^1.7.0", - "react-syntax-highlighter": "^15.4.5", - "react-use": "^17.3.2", - "react-virtualized-auto-sizer": "^1.0.11", - "react-window": "^1.8.6", - "rehype-raw": "^6.0.0", - "rehype-sanitize": "^5.0.0", - "remark-gfm": "^3.0.1", - "zen-observable": "^0.10.0", + "history": "^5.0.0", "zod": "^3.25.76 || ^4.0.0" }, "peerDependencies": { @@ -2544,23 +2767,54 @@ } } }, - "node_modules/@backstage/core-components/node_modules/@backstage/theme": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@backstage/theme/-/theme-0.7.3.tgz", - "integrity": "sha512-EE9Mm6GjEMDwr/+iXmJfMq2jIJDCnjPbaua5YCtUN/E1Q/FOBcFmijJeTLn8gF0xeEiYxrZhQf0NBRlxfapR/g==", + "node_modules/@backstage/errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@backstage/errors/-/errors-1.3.1.tgz", + "integrity": "sha512-EsBo684l3rEcKrGYSBw26LsRdLAAxU6u6GWaOPLt4MYAvK28fCs5arsg2He2Q6cIYJRiD8PiLEAH8o+C1xUWLA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@emotion/react": "^11.10.5", - "@emotion/styled": "^11.10.5", - "@mui/material": "^5.12.2" + "@backstage/types": "^1.2.2", + "serialize-error": "^8.0.1" + } + }, + "node_modules/@backstage/filter-predicates": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@backstage/filter-predicates/-/filter-predicates-0.1.3.tgz", + "integrity": "sha512-zEfsrlU1+GjbLlKPINcXNxKTZpjEWFYF+wYqo/is6fSCqiFF11upqetxSZV0OQ11oIEqvtonJB1aZVJv19VtnQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/config": "^1.3.8", + "@backstage/errors": "^1.3.1", + "@backstage/types": "^1.2.2", + "zod": "^3.25.76 || ^4.0.0", + "zod-validation-error": "^4.0.2" + } + }, + "node_modules/@backstage/frontend-app-api": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@backstage/frontend-app-api/-/frontend-app-api-0.14.1.tgz", + "integrity": "sha512-d01J9XfhTq1yBWPcUmlr6BfNPv4Ykb9zJFGTfDn3OtnCb06J3o3miENL8+V/CpW7COHa1trfWYvDDCI/7RJYbg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/config": "^1.3.6", + "@backstage/core-app-api": "^1.19.4", + "@backstage/core-plugin-api": "^1.12.2", + "@backstage/errors": "^1.2.7", + "@backstage/frontend-defaults": "^0.3.6", + "@backstage/frontend-plugin-api": "^0.13.4", + "@backstage/types": "^1.2.2", + "@backstage/version-bridge": "^1.0.11", + "lodash": "^4.17.21", + "zod": "^3.25.76" }, "peerDependencies": { - "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" + "react-router-dom": "^6.3.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2568,99 +2822,76 @@ } } }, - "node_modules/@backstage/core-components/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/core-components/node_modules/@material-table/core": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@material-table/core/-/core-3.2.5.tgz", - "integrity": "sha512-TmVN/In15faabezW3COb4Ve5+YhqxFEQnf2Q2Cz3FVXXCFqJvtu3pkRLi+7N9UJ5bvistszz6wfHeiZZY1Rf9Q==", - "license": "MIT", - "peer": true, + "node_modules/@backstage/frontend-app-api/node_modules/@backstage/frontend-plugin-api": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz", + "integrity": "sha512-IkzS5ltuxj5cl4OG/6FWZmkr7lcA9rZ4j1LaACA8W9//Av7lYVagvyqK2kuQfQmo2burzVTQMj25YV08h+QX7A==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.12.5", - "@date-io/date-fns": "^1.3.13", - "@material-ui/pickers": "^3.2.10", - "@material-ui/styles": "^4.11.4", - "classnames": "^2.2.6", - "date-fns": "^2.16.1", - "debounce": "^1.2.0", - "fast-deep-equal": "^3.1.3", - "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.0.0", - "react-double-scrollbar": "0.0.15", - "uuid": "^3.4.0" + "@backstage/errors": "^1.2.7", + "@backstage/types": "^1.2.2", + "@backstage/version-bridge": "^1.0.11", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { - "@date-io/core": "^1.3.13", - "@material-ui/core": "^4.11.2", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.3.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/pickers": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/@material-ui/pickers/-/pickers-3.3.11.tgz", - "integrity": "sha512-pDYjbjUeabapijS2FpSwK/ruJdk7IGeAshpLbKDa3PRRKRy7Nv6sXxAvUg2F+lID/NwUKgBmCYS5bzrl7Xxqzw==", - "deprecated": "This package no longer supported. It has been relaced by @mui/x-date-pickers", - "license": "MIT", - "peer": true, + "node_modules/@backstage/frontend-defaults": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@backstage/frontend-defaults/-/frontend-defaults-0.3.6.tgz", + "integrity": "sha512-oZjBc/9J2IGuS2smsXvRqR/zzkseUH/zJG9oUK53PW+Oy5fgj0YJbAVRQRnTGlLjNUSO1zwKa1ASwSi+Bnpwmg==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.6.0", - "@date-io/core": "1.x", - "@types/styled-jsx": "^2.2.8", - "clsx": "^1.0.2", - "react-transition-group": "^4.0.0", - "rifm": "^0.7.0" + "@backstage/config": "^1.3.6", + "@backstage/core-components": "^0.18.6", + "@backstage/errors": "^1.2.7", + "@backstage/frontend-app-api": "^0.14.1", + "@backstage/frontend-plugin-api": "^0.13.4", + "@backstage/plugin-app": "^0.3.5", + "@react-hookz/web": "^24.0.0" }, "peerDependencies": { - "@date-io/core": "^1.3.6", - "@material-ui/core": "^4.0.0", - "prop-types": "^15.6.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.3.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "license": "MIT", - "peer": true, + "node_modules/@backstage/frontend-defaults/node_modules/@backstage/frontend-plugin-api": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz", + "integrity": "sha512-IkzS5ltuxj5cl4OG/6FWZmkr7lcA9rZ4j1LaACA8W9//Av7lYVagvyqK2kuQfQmo2burzVTQMj25YV08h+QX7A==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "@backstage/errors": "^1.2.7", + "@backstage/types": "^1.2.2", + "@backstage/version-bridge": "^1.0.11", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.3.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2668,62 +2899,129 @@ } } }, - "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/styles/node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "license": "MIT", - "peer": true, + "node_modules/@backstage/frontend-plugin-api": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.17.1.tgz", + "integrity": "sha512-qZBRz7RJARs2C87PzskIVdDKF5YqB3DaD6qvkMUmuNAOfzidnRbRW7HEp7s2wa+wuMayZk11+i64kRYIr/ytDw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" + "@backstage/config": "^1.3.8", + "@backstage/errors": "^1.3.1", + "@backstage/filter-predicates": "^0.1.3", + "@backstage/types": "^1.2.2", + "@backstage/version-bridge": "^1.0.12", + "@standard-schema/spec": "^1.1.0", + "zod": "^4.0.0", + "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/styles/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "node_modules/@backstage/frontend-plugin-api/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, "license": "MIT", - "peer": true + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } }, - "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@types/react": { - "version": "17.0.93", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.93.tgz", - "integrity": "sha512-KM4Ty/ZTLZupiYxZVAlP+InNJS3De6uBMdq0ePa6/04+eG9Y7ftnWfst1xTLQ5rwAhgHwQ4momt/O4KepdGBTw==", - "license": "MIT", - "optional": true, - "peer": true, + "node_modules/@backstage/frontend-test-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@backstage/frontend-test-utils/-/frontend-test-utils-0.4.5.tgz", + "integrity": "sha512-5B9zvB5IiRUr5UaP3To/JQC+AcgLGFiZzaIoy7+sMSvgKWVrlwK7EtVOLB9B4/4peJIPCOMzuXWkUJaP3jSK9A==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "^0.16", - "csstype": "^3.2.2" + "@backstage/config": "^1.3.6", + "@backstage/frontend-app-api": "^0.14.1", + "@backstage/frontend-plugin-api": "^0.13.4", + "@backstage/plugin-app": "^0.3.5", + "@backstage/plugin-app-react": "^0.1.0", + "@backstage/test-utils": "^1.7.14", + "@backstage/types": "^1.2.2", + "@backstage/version-bridge": "^1.0.11", + "zod": "^3.25.76" + }, + "peerDependencies": { + "@testing-library/react": "^16.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.3.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" + "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/frontend-plugin-api": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz", + "integrity": "sha512-IkzS5ltuxj5cl4OG/6FWZmkr7lcA9rZ4j1LaACA8W9//Av7lYVagvyqK2kuQfQmo2burzVTQMj25YV08h+QX7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/errors": "^1.2.7", + "@backstage/types": "^1.2.2", + "@backstage/version-bridge": "^1.0.11", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.3.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@backstage/core-components/node_modules/@material-ui/core": { + "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/plugin-app-react": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@backstage/plugin-app-react/-/plugin-app-react-0.1.0.tgz", + "integrity": "sha512-9lVx7Gon5uRmIAkdSTNH0TrRdE1qx4UB7KH4uHWt07ARDNWUyXIHe94wcnu5NSlkqqt6VriomYju5cLCG8cKdw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/core-plugin-api": "^1.12.1", + "@backstage/frontend-plugin-api": "^0.13.3", + "@material-ui/core": "^4.9.13" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.3.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core": { "version": "4.12.4", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/styles": "^4.11.5", @@ -2756,13 +3054,13 @@ } } }, - "node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/styles": { "version": "4.11.5", "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", @@ -2799,12 +3097,12 @@ } } }, - "node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/@material-ui/system": { + "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/system": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.3", @@ -2829,12 +3127,12 @@ } } }, - "node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/utils": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -2848,40 +3146,90 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/clsx": { + "node_modules/@backstage/frontend-test-utils/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/frontend-test-utils/node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, - "node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/csstype": { + "node_modules/@backstage/frontend-test-utils/node_modules/csstype": { "version": "2.6.21", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, - "node_modules/@backstage/core-components/node_modules/@material-ui/icons": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", - "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", - "license": "MIT", - "peer": true, + "node_modules/@backstage/frontend-test-utils/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/integration": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/@backstage/integration/-/integration-1.20.1.tgz", + "integrity": "sha512-rfYMauJAq0BcEPcAm3em/NJC8Gvu3WzRfbgr3onEdjEc0/hEE2ffXmTcMSZykieltV3IAMHwfF2UBm0eV+hOhQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.4.4" - }, - "engines": { - "node": ">=8.0.0" + "@azure/identity": "^4.0.0", + "@azure/storage-blob": "^12.5.0", + "@backstage/config": "^1.3.6", + "@backstage/errors": "^1.2.7", + "@octokit/auth-app": "^4.0.0", + "@octokit/rest": "^19.0.3", + "cross-fetch": "^4.0.0", + "git-url-parse": "^15.0.0", + "lodash": "^4.17.21", + "luxon": "^3.0.0" + } + }, + "node_modules/@backstage/integration-aws-node": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@backstage/integration-aws-node/-/integration-aws-node-0.1.21.tgz", + "integrity": "sha512-aqeol4gA/NP2uNcPWeBMHl/z2W7b44rUveM365SVMCtVmX7izG1f0AmU5e7RuRQ1784EZuGdy5kZlvp93kaoGA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sts": "^3.350.0", + "@aws-sdk/credential-provider-node": "^3.350.0", + "@aws-sdk/credential-providers": "^3.350.0", + "@aws-sdk/types": "^3.347.0", + "@aws-sdk/util-arn-parser": "^3.310.0", + "@backstage/config": "^1.3.7", + "@backstage/errors": "^1.3.0" + } + }, + "node_modules/@backstage/integration-react": { + "version": "1.2.18", + "resolved": "https://registry.npmjs.org/@backstage/integration-react/-/integration-react-1.2.18.tgz", + "integrity": "sha512-zbEnIwGIVWwqrIWR7BlXHaT9ZfZn38Rh6Hit0aRxsHGOPbMp2IkTvG+mAW6q4Lxn8SE5kcRVtSMho/dECwIu7g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/config": "^1.3.8", + "@backstage/core-plugin-api": "^1.12.6", + "@backstage/integration": "^2.0.2", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1" }, "peerDependencies": { - "@material-ui/core": "^4.0.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { @@ -2889,25 +3237,62 @@ } } }, - "node_modules/@backstage/core-components/node_modules/@material-ui/lab": { - "version": "4.0.0-alpha.61", - "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", - "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "license": "MIT", - "peer": true, + "node_modules/@backstage/integration-react/node_modules/@backstage/integration": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@backstage/integration/-/integration-2.0.2.tgz", + "integrity": "sha512-rBOBngFpOfFfwtGyAQC8/5b0CEd5L/srstsAIR1GHP+teyu3I1XpxC+WldiICkQ/Ls12gEA2xLOj4aSeT3Qzug==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@azure/identity": "^4.0.0", + "@azure/storage-blob": "^12.5.0", + "@backstage/config": "^1.3.8", + "@backstage/errors": "^1.3.1", + "@octokit/auth-app": "^4.0.0", + "@octokit/rest": "^19.0.3", + "cross-fetch": "^4.0.0", + "git-url-parse": "^15.0.0", + "lodash": "^4.17.21", + "luxon": "^3.0.0", + "p-throttle": "^4.1.1" + } + }, + "node_modules/@backstage/integration-react/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/integration-react/node_modules/@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" }, "engines": { "node": ">=8.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, "peerDependencies": { - "@material-ui/core": "^4.12.1", "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" @@ -2918,120 +3303,72 @@ } } }, - "node_modules/@backstage/core-components/node_modules/@material-ui/lab/node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "node_modules/@backstage/integration-react/node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" }, "engines": { "node": ">=8.0.0" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@backstage/core-components/node_modules/@material-ui/lab/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@backstage/core-components/node_modules/@mui/core-downloads-tracker": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", - "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@backstage/core-components/node_modules/@mui/material": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", - "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.18.0", - "@mui/system": "^5.18.0", - "@mui/types": "~7.2.15", - "@mui/utils": "^5.17.1", - "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1", - "react-is": "^19.0.0", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=12.0.0" - }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "url": "https://opencollective.com/material-ui" }, "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, "@types/react": { "optional": true } } }, - "node_modules/@backstage/core-components/node_modules/@mui/material/node_modules/react-is": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", - "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/core-components/node_modules/@mui/private-theming": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", - "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "node_modules/@backstage/integration-react/node_modules/@material-ui/core/node_modules/@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.17.1", - "prop-types": "^15.8.1" + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=8.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "url": "https://opencollective.com/material-ui" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -3039,220 +3376,114 @@ } } }, - "node_modules/@backstage/core-components/node_modules/@mui/styled-engine": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", - "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", + "node_modules/@backstage/integration-react/node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.13.5", - "@emotion/serialize": "^1.3.3", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "node": ">=8.0.0" }, "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/@backstage/core-components/node_modules/@mui/system": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", - "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", + "node_modules/@backstage/integration-react/node_modules/@material-ui/icons": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", + "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.17.1", - "@mui/styled-engine": "^5.18.0", - "@mui/types": "~7.2.15", - "@mui/utils": "^5.17.1", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" + "@babel/runtime": "^7.4.4" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "node": ">=8.0.0" }, "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@material-ui/core": "^4.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, "@types/react": { "optional": true } } }, - "node_modules/@backstage/core-components/node_modules/@mui/types": { - "version": "7.2.24", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", - "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "node_modules/@backstage/integration-react/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, "license": "MIT", - "peer": true, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=6" } }, - "node_modules/@backstage/core-components/node_modules/@mui/utils": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", - "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "node_modules/@backstage/integration-react/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/integration-react/node_modules/git-url-parse": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-15.0.0.tgz", + "integrity": "sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "~7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^19.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "git-up": "^7.0.0" } }, - "node_modules/@backstage/core-components/node_modules/@mui/utils/node_modules/react-is": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", - "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/core-components/node_modules/react-is": { + "node_modules/@backstage/integration-react/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, - "node_modules/@backstage/core-components/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "node_modules/@backstage/integration/node_modules/git-url-parse": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-15.0.0.tgz", + "integrity": "sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ==", + "dev": true, "license": "MIT", - "peer": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@backstage/core-plugin-api": { - "version": "1.12.6", - "resolved": "https://registry.npmjs.org/@backstage/core-plugin-api/-/core-plugin-api-1.12.6.tgz", - "integrity": "sha512-RCyiD5b3daod756VLRkuyqlxjGVsRqqSwB4X3vKxUaTgZiE0rzxKv/MH2gxo2U2YSP15Q9WoXqMstNWF3i5O6w==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/errors": "^1.3.1", - "@backstage/frontend-plugin-api": "^0.17.0", - "@backstage/types": "^1.2.2", - "@backstage/version-bridge": "^1.0.12", - "history": "^5.0.0", - "zod": "^3.25.76 || ^4.0.0" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@backstage/errors/-/errors-1.3.1.tgz", - "integrity": "sha512-EsBo684l3rEcKrGYSBw26LsRdLAAxU6u6GWaOPLt4MYAvK28fCs5arsg2He2Q6cIYJRiD8PiLEAH8o+C1xUWLA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/types": "^1.2.2", - "serialize-error": "^8.0.1" - } - }, - "node_modules/@backstage/filter-predicates": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@backstage/filter-predicates/-/filter-predicates-0.1.3.tgz", - "integrity": "sha512-zEfsrlU1+GjbLlKPINcXNxKTZpjEWFYF+wYqo/is6fSCqiFF11upqetxSZV0OQ11oIEqvtonJB1aZVJv19VtnQ==", - "license": "Apache-2.0", - "peer": true, "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/errors": "^1.3.1", - "@backstage/types": "^1.2.2", - "zod": "^3.25.76 || ^4.0.0", - "zod-validation-error": "^4.0.2" + "git-up": "^7.0.0" } }, - "node_modules/@backstage/frontend-app-api": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@backstage/frontend-app-api/-/frontend-app-api-0.14.1.tgz", - "integrity": "sha512-d01J9XfhTq1yBWPcUmlr6BfNPv4Ykb9zJFGTfDn3OtnCb06J3o3miENL8+V/CpW7COHa1trfWYvDDCI/7RJYbg==", + "node_modules/@backstage/plugin-app": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@backstage/plugin-app/-/plugin-app-0.3.5.tgz", + "integrity": "sha512-CYrCS1/9u463qU/Nk9TuIc+9mnAb6hcuVQZWqlpwITkm6uh5+oe3h16+KRGrC7JUgsPUtFYtDxNhSNI5taSfXQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@backstage/config": "^1.3.6", - "@backstage/core-app-api": "^1.19.4", + "@backstage/core-components": "^0.18.6", "@backstage/core-plugin-api": "^1.12.2", - "@backstage/errors": "^1.2.7", - "@backstage/frontend-defaults": "^0.3.6", "@backstage/frontend-plugin-api": "^0.13.4", + "@backstage/integration-react": "^1.2.14", + "@backstage/plugin-app-react": "^0.1.0", + "@backstage/plugin-permission-react": "^0.4.39", + "@backstage/theme": "^0.7.1", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", - "lodash": "^4.17.21", + "@material-ui/core": "^4.9.13", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.61", + "@react-hookz/web": "^24.0.0", + "react-use": "^17.2.4", "zod": "^3.25.76" }, "peerDependencies": { @@ -3267,24 +3498,22 @@ } } }, - "node_modules/@backstage/frontend-app-api/node_modules/@backstage/frontend-plugin-api": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz", - "integrity": "sha512-IkzS5ltuxj5cl4OG/6FWZmkr7lcA9rZ4j1LaACA8W9//Av7lYVagvyqK2kuQfQmo2burzVTQMj25YV08h+QX7A==", + "node_modules/@backstage/plugin-app-react": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@backstage/plugin-app-react/-/plugin-app-react-0.2.3.tgz", + "integrity": "sha512-2NsiqqEW6NVzQu/kATKX6DPgjEBbdlLYuRqGRB89NEPk1/XiDFPbnnCjD0ZQ0iA7pj0+9QHLXUhe6hHzKOiIIw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@backstage/errors": "^1.2.7", - "@backstage/types": "^1.2.2", - "@backstage/version-bridge": "^1.0.11", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.25.1" + "@backstage/core-plugin-api": "^1.12.6", + "@backstage/frontend-plugin-api": "^0.17.0", + "@material-ui/core": "^4.9.13" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { @@ -3292,51 +3521,45 @@ } } }, - "node_modules/@backstage/frontend-defaults": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@backstage/frontend-defaults/-/frontend-defaults-0.3.6.tgz", - "integrity": "sha512-oZjBc/9J2IGuS2smsXvRqR/zzkseUH/zJG9oUK53PW+Oy5fgj0YJbAVRQRnTGlLjNUSO1zwKa1ASwSi+Bnpwmg==", - "license": "Apache-2.0", - "peer": true, + "node_modules/@backstage/plugin-app-react/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, + "license": "MIT", "dependencies": { - "@backstage/config": "^1.3.6", - "@backstage/core-components": "^0.18.6", - "@backstage/errors": "^1.2.7", - "@backstage/frontend-app-api": "^0.14.1", - "@backstage/frontend-plugin-api": "^0.13.4", - "@backstage/plugin-app": "^0.3.5", - "@react-hookz/web": "^24.0.0" + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "engines": { + "node": ">=8.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/frontend-defaults/node_modules/@backstage/frontend-plugin-api": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz", - "integrity": "sha512-IkzS5ltuxj5cl4OG/6FWZmkr7lcA9rZ4j1LaACA8W9//Av7lYVagvyqK2kuQfQmo2burzVTQMj25YV08h+QX7A==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/errors": "^1.2.7", - "@backstage/types": "^1.2.2", - "@backstage/version-bridge": "^1.0.11", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.25.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -3344,27 +3567,42 @@ } } }, - "node_modules/@backstage/frontend-plugin-api": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.17.1.tgz", - "integrity": "sha512-qZBRz7RJARs2C87PzskIVdDKF5YqB3DaD6qvkMUmuNAOfzidnRbRW7HEp7s2wa+wuMayZk11+i64kRYIr/ytDw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/errors": "^1.3.1", - "@backstage/filter-predicates": "^0.1.3", - "@backstage/types": "^1.2.2", - "@backstage/version-bridge": "^1.0.12", - "@standard-schema/spec": "^1.1.0", - "zod": "^4.0.0", - "zod-to-json-schema": "^3.25.1" + "node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -3372,39 +3610,29 @@ } } }, - "node_modules/@backstage/frontend-plugin-api/node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dev": true, "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@backstage/frontend-test-utils": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@backstage/frontend-test-utils/-/frontend-test-utils-0.4.5.tgz", - "integrity": "sha512-5B9zvB5IiRUr5UaP3To/JQC+AcgLGFiZzaIoy7+sMSvgKWVrlwK7EtVOLB9B4/4peJIPCOMzuXWkUJaP3jSK9A==", - "license": "Apache-2.0", - "peer": true, "dependencies": { - "@backstage/config": "^1.3.6", - "@backstage/frontend-app-api": "^0.14.1", - "@backstage/frontend-plugin-api": "^0.13.4", - "@backstage/plugin-app": "^0.3.5", - "@backstage/plugin-app-react": "^0.1.0", - "@backstage/test-utils": "^1.7.14", - "@backstage/types": "^1.2.2", - "@backstage/version-bridge": "^1.0.11", - "zod": "^3.25.76" + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" }, "peerDependencies": { - "@testing-library/react": "^16.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -3412,12 +3640,55 @@ } } }, - "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/frontend-plugin-api": { + "node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@backstage/plugin-app-react/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@backstage/plugin-app-react/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/plugin-app-react/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/plugin-app/node_modules/@backstage/frontend-plugin-api": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz", "integrity": "sha512-IkzS5ltuxj5cl4OG/6FWZmkr7lcA9rZ4j1LaACA8W9//Av7lYVagvyqK2kuQfQmo2burzVTQMj25YV08h+QX7A==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", @@ -3437,12 +3708,12 @@ } } }, - "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/plugin-app-react": { + "node_modules/@backstage/plugin-app/node_modules/@backstage/plugin-app-react": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@backstage/plugin-app-react/-/plugin-app-react-0.1.0.tgz", "integrity": "sha512-9lVx7Gon5uRmIAkdSTNH0TrRdE1qx4UB7KH4uHWt07ARDNWUyXIHe94wcnu5NSlkqqt6VriomYju5cLCG8cKdw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/core-plugin-api": "^1.12.1", "@backstage/frontend-plugin-api": "^0.13.3", @@ -3460,13 +3731,44 @@ } } }, - "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core": { + "node_modules/@backstage/plugin-app/node_modules/@backstage/theme": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@backstage/theme/-/theme-0.7.3.tgz", + "integrity": "sha512-EE9Mm6GjEMDwr/+iXmJfMq2jIJDCnjPbaua5YCtUN/E1Q/FOBcFmijJeTLn8gF0xeEiYxrZhQf0NBRlxfapR/g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@mui/material": "^5.12.2" + }, + "peerDependencies": { + "@material-ui/core": "^4.12.2", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@backstage/plugin-app/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/plugin-app/node_modules/@material-ui/core": { "version": "4.12.4", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/styles": "^4.11.5", @@ -3499,13 +3801,13 @@ } } }, - "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/@material-ui/styles": { "version": "4.11.5", "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", @@ -3542,12 +3844,12 @@ } } }, - "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/system": { + "node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/@material-ui/system": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.3", @@ -3572,12 +3874,12 @@ } } }, - "node_modules/@backstage/frontend-test-utils/node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/@material-ui/utils": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -3591,153 +3893,66 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/@backstage/frontend-test-utils/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/frontend-test-utils/node_modules/clsx": { + "node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, - "node_modules/@backstage/frontend-test-utils/node_modules/csstype": { + "node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/csstype": { "version": "2.6.21", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, - "node_modules/@backstage/frontend-test-utils/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "node_modules/@backstage/plugin-app/node_modules/@material-ui/icons": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", + "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "dev": true, "license": "MIT", - "peer": true - }, - "node_modules/@backstage/integration": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/@backstage/integration/-/integration-1.20.1.tgz", - "integrity": "sha512-rfYMauJAq0BcEPcAm3em/NJC8Gvu3WzRfbgr3onEdjEc0/hEE2ffXmTcMSZykieltV3IAMHwfF2UBm0eV+hOhQ==", - "license": "Apache-2.0", - "peer": true, "dependencies": { - "@azure/identity": "^4.0.0", - "@azure/storage-blob": "^12.5.0", - "@backstage/config": "^1.3.6", - "@backstage/errors": "^1.2.7", - "@octokit/auth-app": "^4.0.0", - "@octokit/rest": "^19.0.3", - "cross-fetch": "^4.0.0", - "git-url-parse": "^15.0.0", - "lodash": "^4.17.21", - "luxon": "^3.0.0" + "@babel/runtime": "^7.4.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@backstage/integration-aws-node": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/@backstage/integration-aws-node/-/integration-aws-node-0.1.21.tgz", - "integrity": "sha512-aqeol4gA/NP2uNcPWeBMHl/z2W7b44rUveM365SVMCtVmX7izG1f0AmU5e7RuRQ1784EZuGdy5kZlvp93kaoGA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/client-sts": "^3.350.0", - "@aws-sdk/credential-provider-node": "^3.350.0", - "@aws-sdk/credential-providers": "^3.350.0", - "@aws-sdk/types": "^3.347.0", - "@aws-sdk/util-arn-parser": "^3.310.0", - "@backstage/config": "^1.3.7", - "@backstage/errors": "^1.3.0" - } - }, - "node_modules/@backstage/integration-react": { - "version": "1.2.18", - "resolved": "https://registry.npmjs.org/@backstage/integration-react/-/integration-react-1.2.18.tgz", - "integrity": "sha512-zbEnIwGIVWwqrIWR7BlXHaT9ZfZn38Rh6Hit0aRxsHGOPbMp2IkTvG+mAW6q4Lxn8SE5kcRVtSMho/dECwIu7g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/core-plugin-api": "^1.12.6", - "@backstage/integration": "^2.0.2", - "@material-ui/core": "^4.12.2", - "@material-ui/icons": "^4.9.1" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/integration-react/node_modules/@backstage/integration": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@backstage/integration/-/integration-2.0.2.tgz", - "integrity": "sha512-rBOBngFpOfFfwtGyAQC8/5b0CEd5L/srstsAIR1GHP+teyu3I1XpxC+WldiICkQ/Ls12gEA2xLOj4aSeT3Qzug==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@azure/identity": "^4.0.0", - "@azure/storage-blob": "^12.5.0", - "@backstage/config": "^1.3.8", - "@backstage/errors": "^1.3.1", - "@octokit/auth-app": "^4.0.0", - "@octokit/rest": "^19.0.3", - "cross-fetch": "^4.0.0", - "git-url-parse": "^15.0.0", - "lodash": "^4.17.21", - "luxon": "^3.0.0", - "p-throttle": "^4.1.1" - } - }, - "node_modules/@backstage/integration-react/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/integration-react/node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "node_modules/@backstage/plugin-app/node_modules/@material-ui/lab": { + "version": "4.0.0-alpha.61", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", + "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" + "react-is": "^16.8.0 || ^17.0.0" }, "engines": { "node": ">=8.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, "peerDependencies": { + "@material-ui/core": "^4.12.1", "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" @@ -3748,306 +3963,210 @@ } } }, - "node_modules/@backstage/integration-react/node_modules/@material-ui/core/node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "node_modules/@backstage/plugin-app/node_modules/@material-ui/lab/node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" }, "engines": { "node": ">=8.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } } }, - "node_modules/@backstage/integration-react/node_modules/@material-ui/core/node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "node_modules/@backstage/plugin-app/node_modules/@material-ui/lab/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@backstage/plugin-app/node_modules/@mui/core-downloads-tracker": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", + "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@backstage/plugin-app/node_modules/@mui/material": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", + "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.18.0", + "@mui/system": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/@backstage/integration-react/node_modules/@material-ui/core/node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "node_modules/@backstage/plugin-app/node_modules/@mui/material/node_modules/react-is": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/plugin-app/node_modules/@mui/private-theming": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", + "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.17.1", + "prop-types": "^15.8.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@backstage/integration-react/node_modules/@material-ui/icons": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", - "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "node_modules/@backstage/plugin-app/node_modules/@mui/styled-engine": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", + "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@material-ui/core": "^4.0.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { - "@types/react": { + "@emotion/react": { "optional": true - } - } - }, - "node_modules/@backstage/integration-react/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@backstage/integration-react/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/integration-react/node_modules/git-url-parse": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-15.0.0.tgz", - "integrity": "sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/@backstage/integration-react/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/integration/node_modules/git-url-parse": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-15.0.0.tgz", - "integrity": "sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/@backstage/plugin-app": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@backstage/plugin-app/-/plugin-app-0.3.5.tgz", - "integrity": "sha512-CYrCS1/9u463qU/Nk9TuIc+9mnAb6hcuVQZWqlpwITkm6uh5+oe3h16+KRGrC7JUgsPUtFYtDxNhSNI5taSfXQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/core-components": "^0.18.6", - "@backstage/core-plugin-api": "^1.12.2", - "@backstage/frontend-plugin-api": "^0.13.4", - "@backstage/integration-react": "^1.2.14", - "@backstage/plugin-app-react": "^0.1.0", - "@backstage/plugin-permission-react": "^0.4.39", - "@backstage/theme": "^0.7.1", - "@backstage/types": "^1.2.2", - "@backstage/version-bridge": "^1.0.11", - "@material-ui/core": "^4.9.13", - "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.61", - "@react-hookz/web": "^24.0.0", - "react-use": "^17.2.4", - "zod": "^3.25.76" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/plugin-app-react": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@backstage/plugin-app-react/-/plugin-app-react-0.2.3.tgz", - "integrity": "sha512-2NsiqqEW6NVzQu/kATKX6DPgjEBbdlLYuRqGRB89NEPk1/XiDFPbnnCjD0ZQ0iA7pj0+9QHLXUhe6hHzKOiIIw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/core-plugin-api": "^1.12.6", - "@backstage/frontend-plugin-api": "^0.17.0", - "@material-ui/core": "^4.9.13" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "@emotion/styled": { "optional": true } } }, - "node_modules/@backstage/plugin-app-react/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "node_modules/@backstage/plugin-app/node_modules/@mui/system": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", + "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "node_modules/@backstage/plugin-app/node_modules/@mui/types": { + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -4055,29 +4174,30 @@ } } }, - "node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "node_modules/@backstage/plugin-app/node_modules/@mui/utils": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", + "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" + "@babel/runtime": "^7.23.9", + "@mui/types": "~7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -4085,61 +4205,155 @@ } } }, - "node_modules/@backstage/plugin-app-react/node_modules/@material-ui/core/node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } + "node_modules/@backstage/plugin-app/node_modules/@mui/utils/node_modules/react-is": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, + "license": "MIT" }, - "node_modules/@backstage/plugin-app-react/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@backstage/plugin-app-react/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/plugin-app-react/node_modules/react-is": { + "node_modules/@backstage/plugin-app/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/plugin-auth-node": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/@backstage/plugin-auth-node/-/plugin-auth-node-0.4.17.tgz", + "integrity": "sha512-nNZPWPRMCfU0LoxV15bfClPUfZ8XbnKDC4VTMRGyXo37FdRI9uNvrSrZm++e0QKCR/xGfab377SByp/9jITKmQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/backend-common": "^0.23.3", + "@backstage/backend-plugin-api": "^0.7.0", + "@backstage/catalog-client": "^1.6.5", + "@backstage/catalog-model": "^1.5.0", + "@backstage/config": "^1.2.0", + "@backstage/errors": "^1.2.4", + "@backstage/types": "^1.1.1", + "@types/express": "*", + "@types/passport": "^1.0.3", + "express": "^4.17.1", + "jose": "^5.0.0", + "lodash": "^4.17.21", + "node-fetch": "^2.6.7", + "passport": "^0.7.0", + "winston": "^3.2.1", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.21.4" + } + }, + "node_modules/@backstage/plugin-auth-node/node_modules/@backstage/backend-plugin-api": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@backstage/backend-plugin-api/-/backend-plugin-api-0.7.0.tgz", + "integrity": "sha512-cq93C7UkS1t/D6VP3XZ8gLD8o3cRmbeSsIUGk+AYiUm0e8aSCWSAlBBiFYrylVOAuQXzEIgE9Gb3MNNFbl+Qug==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/cli-common": "^0.1.14", + "@backstage/config": "^1.2.0", + "@backstage/errors": "^1.2.4", + "@backstage/plugin-auth-node": "^0.4.17", + "@backstage/plugin-permission-common": "^0.8.0", + "@backstage/types": "^1.1.1", + "@types/express": "^4.17.6", + "@types/luxon": "^3.0.0", + "express": "^4.17.1", + "knex": "^3.0.0", + "luxon": "^3.0.0" + } + }, + "node_modules/@backstage/plugin-auth-node/node_modules/@backstage/plugin-permission-common": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.8.4.tgz", + "integrity": "sha512-zZSfXadycRCP/YG2Cf4p/hxDU4fhrYDAVneo9PKZMfy3O4ERdtrYehGuOspcak2NkeMmaj2KfsFuWFuWK2xBTQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/config": "^1.3.2", + "@backstage/errors": "^1.2.7", + "@backstage/types": "^1.2.1", + "cross-fetch": "^4.0.0", + "uuid": "^11.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.20.4" + } + }, + "node_modules/@backstage/plugin-auth-node/node_modules/uuid": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "peer": true + "bin": { + "uuid": "dist/esm/bin/uuid" + } }, - "node_modules/@backstage/plugin-app/node_modules/@backstage/frontend-plugin-api": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz", - "integrity": "sha512-IkzS5ltuxj5cl4OG/6FWZmkr7lcA9rZ4j1LaACA8W9//Av7lYVagvyqK2kuQfQmo2burzVTQMj25YV08h+QX7A==", + "node_modules/@backstage/plugin-catalog-common": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@backstage/plugin-catalog-common/-/plugin-catalog-common-1.1.10.tgz", + "integrity": "sha512-EAKg+wEoqwcb/NhCMgIULHyTYva6bVXXWsf42SqxHOBsBxQyuHcJPiJA/oeRqhO0teT/lR6PkdokfzV+qcr8nA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/catalog-model": "^1.9.0", + "@backstage/plugin-permission-common": "^0.9.9", + "@backstage/plugin-search-common": "^1.2.24" + } + }, + "node_modules/@backstage/plugin-catalog-common/node_modules/@backstage/plugin-permission-common": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", + "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { + "@backstage/config": "^1.3.8", + "@backstage/errors": "^1.3.1", + "@backstage/types": "^1.2.2", + "cross-fetch": "^4.0.0", + "zod": "^3.25.76 || ^4.0.0", + "zod-to-json-schema": "^3.25.1" + } + }, + "node_modules/@backstage/plugin-catalog-react": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/@backstage/plugin-catalog-react/-/plugin-catalog-react-1.21.6.tgz", + "integrity": "sha512-miWlG4f+7PUiSB3FDL66ss3k92VAMIBlxbGjXziSVdqcf4bYuG+9hqOkXvetFkrInMe65gX7tNb9YL5dThTw3A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/catalog-client": "^1.12.1", + "@backstage/catalog-model": "^1.7.6", + "@backstage/core-compat-api": "^0.5.7", + "@backstage/core-components": "^0.18.6", + "@backstage/core-plugin-api": "^1.12.2", "@backstage/errors": "^1.2.7", + "@backstage/frontend-plugin-api": "^0.13.4", + "@backstage/frontend-test-utils": "^0.4.5", + "@backstage/integration-react": "^1.2.14", + "@backstage/plugin-catalog-common": "^1.1.7", + "@backstage/plugin-permission-common": "^0.9.5", + "@backstage/plugin-permission-react": "^0.4.39", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.25.1" + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "4.0.0-alpha.61", + "@react-hookz/web": "^24.0.0", + "classnames": "^2.2.6", + "lodash": "^4.17.21", + "material-ui-popup-state": "^5.3.6", + "qs": "^6.9.4", + "react-use": "^17.2.4", + "yaml": "^2.0.0", + "zen-observable": "^0.10.0" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", @@ -4153,16 +4367,18 @@ } } }, - "node_modules/@backstage/plugin-app/node_modules/@backstage/plugin-app-react": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@backstage/plugin-app-react/-/plugin-app-react-0.1.0.tgz", - "integrity": "sha512-9lVx7Gon5uRmIAkdSTNH0TrRdE1qx4UB7KH4uHWt07ARDNWUyXIHe94wcnu5NSlkqqt6VriomYju5cLCG8cKdw==", + "node_modules/@backstage/plugin-catalog-react/node_modules/@backstage/frontend-plugin-api": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz", + "integrity": "sha512-IkzS5ltuxj5cl4OG/6FWZmkr7lcA9rZ4j1LaACA8W9//Av7lYVagvyqK2kuQfQmo2burzVTQMj25YV08h+QX7A==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@backstage/core-plugin-api": "^1.12.1", - "@backstage/frontend-plugin-api": "^0.13.3", - "@material-ui/core": "^4.9.13" + "@backstage/errors": "^1.2.7", + "@backstage/types": "^1.2.2", + "@backstage/version-bridge": "^1.0.11", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", @@ -4176,44 +4392,35 @@ } } }, - "node_modules/@backstage/plugin-app/node_modules/@backstage/theme": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@backstage/theme/-/theme-0.7.3.tgz", - "integrity": "sha512-EE9Mm6GjEMDwr/+iXmJfMq2jIJDCnjPbaua5YCtUN/E1Q/FOBcFmijJeTLn8gF0xeEiYxrZhQf0NBRlxfapR/g==", + "node_modules/@backstage/plugin-catalog-react/node_modules/@backstage/plugin-permission-common": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", + "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@emotion/react": "^11.10.5", - "@emotion/styled": "^11.10.5", - "@mui/material": "^5.12.2" - }, - "peerDependencies": { - "@material-ui/core": "^4.12.2", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@backstage/config": "^1.3.8", + "@backstage/errors": "^1.3.1", + "@backstage/types": "^1.2.2", + "cross-fetch": "^4.0.0", + "zod": "^3.25.76 || ^4.0.0", + "zod-to-json-schema": "^3.25.1" } }, - "node_modules/@backstage/plugin-app/node_modules/@emotion/hash": { + "node_modules/@backstage/plugin-catalog-react/node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, - "node_modules/@backstage/plugin-app/node_modules/@material-ui/core": { + "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core": { "version": "4.12.4", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/styles": "^4.11.5", @@ -4246,13 +4453,13 @@ } } }, - "node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/styles": { "version": "4.11.5", "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", @@ -4289,12 +4496,12 @@ } } }, - "node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/@material-ui/system": { + "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/system": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.3", @@ -4319,12 +4526,12 @@ } } }, - "node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/utils": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -4338,29 +4545,12 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@backstage/plugin-app/node_modules/@material-ui/core/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/plugin-app/node_modules/@material-ui/icons": { + "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/icons": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4" }, @@ -4379,13 +4569,13 @@ } } }, - "node_modules/@backstage/plugin-app/node_modules/@material-ui/lab": { + "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/lab": { "version": "4.0.0-alpha.61", "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.3", @@ -4408,12 +4598,12 @@ } } }, - "node_modules/@backstage/plugin-app/node_modules/@material-ui/lab/node_modules/@material-ui/utils": { + "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/lab/node_modules/@material-ui/utils": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -4427,66 +4617,141 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/@backstage/plugin-app/node_modules/@material-ui/lab/node_modules/clsx": { + "node_modules/@backstage/plugin-catalog-react/node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, - "node_modules/@backstage/plugin-app/node_modules/@mui/core-downloads-tracker": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", - "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "node_modules/@backstage/plugin-catalog-react/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/plugin-catalog-react/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/plugin-permission-common": { + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.7.14.tgz", + "integrity": "sha512-fHbxhX9ZoT8bTVuGycfTeU/6TE2yjZ6YNvm/2ko1bcxGnvYe1p5Ug5JW+iWjDZS+F6F152tWzhRcg05wQlPNKQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/config": "^1.2.0", + "@backstage/errors": "^1.2.4", + "@backstage/types": "^1.1.1", + "cross-fetch": "^4.0.0", + "uuid": "^9.0.0", + "zod": "^3.22.4" } }, - "node_modules/@backstage/plugin-app/node_modules/@mui/material": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", - "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", - "license": "MIT", - "peer": true, + "node_modules/@backstage/plugin-permission-react": { + "version": "0.4.41", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-react/-/plugin-permission-react-0.4.41.tgz", + "integrity": "sha512-XGJPNBd8pY5b8dya+twIr0Zznuq/wX2guUKdfnYmQyjw2Li9Ik6Q4sWPyshFfG7tCxe/eaEz9FNFJzgiGG3dIg==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.18.0", - "@mui/system": "^5.18.0", - "@mui/types": "~7.2.15", - "@mui/utils": "^5.17.1", - "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1", - "react-is": "^19.0.0", - "react-transition-group": "^4.4.5" + "@backstage/config": "^1.3.6", + "@backstage/core-plugin-api": "^1.12.4", + "@backstage/plugin-permission-common": "^0.9.7", + "dataloader": "^2.0.0", + "swr": "^2.0.0" }, - "engines": { - "node": ">=12.0.0" + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@backstage/plugin-permission-react/node_modules/@backstage/plugin-permission-common": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", + "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/config": "^1.3.8", + "@backstage/errors": "^1.3.1", + "@backstage/types": "^1.2.2", + "cross-fetch": "^4.0.0", + "zod": "^3.25.76 || ^4.0.0", + "zod-to-json-schema": "^3.25.1" + } + }, + "node_modules/@backstage/plugin-search-common": { + "version": "1.2.24", + "resolved": "https://registry.npmjs.org/@backstage/plugin-search-common/-/plugin-search-common-1.2.24.tgz", + "integrity": "sha512-vhLiHAiUpWsvB1AIKpB7EEJB0/l3thzdC78Eq58nJdjYEt5hEpiyA6HvrzlJ6ANg83130ur0VCOlSVZhjNfTVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/plugin-permission-common": "^0.9.9", + "@backstage/types": "^1.2.2" + } + }, + "node_modules/@backstage/plugin-search-common/node_modules/@backstage/plugin-permission-common": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", + "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/config": "^1.3.8", + "@backstage/errors": "^1.3.1", + "@backstage/types": "^1.2.2", + "cross-fetch": "^4.0.0", + "zod": "^3.25.76 || ^4.0.0", + "zod-to-json-schema": "^3.25.1" + } + }, + "node_modules/@backstage/test-utils": { + "version": "1.7.18", + "resolved": "https://registry.npmjs.org/@backstage/test-utils/-/test-utils-1.7.18.tgz", + "integrity": "sha512-oBW5tfNXQM2Tqw/3wS/DdI8bW3Y96nqsMVkfVbdgV59QUkFYcONhnTaHzKjjybfJauWJ03SDVnFn3mcvgyg+jQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/config": "^1.3.8", + "@backstage/core-app-api": "^1.20.1", + "@backstage/core-plugin-api": "^1.12.6", + "@backstage/plugin-permission-common": "^0.9.9", + "@backstage/plugin-permission-react": "^0.5.1", + "@backstage/theme": "^0.7.3", + "@backstage/types": "^1.2.2", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "cross-fetch": "^4.0.0", + "i18next": "^22.4.15", + "zen-observable": "^0.10.0" }, "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@testing-library/react": "^16.0.0", + "@types/jest": "*", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { + "@types/jest": { "optional": true }, "@types/react": { @@ -4494,34 +4759,38 @@ } } }, - "node_modules/@backstage/plugin-app/node_modules/@mui/material/node_modules/react-is": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", - "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "license": "MIT", - "peer": true + "node_modules/@backstage/test-utils/node_modules/@backstage/plugin-permission-common": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", + "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@backstage/config": "^1.3.8", + "@backstage/errors": "^1.3.1", + "@backstage/types": "^1.2.2", + "cross-fetch": "^4.0.0", + "zod": "^3.25.76 || ^4.0.0", + "zod-to-json-schema": "^3.25.1" + } }, - "node_modules/@backstage/plugin-app/node_modules/@mui/private-theming": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", - "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", - "license": "MIT", - "peer": true, + "node_modules/@backstage/test-utils/node_modules/@backstage/plugin-permission-react": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-react/-/plugin-permission-react-0.5.1.tgz", + "integrity": "sha512-R7RBOol/ZW4yNGkxIPWEHghR8hkpS7LYqgE7RHxNAtp/L0NUQ1mp+HcOo9QQo1iWaqrqAEX3TA2WVqoolguoTA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.17.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "@backstage/config": "^1.3.8", + "@backstage/core-plugin-api": "^1.12.6", + "@backstage/plugin-permission-common": "^0.9.9", + "dataloader": "^2.0.0", + "swr": "^2.0.0" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -4529,89 +4798,202 @@ } } }, - "node_modules/@backstage/plugin-app/node_modules/@mui/styled-engine": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", - "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", - "license": "MIT", - "peer": true, + "node_modules/@backstage/test-utils/node_modules/@backstage/theme": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@backstage/theme/-/theme-0.7.3.tgz", + "integrity": "sha512-EE9Mm6GjEMDwr/+iXmJfMq2jIJDCnjPbaua5YCtUN/E1Q/FOBcFmijJeTLn8gF0xeEiYxrZhQf0NBRlxfapR/g==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.13.5", - "@emotion/serialize": "^1.3.3", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@mui/material": "^5.12.2" }, "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@material-ui/core": "^4.12.2", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { + "@types/react": { "optional": true } } }, - "node_modules/@backstage/plugin-app/node_modules/@mui/system": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", - "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.17.1", - "@mui/styled-engine": "^5.18.0", - "@mui/types": "~7.2.15", - "@mui/utils": "^5.17.1", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" + "node_modules/@backstage/test-utils/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/test-utils/node_modules/@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=8.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "url": "https://opencollective.com/material-ui" }, "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, "peerDependenciesMeta": { - "@emotion/react": { + "@types/react": { "optional": true - }, - "@emotion/styled": { + } + } + }, + "node_modules/@backstage/test-utils/node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { "optional": true - }, + } + } + }, + "node_modules/@backstage/test-utils/node_modules/@material-ui/core/node_modules/@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { "@types/react": { "optional": true } } }, - "node_modules/@backstage/plugin-app/node_modules/@mui/types": { - "version": "7.2.24", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", - "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "node_modules/@backstage/test-utils/node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@backstage/test-utils/node_modules/@material-ui/core/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@backstage/test-utils/node_modules/@material-ui/core/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@backstage/test-utils/node_modules/@material-ui/icons": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", + "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.4.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -4619,19 +5001,36 @@ } } }, - "node_modules/@backstage/plugin-app/node_modules/@mui/utils": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", - "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "node_modules/@backstage/test-utils/node_modules/@mui/core-downloads-tracker": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", + "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@backstage/test-utils/node_modules/@mui/material": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", + "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.18.0", + "@mui/system": "^5.18.0", "@mui/types": "~7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1", - "react-is": "^19.0.0" + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" }, "engines": { "node": ">=12.0.0" @@ -4641,881 +5040,37 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/@backstage/plugin-app/node_modules/@mui/utils/node_modules/react-is": { + "node_modules/@backstage/test-utils/node_modules/@mui/material/node_modules/react-is": { "version": "19.2.7", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, - "node_modules/@backstage/plugin-app/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "node_modules/@backstage/test-utils/node_modules/@mui/private-theming": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", + "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "dev": true, "license": "MIT", - "peer": true - }, - "node_modules/@backstage/plugin-auth-node": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/@backstage/plugin-auth-node/-/plugin-auth-node-0.4.17.tgz", - "integrity": "sha512-nNZPWPRMCfU0LoxV15bfClPUfZ8XbnKDC4VTMRGyXo37FdRI9uNvrSrZm++e0QKCR/xGfab377SByp/9jITKmQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/backend-common": "^0.23.3", - "@backstage/backend-plugin-api": "^0.7.0", - "@backstage/catalog-client": "^1.6.5", - "@backstage/catalog-model": "^1.5.0", - "@backstage/config": "^1.2.0", - "@backstage/errors": "^1.2.4", - "@backstage/types": "^1.1.1", - "@types/express": "*", - "@types/passport": "^1.0.3", - "express": "^4.17.1", - "jose": "^5.0.0", - "lodash": "^4.17.21", - "node-fetch": "^2.6.7", - "passport": "^0.7.0", - "winston": "^3.2.1", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.21.4" - } - }, - "node_modules/@backstage/plugin-auth-node/node_modules/@backstage/backend-plugin-api": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@backstage/backend-plugin-api/-/backend-plugin-api-0.7.0.tgz", - "integrity": "sha512-cq93C7UkS1t/D6VP3XZ8gLD8o3cRmbeSsIUGk+AYiUm0e8aSCWSAlBBiFYrylVOAuQXzEIgE9Gb3MNNFbl+Qug==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/cli-common": "^0.1.14", - "@backstage/config": "^1.2.0", - "@backstage/errors": "^1.2.4", - "@backstage/plugin-auth-node": "^0.4.17", - "@backstage/plugin-permission-common": "^0.8.0", - "@backstage/types": "^1.1.1", - "@types/express": "^4.17.6", - "@types/luxon": "^3.0.0", - "express": "^4.17.1", - "knex": "^3.0.0", - "luxon": "^3.0.0" - } - }, - "node_modules/@backstage/plugin-auth-node/node_modules/@backstage/plugin-permission-common": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.8.4.tgz", - "integrity": "sha512-zZSfXadycRCP/YG2Cf4p/hxDU4fhrYDAVneo9PKZMfy3O4ERdtrYehGuOspcak2NkeMmaj2KfsFuWFuWK2xBTQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.2", - "@backstage/errors": "^1.2.7", - "@backstage/types": "^1.2.1", - "cross-fetch": "^4.0.0", - "uuid": "^11.0.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.20.4" - } - }, - "node_modules/@backstage/plugin-auth-node/node_modules/uuid": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", - "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/@backstage/plugin-catalog-common": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@backstage/plugin-catalog-common/-/plugin-catalog-common-1.1.10.tgz", - "integrity": "sha512-EAKg+wEoqwcb/NhCMgIULHyTYva6bVXXWsf42SqxHOBsBxQyuHcJPiJA/oeRqhO0teT/lR6PkdokfzV+qcr8nA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/catalog-model": "^1.9.0", - "@backstage/plugin-permission-common": "^0.9.9", - "@backstage/plugin-search-common": "^1.2.24" - } - }, - "node_modules/@backstage/plugin-catalog-common/node_modules/@backstage/plugin-permission-common": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", - "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/errors": "^1.3.1", - "@backstage/types": "^1.2.2", - "cross-fetch": "^4.0.0", - "zod": "^3.25.76 || ^4.0.0", - "zod-to-json-schema": "^3.25.1" - } - }, - "node_modules/@backstage/plugin-catalog-react": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/@backstage/plugin-catalog-react/-/plugin-catalog-react-1.21.6.tgz", - "integrity": "sha512-miWlG4f+7PUiSB3FDL66ss3k92VAMIBlxbGjXziSVdqcf4bYuG+9hqOkXvetFkrInMe65gX7tNb9YL5dThTw3A==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/catalog-client": "^1.12.1", - "@backstage/catalog-model": "^1.7.6", - "@backstage/core-compat-api": "^0.5.7", - "@backstage/core-components": "^0.18.6", - "@backstage/core-plugin-api": "^1.12.2", - "@backstage/errors": "^1.2.7", - "@backstage/frontend-plugin-api": "^0.13.4", - "@backstage/frontend-test-utils": "^0.4.5", - "@backstage/integration-react": "^1.2.14", - "@backstage/plugin-catalog-common": "^1.1.7", - "@backstage/plugin-permission-common": "^0.9.5", - "@backstage/plugin-permission-react": "^0.4.39", - "@backstage/types": "^1.2.2", - "@backstage/version-bridge": "^1.0.11", - "@material-ui/core": "^4.12.2", - "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.61", - "@react-hookz/web": "^24.0.0", - "classnames": "^2.2.6", - "lodash": "^4.17.21", - "material-ui-popup-state": "^5.3.6", - "qs": "^6.9.4", - "react-use": "^17.2.4", - "yaml": "^2.0.0", - "zen-observable": "^0.10.0" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/@backstage/frontend-plugin-api": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz", - "integrity": "sha512-IkzS5ltuxj5cl4OG/6FWZmkr7lcA9rZ4j1LaACA8W9//Av7lYVagvyqK2kuQfQmo2burzVTQMj25YV08h+QX7A==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/errors": "^1.2.7", - "@backstage/types": "^1.2.2", - "@backstage/version-bridge": "^1.0.11", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.25.1" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/@backstage/plugin-permission-common": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", - "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/errors": "^1.3.1", - "@backstage/types": "^1.2.2", - "cross-fetch": "^4.0.0", - "zod": "^3.25.76 || ^4.0.0", - "zod-to-json-schema": "^3.25.1" - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/core/node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/icons": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", - "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@material-ui/core": "^4.0.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/lab": { - "version": "4.0.0-alpha.61", - "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", - "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@material-ui/core": "^4.12.1", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/@material-ui/lab/node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/plugin-catalog-react/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/plugin-permission-common": { - "version": "0.7.14", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.7.14.tgz", - "integrity": "sha512-fHbxhX9ZoT8bTVuGycfTeU/6TE2yjZ6YNvm/2ko1bcxGnvYe1p5Ug5JW+iWjDZS+F6F152tWzhRcg05wQlPNKQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.2.0", - "@backstage/errors": "^1.2.4", - "@backstage/types": "^1.1.1", - "cross-fetch": "^4.0.0", - "uuid": "^9.0.0", - "zod": "^3.22.4" - } - }, - "node_modules/@backstage/plugin-permission-react": { - "version": "0.4.41", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-react/-/plugin-permission-react-0.4.41.tgz", - "integrity": "sha512-XGJPNBd8pY5b8dya+twIr0Zznuq/wX2guUKdfnYmQyjw2Li9Ik6Q4sWPyshFfG7tCxe/eaEz9FNFJzgiGG3dIg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.6", - "@backstage/core-plugin-api": "^1.12.4", - "@backstage/plugin-permission-common": "^0.9.7", - "dataloader": "^2.0.0", - "swr": "^2.0.0" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/plugin-permission-react/node_modules/@backstage/plugin-permission-common": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", - "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/errors": "^1.3.1", - "@backstage/types": "^1.2.2", - "cross-fetch": "^4.0.0", - "zod": "^3.25.76 || ^4.0.0", - "zod-to-json-schema": "^3.25.1" - } - }, - "node_modules/@backstage/plugin-search-common": { - "version": "1.2.24", - "resolved": "https://registry.npmjs.org/@backstage/plugin-search-common/-/plugin-search-common-1.2.24.tgz", - "integrity": "sha512-vhLiHAiUpWsvB1AIKpB7EEJB0/l3thzdC78Eq58nJdjYEt5hEpiyA6HvrzlJ6ANg83130ur0VCOlSVZhjNfTVw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/plugin-permission-common": "^0.9.9", - "@backstage/types": "^1.2.2" - } - }, - "node_modules/@backstage/plugin-search-common/node_modules/@backstage/plugin-permission-common": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", - "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/errors": "^1.3.1", - "@backstage/types": "^1.2.2", - "cross-fetch": "^4.0.0", - "zod": "^3.25.76 || ^4.0.0", - "zod-to-json-schema": "^3.25.1" - } - }, - "node_modules/@backstage/test-utils": { - "version": "1.7.18", - "resolved": "https://registry.npmjs.org/@backstage/test-utils/-/test-utils-1.7.18.tgz", - "integrity": "sha512-oBW5tfNXQM2Tqw/3wS/DdI8bW3Y96nqsMVkfVbdgV59QUkFYcONhnTaHzKjjybfJauWJ03SDVnFn3mcvgyg+jQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/core-app-api": "^1.20.1", - "@backstage/core-plugin-api": "^1.12.6", - "@backstage/plugin-permission-common": "^0.9.9", - "@backstage/plugin-permission-react": "^0.5.1", - "@backstage/theme": "^0.7.3", - "@backstage/types": "^1.2.2", - "@material-ui/core": "^4.12.2", - "@material-ui/icons": "^4.9.1", - "cross-fetch": "^4.0.0", - "i18next": "^22.4.15", - "zen-observable": "^0.10.0" - }, - "peerDependencies": { - "@testing-library/react": "^16.0.0", - "@types/jest": "*", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@types/jest": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/test-utils/node_modules/@backstage/plugin-permission-common": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz", - "integrity": "sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/errors": "^1.3.1", - "@backstage/types": "^1.2.2", - "cross-fetch": "^4.0.0", - "zod": "^3.25.76 || ^4.0.0", - "zod-to-json-schema": "^3.25.1" - } - }, - "node_modules/@backstage/test-utils/node_modules/@backstage/plugin-permission-react": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@backstage/plugin-permission-react/-/plugin-permission-react-0.5.1.tgz", - "integrity": "sha512-R7RBOol/ZW4yNGkxIPWEHghR8hkpS7LYqgE7RHxNAtp/L0NUQ1mp+HcOo9QQo1iWaqrqAEX3TA2WVqoolguoTA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@backstage/config": "^1.3.8", - "@backstage/core-plugin-api": "^1.12.6", - "@backstage/plugin-permission-common": "^0.9.9", - "dataloader": "^2.0.0", - "swr": "^2.0.0" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/test-utils/node_modules/@backstage/theme": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@backstage/theme/-/theme-0.7.3.tgz", - "integrity": "sha512-EE9Mm6GjEMDwr/+iXmJfMq2jIJDCnjPbaua5YCtUN/E1Q/FOBcFmijJeTLn8gF0xeEiYxrZhQf0NBRlxfapR/g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@emotion/react": "^11.10.5", - "@emotion/styled": "^11.10.5", - "@mui/material": "^5.12.2" - }, - "peerDependencies": { - "@material-ui/core": "^4.12.2", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.30.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/test-utils/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/test-utils/node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/test-utils/node_modules/@material-ui/core/node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/test-utils/node_modules/@material-ui/core/node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/test-utils/node_modules/@material-ui/core/node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@backstage/test-utils/node_modules/@material-ui/core/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@backstage/test-utils/node_modules/@material-ui/core/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/test-utils/node_modules/@material-ui/icons": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", - "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@material-ui/core": "^4.0.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/test-utils/node_modules/@mui/core-downloads-tracker": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", - "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@backstage/test-utils/node_modules/@mui/material": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", - "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.18.0", - "@mui/system": "^5.18.0", - "@mui/types": "~7.2.15", - "@mui/utils": "^5.17.1", - "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1", - "react-is": "^19.0.0", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@backstage/test-utils/node_modules/@mui/material/node_modules/react-is": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", - "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "license": "MIT", - "peer": true - }, - "node_modules/@backstage/test-utils/node_modules/@mui/private-theming": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", - "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", - "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/utils": "^5.17.1", @@ -5542,8 +5097,8 @@ "version": "5.18.0", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.13.5", @@ -5576,8 +5131,8 @@ "version": "5.18.0", "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.17.1", @@ -5617,8 +5172,8 @@ "version": "7.2.24", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -5632,8 +5187,8 @@ "version": "5.17.1", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/types": "~7.2.15", @@ -5663,29 +5218,29 @@ "version": "19.2.7", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@backstage/test-utils/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@backstage/types": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@backstage/types/-/types-1.2.2.tgz", "integrity": "sha512-gCctHIL3VSCKiffbWDq4Zl2n7g8NPO/dD2ksdOEm9KzWfb5AubsfQzakoKjZ8XvmdaY9jY7j1yRmHSjAqq7rBA==", - "license": "Apache-2.0", - "peer": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@backstage/ui": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/@backstage/ui/-/ui-0.15.0.tgz", "integrity": "sha512-x0d1sqv521iDKHPiomHJ8jyVNCdeY/Df45YRctV9jfnm5hN7p/TaYW9MENdU4sx22re0epMxcO/hGChQYkcQmg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@backstage/version-bridge": "^1.0.12", "@braintree/sanitize-url": "^7.1.2", @@ -5715,8 +5270,8 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/@backstage/version-bridge/-/version-bridge-1.0.12.tgz", "integrity": "sha512-n+JfiPw7KCpGSNG+v47+W2gTwBdRTTkcikLGvm29A7SG91NYDee7fhBhYTXQ1vOHJpj1yBl+2vlrNVTap33Q9g==", + "dev": true, "license": "Apache-2.0", - "peer": true, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", @@ -5733,8 +5288,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", - "license": "Apache-2.0", - "peer": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", @@ -5747,8 +5302,8 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@bramus/specificity": { "version": "2.4.2", @@ -5767,15 +5322,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.1.90" } @@ -5784,8 +5339,8 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -5797,8 +5352,8 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -5948,8 +5503,8 @@ "version": "2.0.8", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -5960,8 +5515,8 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-1.1.8.tgz", "integrity": "sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@dagrejs/graphlib": "2.2.4" } @@ -5970,8 +5525,8 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/@dagrejs/graphlib/-/graphlib-2.2.4.tgz", "integrity": "sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">17.0.0" } @@ -5980,15 +5535,15 @@ "version": "1.3.13", "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz", "integrity": "sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@date-io/date-fns": { "version": "1.3.13", "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-1.3.13.tgz", "integrity": "sha512-yXxGzcRUPcogiMj58wVgFjc9qUYrCnnU9eLcyNbsQCmae4jPuZCDoIBR21j8ZURsM7GRtU62VOw5yNd4dDHunA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@date-io/core": "^1.3.13" }, @@ -5996,12 +5551,28 @@ "date-fns": "^2.0.0" } }, + "node_modules/@dawmatt/api-grade-core": { + "resolved": "packages/api-grade-core", + "link": true + }, + "node_modules/@dawmatt/api-grade-mcp": { + "resolved": "packages/api-grade-mcp", + "link": true + }, + "node_modules/@dawmatt/backstage-plugin-api-grade": { + "resolved": "packages/backstage-plugin-api-grade", + "link": true + }, + "node_modules/@dawmatt/backstage-plugin-api-grade-backend": { + "resolved": "packages/backstage-plugin-api-grade-backend", + "link": true + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", @@ -6020,8 +5591,8 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6030,8 +5601,8 @@ "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", @@ -6044,15 +5615,15 @@ "version": "0.9.2", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@emotion/memoize": "^0.9.0" } @@ -6061,15 +5632,15 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/react": { "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -6093,8 +5664,8 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", @@ -6107,15 +5678,15 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/styled": { "version": "11.14.1", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -6138,15 +5709,15 @@ "version": "0.10.0", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "react": ">=16.8.0" } @@ -6155,15 +5726,15 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/weak-memoize": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", @@ -6556,6 +6127,173 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, "node_modules/@exodus/bytes": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", @@ -6578,8 +6316,8 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "arrify": "^2.0.0", "extend": "^3.0.2" @@ -6592,8 +6330,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=14.0.0" } @@ -6602,8 +6340,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", + "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=14" } @@ -6612,8 +6350,8 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.21.0.tgz", "integrity": "sha512-l+IFTkd+6Y5LoAuXyYCKNAKtw/Ci+rAMqgdTB1jv4iZiLhw0rtq+0qjIRbBizXkNzEFmXiXUW0H7sZQQvk1ffA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@google-cloud/paginator": "^5.0.0", "@google-cloud/projectify": "^4.0.0", @@ -6638,8 +6376,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6654,8 +6392,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -6667,8 +6405,8 @@ "version": "1.14.4", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz", "integrity": "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" @@ -6681,8 +6419,8 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", @@ -6700,8 +6438,8 @@ "version": "0.7.15", "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", @@ -6715,12 +6453,90 @@ "node": ">=6" } }, + "node_modules/@hono/node-server": { + "version": "1.19.14", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", + "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@internationalized/date": { "version": "3.12.2", "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.2.tgz", "integrity": "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@swc/helpers": "^0.5.0" } @@ -6729,8 +6545,8 @@ "version": "3.6.7", "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.7.tgz", "integrity": "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@swc/helpers": "^0.5.0" } @@ -6739,8 +6555,8 @@ "version": "3.2.9", "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.9.tgz", "integrity": "sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@swc/helpers": "^0.5.0" } @@ -6749,8 +6565,8 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.10.0.tgz", "integrity": "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@istanbuljs/schema": { "version": "0.1.6", @@ -6779,16 +6595,29 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -6798,12 +6627,14 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -6814,8 +6645,8 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -6861,8 +6692,8 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@keyv/memcache/-/memcache-1.4.1.tgz", "integrity": "sha512-BoXgJG3xZO6J3JPuJGzbP+gyc1QcqzEK7o0SP7TFdMu+AXJ8LAXflCqJug3BmDNTCnBb3mqUgMr01EOhJ+CqWw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "json-buffer": "^3.0.1", "memjs": "^1.3.2" @@ -6872,8 +6703,8 @@ "version": "2.8.5", "resolved": "https://registry.npmjs.org/@keyv/redis/-/redis-2.8.5.tgz", "integrity": "sha512-e9W1faN32A1Wy5726qtorAvPu1Xffh75ngfQQtETQ0hIN/FQtK0RcBTz/OH/vwDvLX8zrzdu0sWq/KoSHDYfVw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ioredis": "^5.4.1" }, @@ -6885,8 +6716,8 @@ "version": "0.20.0", "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.20.0.tgz", "integrity": "sha512-xxlv5GLX4FVR/dDKEsmi4SPeuB49aRc35stndyxcC73XnUEEwF39vXbROpHOirmDse8WE9vxOjABnSVS+jb7EA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/js-yaml": "^4.0.1", "@types/node": "^20.1.1", @@ -6911,8 +6742,8 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12.0.0" } @@ -6921,8 +6752,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", @@ -6934,113 +6765,478 @@ "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@manypkg/find-root/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@manypkg/find-root/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/get-packages/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@manypkg/get-packages/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", + "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/jose": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", + "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@manypkg/find-root/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@manypkg/find-root/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.6" } }, - "node_modules/@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "node_modules/@modelcontextprotocol/sdk/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", - "peer": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@manypkg/get-packages/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@manypkg/get-packages/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", "license": "MIT", - "peer": true, + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, "engines": { - "node": ">= 4.0.0" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", "license": "MIT", - "peer": true, - "peerDependencies": { - "@types/react": "*" + "engines": { + "node": ">=18" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@mui/core-downloads-tracker": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.1.1.tgz", "integrity": "sha512-AupmMICbdJHqAh6FfOMaaiiIr7dfEgZJn5DFfiPuGNrbs+ZZy9cD1APwO0TSVBz5j08MJEEY6n7iC76/2wjMEA==", + "dev": true, "license": "MIT", "peer": true, "funding": { @@ -7052,6 +7248,7 @@ "version": "9.1.1", "resolved": "https://registry.npmjs.org/@mui/material/-/material-9.1.1.tgz", "integrity": "sha512-Wv+gInjrpf99l1Q0oHe0eOWGTnlbkzs5nowClX65KCT/2fyPMwcbFEEkUsOHdpcHhB5UAbz/d7jlwt5ajWVvlA==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -7102,6 +7299,7 @@ "version": "19.2.7", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, "license": "MIT", "peer": true }, @@ -7109,6 +7307,7 @@ "version": "9.1.1", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-9.1.1.tgz", "integrity": "sha512-oH6c+d6sJ1CZT0Vg2/fHdUQ5zvo9Pn+f+WWk0tlQliHqqIRdN32DZ7UxjalW3LUj4OkHbdWR31biWuLxK9i7Cg==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -7137,6 +7336,7 @@ "version": "9.1.1", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-9.1.1.tgz", "integrity": "sha512-neaYKdJfvEG54q8efHLJR7swpHG/gfSv9xGqW5iTSMsubD7yPCPFrhVBt284j1DOF3uZaaDJSHQL7gz6jGF21Q==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -7172,6 +7372,7 @@ "version": "9.1.1", "resolved": "https://registry.npmjs.org/@mui/system/-/system-9.1.1.tgz", "integrity": "sha512-q+aqNa58QZUwmmyUvJKKrStrej+4BcWFw4M0Ug+zRylPIQgR64cqvBnE3QTfLZm4OXulydp8Hl3zwKxMayrdsA==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -7213,6 +7414,7 @@ "version": "9.1.1", "resolved": "https://registry.npmjs.org/@mui/types/-/types-9.1.1.tgz", "integrity": "sha512-Zjt7u8wNvDg40rPTGoL+TnfkpuSKjwubsNSFRH1KAVZLcaV4I3AFNHIFbvH7p4F3alEibSbdd90xAgn5Rnfndg==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -7231,6 +7433,7 @@ "version": "9.1.1", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.1.1.tgz", "integrity": "sha512-qSNfnkzZMptaaWFFklpDf4NPJztgwsMDVfM/sSDt+wq4ssYSBhLYwwjuB6eS/+p2IUYbeRzHluzXbw0Zn7aI4A==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -7262,6 +7465,7 @@ "version": "19.2.7", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, "license": "MIT", "peer": true }, @@ -7269,21 +7473,21 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", + "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/nodable" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -7296,8 +7500,8 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 8" } @@ -7306,8 +7510,8 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -7320,8 +7524,8 @@ "version": "4.0.13", "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-4.0.13.tgz", "integrity": "sha512-NBQkmR/Zsc+8fWcVIFrwDgNXS7f4XDrkd9LHdi9DPQw1NdGHLviLzRO2ZBwTtepnwHXW5VTrVU9eFGijMUqllg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/auth-oauth-app": "^5.0.0", "@octokit/auth-oauth-user": "^2.0.0", @@ -7341,8 +7545,8 @@ "version": "5.0.6", "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-5.0.6.tgz", "integrity": "sha512-SxyfIBfeFcWd9Z/m1xa4LENTQ3l1y6Nrg31k2Dcb1jS5ov7pmwMJZ6OGX8q3K9slRgVpeAjNA1ipOAMHkieqyw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/auth-oauth-device": "^4.0.0", "@octokit/auth-oauth-user": "^2.0.0", @@ -7360,8 +7564,8 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.5.tgz", "integrity": "sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/oauth-methods": "^2.0.0", "@octokit/request": "^6.0.0", @@ -7376,8 +7580,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.2.tgz", "integrity": "sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/auth-oauth-device": "^4.0.0", "@octokit/oauth-methods": "^2.0.0", @@ -7394,8 +7598,8 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 14" } @@ -7404,8 +7608,8 @@ "version": "4.2.4", "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", @@ -7423,8 +7627,8 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", @@ -7438,8 +7642,8 @@ "version": "5.0.6", "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/request": "^6.0.0", "@octokit/types": "^9.0.0", @@ -7453,8 +7657,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-5.0.0.tgz", "integrity": "sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 14" } @@ -7463,8 +7667,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-2.0.6.tgz", "integrity": "sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/oauth-authorization-url": "^5.0.0", "@octokit/request": "^6.2.3", @@ -7480,15 +7684,15 @@ "version": "18.1.1", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/tsconfig": "^1.0.2", "@octokit/types": "^9.2.3" @@ -7504,8 +7708,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "@octokit/core": ">=3" } @@ -7514,8 +7718,8 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/types": "^10.0.0" }, @@ -7530,8 +7734,8 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/openapi-types": "^18.0.0" } @@ -7540,8 +7744,8 @@ "version": "6.2.8", "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/endpoint": "^7.0.0", "@octokit/request-error": "^3.0.0", @@ -7558,8 +7762,8 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/types": "^9.0.0", "deprecation": "^2.0.0", @@ -7573,8 +7777,8 @@ "version": "19.0.13", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/core": "^4.2.1", "@octokit/plugin-paginate-rest": "^6.1.2", @@ -7589,15 +7793,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@octokit/types": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/openapi-types": "^18.0.0" } @@ -7606,8 +7810,8 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -7617,36 +7821,36 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause", - "peer": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause", - "peer": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "license": "BSD-3-Clause", - "peer": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", - "license": "BSD-3-Clause", - "peer": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@protobufjs/aspromise": "^1.1.1" } @@ -7655,44 +7859,44 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause", - "peer": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause", - "peer": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause", - "peer": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", - "license": "BSD-3-Clause", - "peer": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@react-hookz/deep-equal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@react-hookz/deep-equal/-/deep-equal-1.0.4.tgz", "integrity": "sha512-N56fTrAPUDz/R423pag+n6TXWbvlBZDtTehaGFjK0InmN+V2OFWLE/WmORhmn6Ce7dlwH5+tQN1LJFw3ngTJVg==", "deprecated": "PACKAGE IS DEPRECATED AND WILL BE DETED SOON, USE @ver0/deep-equal INSTEAD", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@react-hookz/web": { "version": "24.0.4", "resolved": "https://registry.npmjs.org/@react-hookz/web/-/web-24.0.4.tgz", "integrity": "sha512-DcIM6JiZklDyHF6CRD1FTXzuggAkQ+3Ncq2Wln7Kdih8GV6ZIeN9JfS6ZaQxpQUxan8/4n0J2V/R7nMeiSrb2Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@react-hookz/deep-equal": "^1.0.4" }, @@ -7714,8 +7918,8 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.35.0.tgz", "integrity": "sha512-iNWvuzEwANttpQpdlu8nPBtdHb0mcCMj1ZTH//iRB5E/14IAnyRlR25rxH7pNLyzHINsPGEKnWvpwDMCT6vziQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } @@ -7724,6 +7928,7 @@ "version": "1.23.3", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", + "dev": true, "license": "MIT", "peer": true, "engines": { @@ -7734,12 +7939,19 @@ "version": "4.8.0", "resolved": "https://registry.npmjs.org/@remixicon/react/-/react-4.8.0.tgz", "integrity": "sha512-cbzR04GKWa3zWdgn0C2i+u/avb167iWeu9gqFO00UGu84meARPAm3oKowDZTU6dlk/WS3UHo6k//LMRM1l7CRw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "peerDependencies": { "react": ">=18.2.0" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/plugin-commonjs": { "version": "22.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz", @@ -8145,8 +8357,8 @@ "version": "3.24.7", "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.7.tgz", "integrity": "sha512-KoUi4M1f3BG6kzN1FnCwL7oyFptTbyBJKjR6yhSib+JHRdUmM1o+VwsFtJ66NZCkCzVfJMWRHJNo0R0jznp0Pg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.4", @@ -8160,8 +8372,8 @@ "version": "4.3.9", "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.9.tgz", "integrity": "sha512-ZlfJ/4Fa3jYb+3eaohPfG9utX9HmdhFNcFtpoGAhUhdynAOmGXtmigbi7eEiONKM+ykHw8RwKuDEb85Lx7t7fA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@smithy/core": "^3.24.7", "@smithy/types": "^4.14.4", @@ -8175,8 +8387,8 @@ "version": "5.4.7", "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.7.tgz", "integrity": "sha512-NslaM2ir0N2hisDmzXLstPaVINZheh8SokyOC++kzFPloZucL2R7Y7bS57mSzx/1Fc/fqmn7twjkeezTTrV0EA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@smithy/core": "^3.24.7", "@smithy/types": "^4.14.4", @@ -8190,8 +8402,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -8203,8 +8415,8 @@ "version": "4.7.8", "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.8.tgz", "integrity": "sha512-f+DbsWUwSbtMu1a/j8Y93KiU1SRg9nyzfjereqn1BJ33QOTUXxdlYvVXMhAYl1vuR1Kmna5aIJe09KSIfyFNYw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@smithy/core": "^3.24.7", "@smithy/types": "^4.14.4", @@ -8218,8 +8430,8 @@ "version": "5.4.7", "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.7.tgz", "integrity": "sha512-LwQZazFayImv+IOm0S0enoLeUJwmAlhGC5O6YCcLWezyu08dF46GOxPOq35OpBIHkgd7OvNvBStIFwVNyrvoBw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@smithy/core": "^3.24.7", "@smithy/types": "^4.14.4", @@ -8233,8 +8445,8 @@ "version": "4.14.4", "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.4.tgz", "integrity": "sha512-B2S9+UGm1+/pHkcx3ZoLVX1a+pmSk8rqxRR+ZsNqZaJ5q9FWX9AFGQVM4qG5+OBeQUZVy99HY8HqW8gK/wgXzQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -8246,8 +8458,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" @@ -8260,8 +8472,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" @@ -8274,8 +8486,8 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -8285,8 +8497,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@stoplight/better-ajv-errors": { "version": "1.0.3", @@ -8660,8 +8872,8 @@ "version": "0.5.23", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.8.0" } @@ -8670,8 +8882,8 @@ "version": "8.21.3", "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@tanstack/table-core": "8.21.3" }, @@ -8691,8 +8903,8 @@ "version": "8.21.3", "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8705,6 +8917,7 @@ "version": "10.4.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", @@ -8724,6 +8937,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8733,6 +8947,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", @@ -8747,12 +8962,14 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, "license": "MIT" }, "node_modules/@testing-library/react": { "version": "16.3.2", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" @@ -8780,8 +8997,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -8790,40 +9007,87 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, "license": "MIT" }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, "license": "MIT", "dependencies": { "@types/connect": "*", @@ -8834,20 +9098,21 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.2.tgz", "integrity": "sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/caseless": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -8857,8 +9122,8 @@ "version": "2.8.19", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*" } @@ -8867,8 +9132,8 @@ "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/ms": "*" } @@ -8877,8 +9142,8 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz", "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "@types/ssh2": "*" @@ -8888,8 +9153,8 @@ "version": "3.3.47", "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.47.tgz", "integrity": "sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/docker-modem": "*", "@types/node": "*", @@ -8905,6 +9170,13 @@ "@types/node": "*" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -8915,6 +9187,7 @@ "version": "4.17.25", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -8927,6 +9200,7 @@ "version": "4.19.8", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -8939,8 +9213,8 @@ "version": "2.3.10", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/unist": "^2" } @@ -8949,8 +9223,8 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hoist-non-react-statics": "^3.3.0" }, @@ -8962,21 +9236,22 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, "license": "MIT" }, "node_modules/@types/js-cookie": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/js-yaml": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -8988,8 +9263,8 @@ "version": "9.0.10", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/ms": "*", "@types/node": "*" @@ -8999,15 +9274,15 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mdast": { "version": "3.0.15", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/unist": "^2" } @@ -9016,14 +9291,15 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, "license": "MIT" }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "20.19.43", @@ -9038,8 +9314,8 @@ "version": "1.3.14", "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*" } @@ -9048,22 +9324,22 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/parse5": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/passport": { "version": "1.0.17", "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/express": "*" } @@ -9072,24 +9348,28 @@ "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, "license": "MIT" }, "node_modules/@types/qs": { "version": "6.15.1", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.31", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -9100,8 +9380,8 @@ "version": "7.1.34", "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -9113,8 +9393,8 @@ "version": "1.7.5", "resolved": "https://registry.npmjs.org/@types/react-sparklines/-/react-sparklines-1.7.5.tgz", "integrity": "sha512-rIAmNyRKUqWWnaQMjNrxMNkgEFi5f9PrdczSNxj5DscAa48y4i9P0fRKZ72FmNcFsdg6Jx4o6CXWZtIaC0OJOg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" } @@ -9123,8 +9403,8 @@ "version": "4.4.12", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*" } @@ -9133,8 +9413,8 @@ "version": "2.48.13", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz", "integrity": "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/caseless": "*", "@types/node": "*", @@ -9146,14 +9426,14 @@ "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "license": "MIT", - "optional": true, - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -9163,6 +9443,7 @@ "version": "1.15.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -9174,99 +9455,369 @@ "version": "0.17.6", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/ssh2": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", + "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18" + } + }, + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ssh2/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/styled-jsx": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@types/styled-jsx/-/styled-jsx-2.2.9.tgz", + "integrity": "sha512-W/iTlIkGEyTBGTEvZCey8EgQlQ5l0DwMqi3iOXlLs2kyBwYTXHKEiU6IZ5EwoRwngL8/dGYuzezSup89ttVHLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/urijs": { + "version": "1.19.26", + "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.26.tgz", + "integrity": "sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg==", + "license": "MIT" + }, + "node_modules/@types/webpack-env": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz", + "integrity": "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz", + "integrity": "sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/type-utils": "8.61.1", + "@typescript-eslint/utils": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.61.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz", + "integrity": "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz", + "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.61.1", + "@typescript-eslint/types": "^8.61.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz", + "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==", + "dev": true, "license": "MIT", "dependencies": { - "@types/mime": "^1", - "@types/node": "*" + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/ssh2": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", - "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz", + "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "^18.11.18" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/ssh2/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz", + "integrity": "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "undici-types": "~5.26.4" + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/utils": "8.61.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/ssh2/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "node_modules/@typescript-eslint/types": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz", + "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==", + "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "node_modules/@types/styled-jsx": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/@types/styled-jsx/-/styled-jsx-2.2.9.tgz", - "integrity": "sha512-W/iTlIkGEyTBGTEvZCey8EgQlQ5l0DwMqi3iOXlLs2kyBwYTXHKEiU6IZ5EwoRwngL8/dGYuzezSup89ttVHLw==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz", + "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/react": "*" + "@typescript-eslint/project-service": "8.61.1", + "@typescript-eslint/tsconfig-utils": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": "18 || 20 || >=22" + } }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } }, - "node_modules/@types/urijs": { - "version": "1.19.26", - "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.26.tgz", - "integrity": "sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg==", - "license": "MIT" + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/@types/webpack-env": { - "version": "1.18.8", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz", - "integrity": "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==", + "node_modules/@typescript-eslint/utils": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz", + "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz", + "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/node": "*" + "@typescript-eslint/types": "8.61.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typespec/ts-http-runtime": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.6.tgz", "integrity": "sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", @@ -9276,6 +9827,27 @@ "node": ">=20.0.0" } }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, "node_modules/@vitest/coverage-v8": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.1.tgz", @@ -9419,8 +9991,8 @@ "version": "1.9.5", "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/abort-controller": { "version": "3.0.0", @@ -9460,6 +10032,7 @@ "version": "8.17.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -9468,10 +10041,21 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.3.5", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -9484,8 +10068,8 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 14" } @@ -9550,8 +10134,8 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -9563,6 +10147,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -9575,8 +10160,8 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -9589,25 +10174,21 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.0.tgz", "integrity": "sha512-xjR9/zBVnUOP6ztMIIgShjsxui80nQUQH+5xJnvrYLs+90bF25/KJqaAi8mk+B4RDtX1Nspi6fmp4YTEts8SfA==", + "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "MIT", - "peer": true - }, - "node_modules/api-grade-core": { - "resolved": "packages/api-grade-core", - "link": true + "license": "MIT" }, "node_modules/archiver": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.2.tgz", "integrity": "sha512-UQ/2nW7NMl1G+1UnrLypQw1VdT9XZg/ECcKPq7l+STzStrSivFIXIp34D8M5zeNGW5NoOupdYCHv6VySCPNNlw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", @@ -9625,8 +10206,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", @@ -9643,8 +10224,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -9654,8 +10235,8 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9674,8 +10255,8 @@ "version": "5.1.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9687,22 +10268,22 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "dev": true, + "license": "Python-2.0" }, "node_modules/aria-hidden": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.0.0" }, @@ -9714,6 +10295,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" @@ -9745,8 +10327,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9776,8 +10358,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9786,8 +10368,8 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -9796,8 +10378,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -9837,8 +10419,8 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/async-function": { "version": "1.0.0", @@ -9853,15 +10435,15 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/async-retry": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "retry": "0.13.1" } @@ -9870,8 +10452,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", @@ -9892,8 +10474,8 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "*" } @@ -9902,8 +10484,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 6.0.0" } @@ -9912,15 +10494,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -9931,20 +10513,12 @@ "npm": ">=6" } }, - "node_modules/backstage-plugin-api-grade": { - "resolved": "packages/backstage-plugin-api-grade", - "link": true - }, - "node_modules/backstage-plugin-api-grade-backend": { - "resolved": "packages/backstage-plugin-api-grade-backend", - "link": true - }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9960,8 +10534,8 @@ "version": "2.9.1", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "peerDependencies": { "bare-abort-controller": "*" }, @@ -9975,8 +10549,8 @@ "version": "4.7.2", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.2.tgz", "integrity": "sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", @@ -10000,8 +10574,8 @@ "version": "3.9.1", "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz", "integrity": "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "bare": ">=1.14.0" } @@ -10010,8 +10584,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz", "integrity": "sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "bare-os": "^3.0.1" } @@ -10020,8 +10594,8 @@ "version": "2.13.3", "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz", "integrity": "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "b4a": "^1.8.1", "streamx": "^2.25.0", @@ -10048,8 +10622,8 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "peerDependencies": { "react-native-b4a": "*" }, @@ -10063,8 +10637,8 @@ "version": "2.4.5", "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz", "integrity": "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "bare-path": "^3.0.0" } @@ -10073,6 +10647,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -10087,22 +10662,34 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/base64-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.38", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", + "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -10114,15 +10701,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tweetnacl": "^0.14.3" } @@ -10131,8 +10718,8 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "license": "Apache-2.0", - "peer": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/bidi-js": { "version": "1.0.3", @@ -10148,8 +10735,8 @@ "version": "9.3.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -10158,8 +10745,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -10171,8 +10758,8 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -10183,6 +10770,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -10198,7 +10786,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -10248,15 +10835,15 @@ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/bowser": { "version": "2.14.1", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.15", @@ -10272,8 +10859,8 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -10281,17 +10868,52 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/btoa-lite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", "integrity": "sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, "funding": [ { "type": "github", @@ -10307,7 +10929,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -10317,8 +10938,8 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -10327,22 +10948,21 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/buildcheck": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.7.tgz", "integrity": "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==", + "dev": true, "optional": true, - "peer": true, "engines": { "node": ">=10.0.0" } @@ -10357,8 +10977,8 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "run-applescript": "^7.0.0" }, @@ -10373,8 +10993,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10449,25 +11069,46 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "license": "Apache-2.0", - "peer": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -10508,8 +11149,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -10519,8 +11160,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -10530,8 +11171,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -10554,8 +11195,8 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -10579,8 +11220,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -10589,29 +11230,29 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/clean-git-ref": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", - "license": "Apache-2.0", - "peer": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -10625,8 +11266,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -10635,8 +11276,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10645,8 +11286,8 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -10659,8 +11300,8 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -10672,8 +11313,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -10682,8 +11323,8 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -10695,15 +11336,15 @@ "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -10715,8 +11356,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -10741,8 +11382,8 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.3.tgz", "integrity": "sha512-/UIcLWvwAQyVibgpQDPtfNM3SvqN7G9elAPAV7GM0L53EbNWwWiCsWtK8Fwed/APEbptPHXs5PuW+y8Bq8lFTA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", @@ -10757,8 +11398,8 @@ "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -10770,8 +11411,8 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", @@ -10789,8 +11430,8 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -10799,14 +11440,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/compute-gcd": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", - "peer": true, + "dev": true, "dependencies": { "validate.io-array": "^1.0.3", "validate.io-function": "^1.0.2", @@ -10817,7 +11458,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", - "peer": true, + "dev": true, "dependencies": { "compute-gcd": "^1.2.1", "validate.io-array": "^1.0.3", @@ -10835,11 +11476,11 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, "engines": [ "node >= 6.0" ], "license": "MIT", - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -10879,8 +11520,8 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", @@ -10901,8 +11542,8 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "toggle-selection": "^1.0.6" } @@ -10911,15 +11552,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/cors": { "version": "2.8.6", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "license": "MIT", - "peer": true, "dependencies": { "object-assign": "^4", "vary": "^1" @@ -10936,8 +11576,8 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -10953,8 +11593,8 @@ "version": "1.10.3", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">= 6" } @@ -10963,9 +11603,9 @@ "version": "0.0.10", "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", + "dev": true, "hasInstallScript": true, "optional": true, - "peer": true, "dependencies": { "buildcheck": "~0.0.6", "nan": "^2.19.0" @@ -10978,8 +11618,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -10991,8 +11631,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.1.tgz", "integrity": "sha512-lO1dFui+CEUh/ztYIpgpKItKW9Bb4NWakCRJrnqAbFIYD+OZAwb2VfD5T5eXMw2FNcsDHkQcNl/Wh3iVXYwU6g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -11005,15 +11645,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/cross-fetch": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-fetch": "^2.7.0" } @@ -11036,8 +11676,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tiny-invariant": "^1.0.6" } @@ -11046,8 +11686,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "hyphenate-style-name": "^1.0.3" } @@ -11070,8 +11710,8 @@ "version": "2.0.8", "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.8.3", "is-in-browser": "^1.0.2" @@ -11081,14 +11721,15 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, "license": "MIT" }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -11097,8 +11738,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -11107,8 +11748,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -11121,8 +11762,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=12" } @@ -11131,8 +11772,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "d3-color": "1 - 3" }, @@ -11144,8 +11785,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -11154,8 +11795,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -11164,8 +11805,8 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "d3-path": "^3.1.0" }, @@ -11177,8 +11818,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -11187,8 +11828,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -11207,8 +11848,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -11220,12 +11861,23 @@ "node": ">=12" } }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -11340,15 +11992,15 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.21.0" }, @@ -11364,8 +12016,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", @@ -11395,8 +12047,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "character-entities": "^2.0.0" }, @@ -11409,8 +12061,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -11420,8 +12072,8 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -11445,12 +12097,19 @@ "node": ">=6" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/default-browser": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" @@ -11466,8 +12125,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -11496,8 +12155,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -11526,8 +12185,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -11536,8 +12195,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=0.10" } @@ -11564,13 +12223,14 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "license": "ISC", - "peer": true + "dev": true, + "license": "ISC" }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -11590,15 +12250,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/diff": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -11617,15 +12277,15 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-type": "^4.0.0" }, @@ -11637,8 +12297,8 @@ "version": "5.0.7", "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.7.tgz", "integrity": "sha512-XJgGhoR/CLpqshm4d3L7rzH6t8NgDFUIIpztYlLHIApeJjMZKYJMz2zxPsYxnejq5h3ELYSw/RBsi3t5h7gNTA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "debug": "^4.1.1", "readable-stream": "^3.5.0", @@ -11653,8 +12313,8 @@ "version": "4.0.12", "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.12.tgz", "integrity": "sha512-/bCZd6KlGcjZO8Buqmi/vXuqEGVEZ0PNjx/biBNqJD3MhK9DmdiAuKxqfNhflgDESDIiBz3qF+0e55+CpnrUcw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@balena/dockerignore": "^1.0.2", "@grpc/grpc-js": "^1.11.1", @@ -11673,12 +12333,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", - "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -11687,14 +12347,15 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, "license": "MIT" }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -11718,8 +12379,8 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", @@ -11731,8 +12392,8 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -11743,7 +12404,6 @@ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "safe-buffer": "^5.0.1" } @@ -11754,19 +12414,26 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/electron-to-chromium": { + "version": "1.5.376", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.376.tgz", + "integrity": "sha512-cUVA7/RvbFTEuw/i3obUwDTRIXojaxkResf+ibByPFxjc6XK3VNtcQXV0NSbAlJ0FMjcJGgftVVB4Qo184EXvA==", + "dev": true, + "license": "ISC" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", @@ -11781,8 +12448,8 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "once": "^1.4.0" } @@ -11804,8 +12471,8 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -11814,8 +12481,8 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -11976,8 +12643,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/esbuild": { "version": "0.21.5", @@ -12022,8 +12689,8 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -12038,8 +12705,267 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz", + "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -12051,18 +12977,36 @@ "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=6" + "node": ">=6" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "license": "BSD-2-Clause", - "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -12071,12 +13015,58 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -12099,8 +13089,8 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.x" } @@ -12109,12 +13099,33 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "bare-events": "^2.7.0" } }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -12198,7 +13209,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/express-promise-router/-/express-promise-router-4.1.1.tgz", "integrity": "sha512-Lkvcy/ZGrBhzkl3y7uYBHLMtLI4D6XQ2kiFg9dq7fbktBch5gjqJ0+KovX0cvCAvTJw92raWunRLM/OM+5l4fA==", - "peer": true, + "dev": true, "dependencies": { "is-promise": "^4.0.0", "lodash.flattendeep": "^4.0.0", @@ -12217,6 +13228,24 @@ } } }, + "node_modules/express-rate-limit": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", + "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -12242,18 +13271,18 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, "engines": [ "node >=0.6.0" ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -12265,15 +13294,15 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -12289,8 +13318,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" }, "node_modules/fast-memoize": { "version": "2.5.2", @@ -12302,7 +13338,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==", - "peer": true + "dev": true }, "node_modules/fast-uri": { "version": "3.1.2", @@ -12324,6 +13360,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "dev": true, "funding": [ { "type": "github", @@ -12331,7 +13368,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "path-expression-matcher": "^1.5.0", "xml-naming": "^0.1.0" @@ -12341,6 +13377,7 @@ "version": "5.7.3", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", + "dev": true, "funding": [ { "type": "github", @@ -12348,7 +13385,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", @@ -12363,15 +13399,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "reusify": "^1.0.4" } @@ -12380,8 +13416,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "format": "^0.2.0" }, @@ -12394,15 +13430,28 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -12447,15 +13496,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -12464,12 +13513,33 @@ "node": ">=8" } }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/for-each": { "version": "0.3.5", @@ -12490,8 +13560,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "*" } @@ -12500,8 +13570,8 @@ "version": "2.5.6", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.6.tgz", "integrity": "sha512-Ogz/E85h9tlfJzpI6TuFpGcHZFhLrb9Gw8wq9v40CxSCPnv7ahKr6Xgtkn0KYCDQJ8DNn5VoMO8EXr9V5PadyA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -12518,7 +13588,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "peer": true, + "dev": true, "engines": { "node": ">=0.4.x" } @@ -12532,35 +13602,6 @@ "node": ">= 0.6" } }, - "node_modules/framer-motion": { - "version": "12.40.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", - "integrity": "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "motion-dom": "^12.40.0", - "motion-utils": "^12.39.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -12574,15 +13615,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/fs-extra": { "version": "11.3.5", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -12596,8 +13637,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -12609,8 +13650,8 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -12628,8 +13669,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/fscreen/-/fscreen-1.2.0.tgz", "integrity": "sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/fsevents": { "version": "2.3.3", @@ -12690,8 +13731,8 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", @@ -12707,8 +13748,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -12720,8 +13761,8 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", @@ -12735,8 +13776,8 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-property": "^1.0.2" } @@ -12750,12 +13791,22 @@ "node": ">= 0.4" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -12764,8 +13815,8 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -12811,8 +13862,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -12864,15 +13915,15 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -12881,8 +13932,8 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-ssh": "^1.4.0", "parse-url": "^8.1.0" @@ -12892,8 +13943,8 @@ "version": "14.1.0", "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.1.0.tgz", "integrity": "sha512-8xg65dTxGHST3+zGpycMMFZcoTzAdZ2dOtu4vmgIfkTFnVHBxHMzBC2L1k8To7EmrSiHesT8JgPLT91VKw1B5g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "git-up": "^7.0.0" } @@ -12923,8 +13974,8 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -12936,8 +13987,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", @@ -12954,8 +14005,8 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.13.1" }, @@ -12970,8 +14021,8 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=10" }, @@ -12999,8 +14050,8 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -13020,8 +14071,8 @@ "version": "9.15.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", @@ -13038,8 +14089,8 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=14" } @@ -13060,15 +14111,25 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC", - "peer": true + "dev": true, + "license": "ISC" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } }, "node_modules/gtoken": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" @@ -13081,8 +14142,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=4" } @@ -13092,8 +14153,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -13106,8 +14167,8 @@ "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13123,8 +14184,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/has-bigints": { "version": "1.1.0", @@ -13218,8 +14279,8 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/hast": "^2.0.0", "@types/unist": "^2.0.0", @@ -13238,8 +14299,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/hast": "^2.0.0" }, @@ -13252,8 +14313,8 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^2.0.0", @@ -13270,8 +14331,8 @@ "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -13281,8 +14342,8 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/hast": "^2.0.0", "@types/parse5": "^6.0.0", @@ -13305,8 +14366,8 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-4.1.0.tgz", "integrity": "sha512-Hd9tU0ltknMGRDv+d6Ro/4XKzBqQnP/EZrpiTbpFYfXv/uOhWeKc+2uajcbEvAEH98VZd7eII2PiXm13RihnLw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/hast": "^2.0.0" }, @@ -13319,8 +14380,8 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^2.0.0", @@ -13338,8 +14399,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -13349,8 +14410,8 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", @@ -13367,8 +14428,8 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13378,8 +14439,8 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "xtend": "^4.0.0" }, @@ -13392,8 +14453,8 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13403,8 +14464,8 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/helmet/-/helmet-6.2.0.tgz", "integrity": "sha512-DWlwuXLLqbrIOltR6tFQXShj/+7Cyp0gLi6uAb8qMdFh/YBBFbKSgQ6nbXmScYd8emMctuthmgIa7tUfo9Rtyg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=14.0.0" } @@ -13413,8 +14474,8 @@ "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": "*" } @@ -13423,15 +14484,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", - "license": "CC0-1.0", - "peer": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/history": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.7.6" } @@ -13440,8 +14501,8 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "react-is": "^16.7.0" } @@ -13450,8 +14511,17 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hono": { + "version": "4.12.26", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.26.tgz", + "integrity": "sha512-uyZtpnYxM9CmQ7QsQknM4zN8EftNqhON1qYeIKM0Se67CCEe2c44xyGURwB0axX2fBDu1dqHrHAc1hmNT8ITkw==", "license": "MIT", - "peer": true + "engines": { + "node": ">=16.9.0" + } }, "node_modules/html-encoding-sniffer": { "version": "6.0.0", @@ -13470,6 +14540,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, "funding": [ { "type": "github", @@ -13480,8 +14551,7 @@ "url": "https://patreon.com/mdevils" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", @@ -13494,8 +14564,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13525,8 +14595,8 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -13539,8 +14609,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -13555,8 +14625,8 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -13579,13 +14649,14 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", - "license": "BSD-3-Clause", - "peer": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/i18next": { "version": "22.5.1", "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", + "dev": true, "funding": [ { "type": "individual", @@ -13601,7 +14672,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.20.6" } @@ -13622,6 +14692,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -13636,15 +14707,14 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -13663,8 +14733,8 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -13680,12 +14750,22 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -13707,15 +14787,15 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/inline-style-prefixer": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "css-in-js-utils": "^3.1.0" } @@ -13738,8 +14818,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -13748,8 +14828,8 @@ "version": "5.11.1", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.11.1.tgz", "integrity": "sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@ioredis/commands": "1.10.0", "cluster-key-slot": "1.1.1", @@ -13767,6 +14847,15 @@ "url": "https://opencollective.com/ioredis" } }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -13780,8 +14869,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13791,8 +14880,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" @@ -13823,8 +14912,8 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", @@ -13864,8 +14953,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -13893,6 +14982,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, "funding": [ { "type": "github", @@ -13908,7 +14998,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -13977,8 +15066,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13988,8 +15077,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, "license": "MIT", - "peer": true, "bin": { "is-docker": "cli.js" }, @@ -14019,8 +15108,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -14044,8 +15133,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14073,8 +15162,8 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -14086,8 +15175,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -14097,15 +15186,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/is-inside-container": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^3.0.0" }, @@ -14147,8 +15236,8 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.12.0" } @@ -14173,8 +15262,8 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -14186,8 +15275,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -14203,15 +15292,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/is-reference": { "version": "1.2.1", @@ -14271,8 +15359,8 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "protocols": "^2.0.1" } @@ -14342,8 +15430,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/is-weakmap": { "version": "2.0.2", @@ -14392,8 +15480,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-inside-container": "^1.0.0" }, @@ -14420,8 +15508,8 @@ "version": "1.38.4", "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.38.4.tgz", "integrity": "sha512-Ud5vs6Ac+ET+iOZWZB1j2RruVeGQSQc7U7QUhPq6iGqzifaqOVHCgRpG/8c0LwIP39R+Mr+lzR4escmCuhjONQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "async-lock": "^1.4.1", "clean-git-ref": "^2.0.1", @@ -14446,8 +15534,8 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -14463,8 +15551,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "ws": "*" } @@ -14473,8 +15561,8 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", @@ -14534,8 +15622,8 @@ "version": "5.10.0", "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/panva" } @@ -14544,8 +15632,8 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz", "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/js-tokens": { "version": "9.0.1", @@ -14558,6 +15646,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, "funding": [ { "type": "github", @@ -14569,7 +15658,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -14581,8 +15669,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/jsdom": { "version": "29.1.1", @@ -14712,8 +15800,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, "license": "MIT", - "peer": true, "bin": { "jsesc": "bin/jsesc" }, @@ -14725,8 +15813,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bignumber.js": "^9.0.0" } @@ -14735,29 +15823,29 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)", - "peer": true + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-compare": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lodash": "^4.17.4" } @@ -14766,8 +15854,8 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "compute-lcm": "^1.1.2", "json-schema-compare": "^0.2.2", @@ -14783,12 +15871,38 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC", - "peer": true + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, "node_modules/jsonc-parser": { "version": "2.2.1", @@ -14800,8 +15914,8 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -14841,7 +15955,6 @@ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", "license": "MIT", - "peer": true, "dependencies": { "jws": "^4.0.1", "lodash.includes": "^4.3.0", @@ -14863,8 +15976,8 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -14879,8 +15992,8 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.3.1", "csstype": "^3.0.2", @@ -14896,8 +16009,8 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", @@ -14908,8 +16021,8 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -14919,8 +16032,8 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -14930,8 +16043,8 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -14942,8 +16055,8 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -14953,8 +16066,8 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -14965,8 +16078,8 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.3.1", "css-vendor": "^2.0.8", @@ -14978,7 +16091,6 @@ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", "license": "MIT", - "peer": true, "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -14990,7 +16102,6 @@ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", "license": "MIT", - "peer": true, "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" @@ -15000,8 +16111,8 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -15010,8 +16121,8 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -15020,8 +16131,8 @@ "version": "3.2.10", "resolved": "https://registry.npmjs.org/knex/-/knex-3.2.10.tgz", "integrity": "sha512-oypTHfrc9i72iyxaUQBKHOxhcr0xM65MPf6FpN02nimsftXwzXprIkLjfXdubvhbu4PMWLp023q8o8CYvHSuZw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "colorette": "2.0.19", "commander": "^10.0.0", @@ -15078,8 +16189,8 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=14" } @@ -15088,8 +16199,8 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -15106,22 +16217,22 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -15133,15 +16244,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15156,15 +16267,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15178,19 +16289,33 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/linkify-react": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/linkify-react/-/linkify-react-4.3.2.tgz", "integrity": "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ==", + "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" @@ -15199,9 +16324,9 @@ "node_modules/linkifyjs": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.2.tgz", - "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==", - "license": "MIT", - "peer": true + "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==", + "dev": true, + "license": "MIT" }, "node_modules/local-pkg": { "version": "0.5.1", @@ -15224,8 +16349,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -15243,64 +16368,57 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.topath": { "version": "4.5.2", @@ -15312,8 +16430,8 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -15330,8 +16448,8 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -15340,15 +16458,15 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0", - "peer": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15358,8 +16476,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -15371,8 +16489,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/loupe": { "version": "2.3.7", @@ -15388,8 +16506,8 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fault": "^1.0.0", "highlight.js": "~10.7.0" @@ -15403,8 +16521,8 @@ "version": "9.1.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "14 || >=16.14" } @@ -15413,8 +16531,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "bun": ">=1.0.0", "deno": ">=1.30.0", @@ -15429,8 +16547,8 @@ "version": "3.7.2", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" } @@ -15439,6 +16557,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, "license": "MIT", "bin": { "lz-string": "bin/bin.js" @@ -15485,15 +16604,15 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "license": "ISC", - "peer": true + "dev": true, + "license": "ISC" }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15503,8 +16622,8 @@ "version": "15.0.12", "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "dev": true, "license": "MIT", - "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -15516,8 +16635,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "^4.0.0" }, @@ -15529,8 +16648,8 @@ "version": "5.3.7", "resolved": "https://registry.npmjs.org/material-ui-popup-state/-/material-ui-popup-state-5.3.7.tgz", "integrity": "sha512-3ppRgNEfJ4pSEmVnRYeDDi/8L6RSGnsBrCP+WikozCeF7E21DyKAm80EOtBbeiOTooPCEQoeqrQ32uDKW2VYcw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@types/prop-types": "^15.7.3", @@ -15564,8 +16683,8 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -15580,8 +16699,8 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0", "escape-string-regexp": "^5.0.0", @@ -15597,8 +16716,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -15610,8 +16729,8 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -15635,8 +16754,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mdast-util-from-markdown": "^1.0.0", "mdast-util-gfm-autolink-literal": "^1.0.0", @@ -15655,8 +16774,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0", "ccount": "^2.0.0", @@ -15672,8 +16791,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0", @@ -15688,8 +16807,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" @@ -15703,8 +16822,8 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0", "markdown-table": "^3.0.0", @@ -15720,8 +16839,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" @@ -15735,8 +16854,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0", "unist-util-is": "^5.0.0" @@ -15750,8 +16869,8 @@ "version": "12.3.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", @@ -15771,8 +16890,8 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -15792,8 +16911,8 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/mdast": "^3.0.0" }, @@ -15822,8 +16941,8 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/memjs/-/memjs-1.3.2.tgz", "integrity": "sha512-qUEg2g8vxPe+zPn09KidjIStHPtoBO8Cttm8bgJFWWabbsjQ9Av9Ky+6UcvKx6ue0LLb/LEhtcyQpRyKfzeXcg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -15832,8 +16951,8 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/merge-descriptors": { "version": "1.0.3", @@ -15855,8 +16974,8 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 8" } @@ -15874,6 +16993,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15885,7 +17005,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -15910,6 +17029,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15921,7 +17041,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-factory-destination": "^1.0.0", @@ -15945,8 +17064,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "micromark-extension-gfm-autolink-literal": "^1.0.0", "micromark-extension-gfm-footnote": "^1.0.0", @@ -15966,8 +17085,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", @@ -15983,8 +17102,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "micromark-core-commonmark": "^1.0.0", "micromark-factory-space": "^1.0.0", @@ -16004,8 +17123,8 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", @@ -16023,8 +17142,8 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -16041,8 +17160,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "micromark-util-types": "^1.0.0" }, @@ -16055,8 +17174,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -16073,6 +17192,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16084,7 +17204,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -16095,6 +17214,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16106,7 +17226,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -16118,6 +17237,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16129,7 +17249,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -16139,6 +17258,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16150,7 +17270,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -16162,6 +17281,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16173,7 +17293,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -16185,6 +17304,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16196,7 +17316,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -16206,6 +17325,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16217,7 +17337,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-symbol": "^1.0.0" } @@ -16226,6 +17345,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16237,7 +17357,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -16248,6 +17367,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16259,7 +17379,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -16269,6 +17388,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16280,7 +17400,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-symbol": "^1.0.0" } @@ -16289,6 +17408,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16300,7 +17420,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -16312,6 +17431,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16322,13 +17442,13 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/micromark-util-html-tag-name": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16339,13 +17459,13 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16357,7 +17477,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-symbol": "^1.0.0" } @@ -16366,6 +17485,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16377,7 +17497,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-types": "^1.0.0" } @@ -16386,6 +17505,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16397,7 +17517,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-encode": "^1.0.0", @@ -16408,6 +17527,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16419,7 +17539,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -16431,6 +17550,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16441,13 +17561,13 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/micromark-util-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16458,15 +17578,14 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -16479,8 +17598,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, "license": "MIT", - "peer": true, "bin": { "mime": "cli.js" }, @@ -16493,7 +17612,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -16536,8 +17654,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -16561,8 +17679,8 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16571,8 +17689,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minimist": "^1.2.5" } @@ -16581,8 +17699,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=8" } @@ -16591,8 +17709,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -16605,8 +17723,8 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -16618,8 +17736,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, "license": "MIT", - "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -16631,8 +17749,8 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/mlly": { "version": "1.8.2", @@ -16658,8 +17776,8 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.11.0.tgz", "integrity": "sha512-zSkVu3t18r39pw4ixfBKvfZi3y2UOqr7d4WYwcj3m8nXpEQK4rPO6GLzs/CExoRgmX3y9EjmmcXqv6jq0SK46g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -16679,8 +17797,8 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -16689,62 +17807,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true - }, - "node_modules/motion": { - "version": "12.40.0", - "resolved": "https://registry.npmjs.org/motion/-/motion-12.40.0.tgz", - "integrity": "sha512-yjrHUrBFW6kQvjJwRsoiPSAhC5tRwRqNGJWmiJ4CrGnbKp0V88AdzkhBmDoqIsIPfarOe0Uddd37Xq43/gIocA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "framer-motion": "^12.40.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/motion-dom": { - "version": "12.40.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.40.0.tgz", - "integrity": "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "motion-utils": "^12.39.0" - } - }, - "node_modules/motion-utils": { - "version": "12.39.0", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", - "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", - "license": "MIT", - "optional": true, - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -16759,8 +17830,8 @@ "version": "3.22.5", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.22.5.tgz", "integrity": "sha512-95uZ2TrPWAZdwpB3vvvDbmEMcNG8yIeNCyu6GUcr/QnWEE/wXm7+mhOCsdQfWQDTV7qYT/PDUZ4U4UPP4AsXqQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "aws-ssl-profiles": "^1.1.2", "denque": "^2.1.0", @@ -16782,8 +17853,8 @@ "version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -16799,8 +17870,8 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lru.min": "^1.1.0" }, @@ -16812,16 +17883,16 @@ "version": "2.27.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.27.0.tgz", "integrity": "sha512-hC+0LidcL3XE4rp1C4H54KujgXKzbfyTngZTwBByQxsOxCEKZT0MPQ4hOKUH2jU1OYstqdDH4onyHPDzcV0XdQ==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/nano-css": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz", "integrity": "sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==", + "dev": true, "license": "Unlicense", - "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "css-tree": "^1.1.2", @@ -16841,8 +17912,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -16855,15 +17926,15 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0", - "peer": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/nano-css/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -16872,8 +17943,8 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.12", @@ -16894,12 +17965,19 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/negotiator": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -16947,18 +18025,28 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", + "dev": true, "license": "(BSD-3-Clause OR GPL-2.0)", - "peer": true, "engines": { "node": ">= 6.13.0" } }, + "node_modules/node-releases": { + "version": "2.0.48", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz", + "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -16996,8 +18084,8 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "*" } @@ -17007,7 +18095,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -17016,1625 +18103,2196 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true, "license": "MIT", "optional": true, - "peer": true, "engines": { - "node": ">= 6" + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oidc-token-hash": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.2.0.tgz", + "integrity": "sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openid-client": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", + "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "jose": "^4.15.9", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "dev": true, + "license": "MIT", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "node_modules/p-throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-4.1.1.tgz", + "integrity": "sha512-TuU8Ato+pRTPJoDzYD4s7ocJYcNSEZRvlxoq3hcPI2kZDZ49IQ1Wkj7/gDJc3X7XiEAAvRGtDzdXJI0tC3IL1g==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/oidc-token-hash": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.2.0.tgz", - "integrity": "sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw==", + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": "^10.13.0 || >=12.0.0" + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">= 0.8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "node_modules/parse-path": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "protocols": "^2.0.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dev": true, + "license": "MIT", "dependencies": { - "wrappy": "1" + "parse-path": "^7.0.0" } }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, - "dependencies": { - "fn.name": "1.x.x" + "engines": { + "node": ">= 0.8" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" }, "engines": { - "node": ">=12" + "node": ">= 0.4.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" } }, - "node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/path-equal": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/path-equal/-/path-equal-1.2.5.tgz", + "integrity": "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/openid-client": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", - "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "jose": "^4.15.9", - "lru-cache": "^6.0.0", - "object-hash": "^2.2.0", - "oidc-token-hash": "^5.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/panva" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/openid-client/node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/panva" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/openid-client/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "license": "MIT", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">= 0.4" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "20 || >=22" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { "node": ">=8" } }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==", + "dev": true + }, + "node_modules/pct-encode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pct-encode/-/pct-encode-1.0.3.tgz", + "integrity": "sha512-+ojEvSHApoLWF2YYxwnOM4N9DPn5e5fG+j0YJ9drKNaYtrZYOq5M9ESOaBYqOHCXOAALODJJ4wkqHAXEuLpwMw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", + "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "p-try": "^2.0.0" + "pg-connection-string": "^2.13.0", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.14.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" }, "engines": { - "node": ">=6" + "node": ">= 16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "pg-cloudflare": "^1.4.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } } }, - "node_modules/p-throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-4.1.1.tgz", - "integrity": "sha512-TuU8Ato+pRTPJoDzYD4s7ocJYcNSEZRvlxoq3hcPI2kZDZ49IQ1Wkj7/gDJc3X7XiEAAvRGtDzdXJI0tC3IL1g==", + "node_modules/pg-cloudflare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz", + "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==", + "dev": true, "license": "MIT", - "peer": true, + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "dev": true, + "license": "ISC", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0.0" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/pg-pool": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" + "peerDependencies": { + "pg": ">=8.0" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)", - "peer": true + "node_modules/pg-protocol": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz", + "integrity": "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==", + "dev": true, + "license": "MIT" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "callsites": "^3.0.0" + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "node_modules/pg/node_modules/pg-connection-string": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.13.0.tgz", + "integrity": "sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==", + "dev": true, + "license": "MIT" + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "split2": "^4.1.0" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, "engines": { - "node": ">=8" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/parse-path": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", - "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "protocols": "^2.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "license": "MIT", - "peer": true, - "dependencies": { - "parse-path": "^7.0.0" + "engines": { + "node": ">=16.20.0" } }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "license": "MIT", - "peer": true - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, - "node_modules/passport": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", - "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - }, "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" + "node": ">=4" } }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", - "peer": true, + "node_modules/pony-cause": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz", + "integrity": "sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==", + "license": "0BSD", "engines": { - "node": ">= 0.4.0" + "node": ">=12.0.0" } }, - "node_modules/path-equal": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/path-equal/-/path-equal-1.2.5.tgz", - "integrity": "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==", - "license": "MIT", - "peer": true + "node_modules/popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==", + "dev": true, + "license": "MIT" }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/path-expression-matcher": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", - "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, { "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", - "peer": true, + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">=14.0.0" + "node": "^10 || ^12 || >=14" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/path-parse": { + "node_modules/postgres-date": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "license": "BlueOak-1.0.0", - "peer": true, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "xtend": "^4.0.0" }, "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", - "license": "BlueOak-1.0.0", - "peer": true, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">= 0.8.0" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "peer": true, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": ">=6" + } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.6.0" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "license": "MIT", - "engines": { - "node": "*" + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==", - "peer": true - }, - "node_modules/pct-encode": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pct-encode/-/pct-encode-1.0.3.tgz", - "integrity": "sha512-+ojEvSHApoLWF2YYxwnOM4N9DPn5e5fG+j0YJ9drKNaYtrZYOq5M9ESOaBYqOHCXOAALODJJ4wkqHAXEuLpwMw==", - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT", - "peer": true + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, "license": "MIT", - "peer": true + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/pg": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", - "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", - "license": "MIT", - "peer": true, + "node_modules/protobufjs": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz", + "integrity": "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==", + "dev": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { - "pg-connection-string": "^2.13.0", - "pg-pool": "^3.14.0", - "pg-protocol": "^1.14.0", - "pg-types": "2.2.0", - "pgpass": "1.0.5" + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" }, "engines": { - "node": ">= 16.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.4.0" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } + "node": ">=12.0.0" } }, - "node_modules/pg-cloudflare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz", - "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==", - "license": "MIT", - "optional": true, - "peer": true + "node_modules/protocols": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "dev": true, + "license": "MIT" }, - "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", - "peer": true - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "license": "ISC", - "peer": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, "engines": { - "node": ">=4.0.0" + "node": ">= 0.10" } }, - "node_modules/pg-pool": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", - "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, "license": "MIT", - "peer": true, - "peerDependencies": { - "pg": ">=8.0" + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" } }, - "node_modules/pg-protocol": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz", - "integrity": "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==", + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", - "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" + "side-channel": "^1.1.0" }, "engines": { - "node": ">=4" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pg/node_modules/pg-connection-string": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.13.0.tgz", - "integrity": "sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "node_modules/rc-progress": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.5.1.tgz", + "integrity": "sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "split2": "^4.1.0" + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8.6" + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "node_modules/react-aria": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.48.0.tgz", + "integrity": "sha512-jQjd4rBEIMqecBaAKYJbVGK6EqIHLa5znVQ7jwFyK5vCyljoj6KhgtiahmcIPsG5vG5vEDLw+ba+bEWn6A2P4w==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "@internationalized/date": "^3.12.1", + "@internationalized/number": "^3.6.6", + "@internationalized/string": "^3.2.8", + "@react-types/shared": "^3.34.0", + "@swc/helpers": "^0.5.0", + "aria-hidden": "^1.2.3", + "clsx": "^2.0.0", + "react-stately": "3.46.0", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "node_modules/react-aria-components": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.17.0.tgz", + "integrity": "sha512-0EyisMgvsFJ2aML3crDYv2tW5vT2Ryf8PGzY/g63JjDdCbLshlwazhS8JNtPF1vkTkungJJ6sVJbKyX+YKSoFA==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.12.1", + "@react-types/shared": "^3.34.0", + "@swc/helpers": "^0.5.0", + "client-only": "^0.0.1", + "react-aria": "3.48.0", + "react-stately": "3.46.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } }, - "node_modules/pony-cause": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz", - "integrity": "sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==", - "license": "0BSD", - "engines": { - "node": ">=12.0.0" + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "deprecated": "react-beautiful-dnd is now deprecated. Context and options: https://github.com/atlassian/react-beautiful-dnd/issues/2672", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" } }, - "node_modules/popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==", + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "node_modules/react-double-scrollbar": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/react-double-scrollbar/-/react-double-scrollbar-0.0.15.tgz", + "integrity": "sha512-dLz3/WBIpgFnzFY0Kb4aIYBMT2BWomHuW2DH6/9jXfS6/zxRRBUFQ04My4HIB7Ma7QoRBpcy8NtkPeFgcGBpgg==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=0.12.0" + }, + "peerDependencies": { + "react": ">= 0.14.7" } }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-full-screen": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/react-full-screen/-/react-full-screen-1.1.1.tgz", + "integrity": "sha512-xoEgkoTiN0dw9cjYYGViiMCBYbkS97BYb4bHPhQVWXj1UnOs8PZ1rPzpX+2HMhuvQV1jA5AF9GaRbO3fA5aZtg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "fscreen": "^1.0.2" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=10" + }, + "peerDependencies": { + "react": ">= 16.8.0" } }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "node_modules/react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.3.0" } }, - "node_modules/postgres-bytea": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", - "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "node_modules/react-hook-form": { + "version": "7.79.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.79.0.tgz", + "integrity": "sha512-mhYp/MTmXvzYX6AJcJVko0rktoIhhmRnEouObj4wF5i/tCttgJvnp1+9wRkpITZjDTqpo4IOSJqu0dBlPlV/Lw==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" } }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "node_modules/react-idle-timer": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/react-idle-timer/-/react-idle-timer-5.7.2.tgz", + "integrity": "sha512-+BaPfc7XEUU5JFkwZCx6fO1bLVK+RBlFH+iY4X34urvIzZiZINP6v2orePx3E6pAztJGE7t4DzvL7if2SL/0GQ==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" } }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "xtend": "^4.0.0" + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/react-router": { + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", + "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", + "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "@remix-run/router": "1.23.3" + }, "engines": { - "node": ">= 0.6.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT", - "peer": true - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "node_modules/react-router-dom": { + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", + "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "@remix-run/router": "1.23.3", + "react-router": "6.30.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT", - "peer": true - }, - "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "node_modules/react-side-effect": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", + "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", + "dev": true, "license": "MIT", - "peer": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/protobufjs": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz", - "integrity": "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "peer": true, + "node_modules/react-sparklines": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/react-sparklines/-/react-sparklines-1.7.0.tgz", + "integrity": "sha512-bJFt9K4c5Z0k44G8KtxIhbG+iyxrKjBZhdW6afP+R7EnIq+iKjbWbEFISrf3WKNFsda+C46XAfnX0StS5fbDcg==", + "dev": true, + "license": "MIT", "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.5", - "@protobufjs/eventemitter": "^1.1.1", - "@protobufjs/fetch": "^1.1.1", - "@protobufjs/float": "^1.0.2", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.1", - "@types/node": ">=13.7.0", - "long": "^5.3.2" + "prop-types": "^15.5.10" }, - "engines": { - "node": ">=12.0.0" + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/protocols": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", - "license": "MIT", - "peer": true - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", + "node_modules/react-stately": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.46.0.tgz", + "integrity": "sha512-OdxhWvHgs2L4OJGIs7hnuTr5WjjMM6enhNEAMRqiekhF8+ITvA2LRwNftOZwcogaoCslGYq5S2VQTQwnm0GbCA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "@internationalized/date": "^3.12.1", + "@internationalized/number": "^3.6.6", + "@internationalized/string": "^3.2.8", + "@react-types/shared": "^3.34.0", + "@swc/helpers": "^0.5.0", + "use-sync-external-store": "^1.6.0" }, - "engines": { - "node": ">= 0.10" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "node_modules/react-syntax-highlighter": { + "version": "15.6.6", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.6.tgz", + "integrity": "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "punycode": "^2.3.1" + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^3.6.0" }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" + "peerDependencies": { + "react": ">= 0.14.0" } }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", - "peer": true, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" + "node_modules/react-universal-interface": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "dev": true, + "peerDependencies": { + "react": "*", + "tslib": "*" } }, - "node_modules/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", - "license": "BSD-3-Clause", + "node_modules/react-use": { + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.6.1.tgz", + "integrity": "sha512-uibb3pgzV4LFsYPHyXYGu7dD2+pyk/ZJlPH+AizBR3zolqPWyCleKcWWbUQaKSKfydwgnQ3ymGm1Ab3/saGHCA==", + "dev": true, + "license": "Unlicense", "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" + "@types/js-cookie": "^3.0.0", + "@xobotyi/scrollbar-width": "^1.9.5", + "copy-to-clipboard": "^3.3.1", + "fast-deep-equal": "^3.1.3", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^3.0.0", + "nano-css": "^5.6.2", + "react-universal-interface": "^0.6.2", + "resize-observer-polyfill": "^1.5.1", + "screenfull": "^5.1.0", + "set-harmonic-interval": "^1.0.1", + "throttle-debounce": "^3.0.1", + "ts-easing": "^0.2.0", + "tslib": "^2.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true - }, - "node_modules/raf-schd": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz", + "integrity": "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A==", + "dev": true, "license": "MIT", - "peer": true + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" + } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/react-window": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz", + "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, "engines": { - "node": ">= 0.6" + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=6" } }, - "node_modules/rc-progress": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.5.1.tgz", - "integrity": "sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==", + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-util": "^5.16.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/rc-util": { - "version": "5.44.4", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", - "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.18.3", - "react-is": "^18.2.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "node_modules/read-yaml-file/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/react-aria": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.48.0.tgz", - "integrity": "sha512-jQjd4rBEIMqecBaAKYJbVGK6EqIHLa5znVQ7jwFyK5vCyljoj6KhgtiahmcIPsG5vG5vEDLw+ba+bEWn6A2P4w==", + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@internationalized/date": "^3.12.1", - "@internationalized/number": "^3.6.6", - "@internationalized/string": "^3.2.8", - "@react-types/shared": "^3.34.0", - "@swc/helpers": "^0.5.0", - "aria-hidden": "^1.2.3", - "clsx": "^2.0.0", - "react-stately": "3.46.0", - "use-sync-external-store": "^1.6.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "minimatch": "^5.1.0" } }, - "node_modules/react-aria-components": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.17.0.tgz", - "integrity": "sha512-0EyisMgvsFJ2aML3crDYv2tW5vT2Ryf8PGzY/g63JjDdCbLshlwazhS8JNtPF1vkTkungJJ6sVJbKyX+YKSoFA==", - "license": "Apache-2.0", - "peer": true, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", "dependencies": { - "@internationalized/date": "^3.12.1", - "@react-types/shared": "^3.34.0", - "@swc/helpers": "^0.5.0", - "client-only": "^0.0.1", - "react-aria": "3.48.0", - "react-stately": "3.46.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "balanced-match": "^1.0.0" } }, - "node_modules/react-beautiful-dnd": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", - "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", - "deprecated": "react-beautiful-dnd is now deprecated. Context and options: https://github.com/atlassian/react-beautiful-dnd/issues/2672", - "license": "Apache-2.0", - "peer": true, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/runtime": "^7.9.2", - "css-box-model": "^1.2.0", - "memoize-one": "^5.1.1", - "raf-schd": "^4.0.2", - "react-redux": "^7.2.0", - "redux": "^4.0.4", - "use-memo-one": "^1.1.1" + "brace-expansion": "^2.0.1" }, - "peerDependencies": { - "react": "^16.8.5 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + "engines": { + "node": ">=10" } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "picomatch": "^2.2.1" }, - "peerDependencies": { - "react": "^18.3.1" + "engines": { + "node": ">=8.10.0" } }, - "node_modules/react-double-scrollbar": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/react-double-scrollbar/-/react-double-scrollbar-0.0.15.tgz", - "integrity": "sha512-dLz3/WBIpgFnzFY0Kb4aIYBMT2BWomHuW2DH6/9jXfS6/zxRRBUFQ04My4HIB7Ma7QoRBpcy8NtkPeFgcGBpgg==", + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.12.0" + "dependencies": { + "resolve": "^1.20.0" }, - "peerDependencies": { - "react": ">= 0.14.7" + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": ">=4" + } }, - "node_modules/react-full-screen": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/react-full-screen/-/react-full-screen-1.1.1.tgz", - "integrity": "sha512-xoEgkoTiN0dw9cjYYGViiMCBYbkS97BYb4bHPhQVWXj1UnOs8PZ1rPzpX+2HMhuvQV1jA5AF9GaRbO3fA5aZtg==", + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "fscreen": "^1.0.2" + "redis-errors": "^1.0.0" }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">= 16.8.0" + "node": ">=4" } }, - "node_modules/react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "object-assign": "^4.1.1", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.1.1", - "react-side-effect": "^2.1.0" - }, - "peerDependencies": { - "react": ">=16.3.0" + "@babel/runtime": "^7.9.2" } }, - "node_modules/react-hook-form": { - "version": "7.79.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.79.0.tgz", - "integrity": "sha512-mhYp/MTmXvzYX6AJcJVko0rktoIhhmRnEouObj4wF5i/tCttgJvnp1+9wRkpITZjDTqpo4IOSJqu0dBlPlV/Lw==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "license": "MIT", - "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, "engines": { - "node": ">=18.0.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/react-idle-timer": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/react-idle-timer/-/react-idle-timer-5.7.2.tgz", - "integrity": "sha512-+BaPfc7XEUU5JFkwZCx6fO1bLVK+RBlFH+iY4X34urvIzZiZINP6v2orePx3E6pAztJGE7t4DzvL7if2SL/0GQ==", + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "dev": true, "license": "MIT", - "peer": true, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" + "engines": { + "node": ">=6" } }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/react-markdown": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", - "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "node_modules/rehype-raw": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", + "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/hast": "^2.0.0", - "@types/prop-types": "^15.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "prop-types": "^15.0.0", - "property-information": "^6.0.0", - "react-is": "^18.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" + "hast-util-raw": "^7.2.0", + "unified": "^10.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" } }, - "node_modules/react-redux": { - "version": "7.2.9", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", - "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "node_modules/rehype-sanitize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-5.0.1.tgz", + "integrity": "sha512-da/jIOjq8eYt/1r9GN6GwxIR3gde7OZ+WV8pheu1tL8K0D9KxM2AyMh+UEfke+FfdM3PvGHeYJU0Td5OWa7L5A==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/react-redux": "^7.1.20", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - }, - "peerDependencies": { - "react": "^16.8.3 || ^17 || ^18" + "@types/hast": "^2.0.0", + "hast-util-sanitize": "^4.0.0", + "unified": "^10.0.0" }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/react-redux/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT", - "peer": true - }, - "node_modules/react-router": { - "version": "6.30.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", - "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@remix-run/router": "1.23.3" - }, - "engines": { - "node": ">=14.0.0" + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" }, - "peerDependencies": { - "react": ">=16.8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/react-router-dom": { - "version": "6.30.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", - "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@remix-run/router": "1.23.3", - "react-router": "6.30.4" - }, - "engines": { - "node": ">=14.0.0" + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-side-effect": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", - "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", - "license": "MIT", - "peer": true, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0 || ^18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/react-sparklines": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/react-sparklines/-/react-sparklines-1.7.0.tgz", - "integrity": "sha512-bJFt9K4c5Z0k44G8KtxIhbG+iyxrKjBZhdW6afP+R7EnIq+iKjbWbEFISrf3WKNFsda+C46XAfnX0StS5fbDcg==", + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "prop-types": "^15.5.10" + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" }, - "peerDependencies": { - "react": "*", - "react-dom": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/react-stately": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.46.0.tgz", - "integrity": "sha512-OdxhWvHgs2L4OJGIs7hnuTr5WjjMM6enhNEAMRqiekhF8+ITvA2LRwNftOZwcogaoCslGYq5S2VQTQwnm0GbCA==", + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@internationalized/date": "^3.12.1", - "@internationalized/number": "^3.6.6", - "@internationalized/string": "^3.2.8", - "@react-types/shared": "^3.34.0", - "@swc/helpers": "^0.5.0", - "use-sync-external-store": "^1.6.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "engines": { + "node": ">= 6" } }, - "node_modules/react-syntax-highlighter": { - "version": "15.6.6", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.6.tgz", - "integrity": "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==", + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.3.1", - "highlight.js": "^10.4.1", - "highlightjs-vue": "^1.0.0", - "lowlight": "^1.17.0", - "prismjs": "^1.30.0", - "refractor": "^3.6.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, - "peerDependencies": { - "react": ">= 0.14.0" + "engines": { + "node": ">= 0.12" } }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "node_modules/request/node_modules/qs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", + "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" + "engines": { + "node": ">=0.6" } }, - "node_modules/react-universal-interface": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", - "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", - "peer": true, - "peerDependencies": { - "react": "*", - "tslib": "*" + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/react-use": { - "version": "17.6.1", - "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.6.1.tgz", - "integrity": "sha512-uibb3pgzV4LFsYPHyXYGu7dD2+pyk/ZJlPH+AizBR3zolqPWyCleKcWWbUQaKSKfydwgnQ3ymGm1Ab3/saGHCA==", - "license": "Unlicense", - "peer": true, - "dependencies": { - "@types/js-cookie": "^3.0.0", - "@xobotyi/scrollbar-width": "^1.9.5", - "copy-to-clipboard": "^3.3.1", - "fast-deep-equal": "^3.1.3", - "fast-shallow-equal": "^1.0.0", - "js-cookie": "^3.0.0", - "nano-css": "^5.6.2", - "react-universal-interface": "^0.6.2", - "resize-observer-polyfill": "^1.5.1", - "screenfull": "^5.1.0", - "set-harmonic-interval": "^1.0.1", - "throttle-debounce": "^3.0.1", - "ts-easing": "^0.2.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz", - "integrity": "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", - "peer": true, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/react-window": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz", - "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==", + "node_modules/reserved": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved/-/reserved-0.1.2.tgz", + "integrity": "sha512-/qO54MWj5L8WCBP9/UNe2iefJc+L9yETbH32xO/ft/EYPOTCR5k+azvDUgdCOKwZH8hXwPd0b8XBL78Nn2U69g==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node": ">= 4" } }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "node_modules/retry-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", + "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" + "@types/request": "^2.48.8", + "extend": "^3.0.2", + "teeny-request": "^9.0.0" }, "engines": { - "node": ">=6" + "node": ">=14" } }, - "node_modules/read-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/read-yaml-file/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "node_modules/rfc4648": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.4.tgz", + "integrity": "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/rifm": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.7.0.tgz", + "integrity": "sha512-DSOJTWHD67860I5ojetXdEQRIBvF6YcpNe53j0vn1vp9EUb9N80EiZTxgP+FkDKorWC8PZw052kTF4C1GOivCQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@babel/runtime": "^7.3.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "peerDependencies": { + "react": ">=16.8" } }, - "node_modules/read-yaml-file/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, "license": "BSD-3-Clause", - "peer": true + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/rollup": { + "version": "2.80.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.80.0.tgz", + "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">= 6" + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "peer": true, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", "dependencies": { - "minimatch": "^5.1.0" + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "license": "ISC", - "peer": true, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" + "@babel/runtime": "^7.1.2" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "peer": true, "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" + "queue-microtask": "^1.2.2" } }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "mri": "^1.1.0" + }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "license": "MIT", - "peer": true, "dependencies": { - "redis-errors": "^1.0.0" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">=4" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.9.2" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -18643,250 +20301,337 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/refractor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", - "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", - "license": "MIT", - "peer": true, + "node_modules/safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", "dependencies": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" + "xmlchars": "^2.2.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=v12.22.7" } }, - "node_modules/refractor/node_modules/prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", + "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" + "@types/node-forge": "^1.3.0", + "node-forge": "^1" }, "engines": { - "node": ">= 0.4" + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/rehype-raw": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", - "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", - "peer": true, "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-raw": "^7.2.0", - "unified": "^10.0.0" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/rehype-sanitize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-5.0.1.tgz", - "integrity": "sha512-da/jIOjq8eYt/1r9GN6GwxIR3gde7OZ+WV8pheu1tL8K0D9KxM2AyMh+UEfke+FfdM3PvGHeYJU0Td5OWa7L5A==", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-sanitize": "^4.0.0", - "unified": "^10.0.0" + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4" } }, - "node_modules/remark-gfm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", - "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "node_modules/serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", - "peer": true, "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "license": "MIT", - "peer": true, "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "license": "Apache-2.0", - "peer": true, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=6.9" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "license": "MIT", - "peer": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 0.12" + "node": ">= 0.4" } }, - "node_modules/request/node_modules/qs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", - "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, "engines": { - "node": ">=0.6" + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", - "peer": true, - "bin": { - "uuid": "bin/uuid" + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/reserved": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved/-/reserved-0.1.2.tgz", - "integrity": "sha512-/qO54MWj5L8WCBP9/UNe2iefJc+L9yETbH32xO/ft/EYPOTCR5k+azvDUgdCOKwZH8hXwPd0b8XBL78Nn2U69g==", + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, "engines": { - "node": ">=0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", - "peer": true + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -18895,1117 +20640,1206 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "peer": true, + "node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=14" + "node": ">=0.10.0" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, "license": "MIT", - "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "license": "ISC", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 10.x" } }, - "node_modules/rfc4648": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.4.tgz", - "integrity": "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==", - "license": "MIT", - "peer": true + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" }, - "node_modules/rifm": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.7.0.tgz", - "integrity": "sha512-DSOJTWHD67860I5ojetXdEQRIBvF6YcpNe53j0vn1vp9EUb9N80EiZTxgP+FkDKorWC8PZw052kTF4C1GOivCQ==", + "node_modules/sql-escaper": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/sql-escaper/-/sql-escaper-1.3.3.tgz", + "integrity": "sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.3.1" + "engines": { + "bun": ">=1.0.0", + "deno": ">=2.0.0", + "node": ">=12.0.0" }, - "peerDependencies": { - "react": ">=16.8" + "funding": { + "type": "github", + "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" } }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/ssh2": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz", + "integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==", + "dev": true, + "hasInstallScript": true, "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" }, "engines": { - "node": ">=8.0" + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.10", + "nan": "^2.23.0" } }, - "node_modules/rollup": { - "version": "2.80.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.80.0.tgz", - "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, "bin": { - "rollup": "dist/bin/rollup" + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=0.10.0" } }, - "node_modules/rtl-css-js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", - "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.1.2" + "stackframe": "^1.3.4" } }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "queue-microtask": "^1.2.2" + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" } }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "license": "MIT", - "peer": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "dev": true, + "license": "MIT" }, - "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, "license": "MIT" }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "isarray": "^2.0.5" + "internal-slot": "^1.1.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-regex-test": { + "node_modules/stoppable": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4", + "npm": ">=6" } }, - "node_modules/safe-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", - "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", - "license": "MIT" + "node_modules/stream-buffers": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz", + "integrity": "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" + } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dev": true, + "license": "MIT", + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true, "license": "MIT" }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "node_modules/streamx": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", + "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" } }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/screenfull": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", - "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "license": "MIT", - "peer": true, "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semver": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", - "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "license": "MIT", - "peer": true - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" - }, "engines": { "node": ">=4" } }, - "node_modules/serialize-error": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" + "js-tokens": "^9.0.1" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/strnum": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.0.tgz", + "integrity": "sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "anynum": "^1.0.0" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/set-harmonic-interval": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", - "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", - "license": "Unlicense", - "peer": true, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { - "node": ">=6.9" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "node_modules/swr": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz", + "integrity": "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==", + "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" + "dequal": "^2.0.3", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, "license": "ISC" }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "peer": true, + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/tar-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", + "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", + "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar-stream/node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/tarn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", + "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "license": "MIT", + "node_modules/teeny-request": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.9", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14" } }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "node_modules/teeny-request/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" + "debug": "4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6.0.0" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "node_modules/teeny-request/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "node_modules/teeny-request/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "agent-base": "6", + "debug": "4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 6" } }, - "node_modules/simple-concat": { + "node_modules/teex": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "streamx": "^2.12.5" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "peer": true, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, "engines": { "node": ">=8" } }, - "node_modules/source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "license": "MIT" - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "peer": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/text-decoder/node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } } }, - "node_modules/split-ca": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", - "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", - "license": "ISC", - "peer": true + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true, + "license": "MIT" }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "peer": true, + "node_modules/throttle-debounce": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", + "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 10.x" + "node": ">=10" } }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/sql-escaper": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/sql-escaper/-/sql-escaper-1.3.3.tgz", - "integrity": "sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==", + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "bun": ">=1.0.0", - "deno": ">=2.0.0", - "node": ">=12.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" + "node": ">=8" } }, - "node_modules/ssh2": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz", - "integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==", - "hasInstallScript": true, - "peer": true, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", "dependencies": { - "asn1": "^0.2.6", - "bcrypt-pbkdf": "^1.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">=10.16.0" + "node": ">=12.0.0" }, - "optionalDependencies": { - "cpu-features": "~0.0.10", - "nan": "^2.23.0" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "engines": { + "node": ">=12.0.0" }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "engines": { - "node": ">=0.10.0" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/stack-generator": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", - "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "stackframe": "^1.3.4" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": "*" + "node": ">=14.0.0" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, - "license": "MIT" - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT", - "peer": true - }, - "node_modules/stacktrace-gps": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", - "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", "license": "MIT", - "peer": true, - "dependencies": { - "source-map": "0.5.6", - "stackframe": "^1.3.4" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/stacktrace-js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", - "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "node_modules/tldts": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.2.tgz", + "integrity": "sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "error-stack-parser": "^2.0.6", - "stack-generator": "^2.0.5", - "stacktrace-gps": "^3.0.4" - } - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "license": "MIT", - "peer": true - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "tldts-core": "^7.4.2" + }, + "bin": { + "tldts": "bin/cli.js" } }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "node_modules/tldts-core": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.2.tgz", + "integrity": "sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==", "dev": true, "license": "MIT" }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" }, "engines": { "node": ">= 0.4" } }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">=4", - "npm": ">=6" + "node": ">=8.0" } }, - "node_modules/stream-buffers": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz", - "integrity": "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==", - "license": "Unlicense", - "peer": true, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { - "node": ">= 0.10.0" + "node": ">=0.6" } }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "license": "MIT", - "peer": true, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "stubs": "^3.0.0" + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "license": "MIT", - "peer": true + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, - "node_modules/streamx": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", - "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", - "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-object-atoms": "^1.1.2", - "has-property-descriptors": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=18.12" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", - "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "node_modules/ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.2" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, - "engines": { - "node": ">= 0.4" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/ts-node/node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "peer": true, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "ansi-regex": "^5.0.1" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "license": "Unlicense" }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strnum": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.0.tgz", - "integrity": "sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "license": "MIT", - "peer": true, "dependencies": { - "anynum": "^1.0.0" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "license": "MIT", - "peer": true - }, - "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "license": "MIT", - "peer": true, "dependencies": { - "inline-style-parser": "0.1.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "license": "MIT", - "peer": true - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, "engines": { "node": ">= 0.4" }, @@ -20013,2110 +21847,2336 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swr": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz", - "integrity": "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==", + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "license": "MIT", - "peer": true, "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.6.0" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, "license": "MIT" }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "node": ">=14.17" } }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC", - "peer": true - }, - "node_modules/tar-fs/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "node_modules/typescript-eslint": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.1.tgz", + "integrity": "sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "@typescript-eslint/eslint-plugin": "8.61.1", + "@typescript-eslint/parser": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/utils": "8.61.1" }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/tar-stream": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", - "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", - "license": "MIT", - "peer": true, + "node_modules/typescript-json-schema": { + "version": "0.67.4", + "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.67.4.tgz", + "integrity": "sha512-BhDCVfwGtPKKt9JOBvh6ocmSbEk7ftx7dpqqIpvGNrjzYcUKm8pnYwKSFfNJwqcp/qNTfZr9sKtVyTxx4V9iRA==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "b4a": "^1.6.4", - "bare-fs": "^4.5.5", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar-stream/node_modules/b4a": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "react-native-b4a": "*" + "@types/json-schema": "^7.0.15", + "@types/node": "^24.10.2", + "glob": "^13.0.6", + "path-equal": "^1.2.5", + "safe-stable-stringify": "^2.5.0", + "ts-node": "^10.9.2", + "typescript": "~5.9.3", + "vm2": "^3.11.3", + "yargs": "^18.0.0" }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } + "bin": { + "typescript-json-schema": "bin/typescript-json-schema" } }, - "node_modules/tarn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "node_modules/typescript-json-schema/node_modules/@types/node": { + "version": "24.13.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", + "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.0.0" + "dependencies": { + "undici-types": "~7.18.0" } }, - "node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, + "node_modules/typescript-json-schema/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/teeny-request/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/typescript-json-schema/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/teeny-request/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "node_modules/typescript-json-schema/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">= 6" + "node": "18 || 20 || >=22" } }, - "node_modules/teeny-request/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "peer": true, + "node_modules/typescript-json-schema/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", "dependencies": { - "agent-base": "6", - "debug": "4" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">= 6" + "node": ">=20" } }, - "node_modules/teex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", - "license": "MIT", - "peer": true, - "dependencies": { - "streamx": "^2.12.5" - } + "node_modules/typescript-json-schema/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/typescript-json-schema/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/text-decoder": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", - "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", - "license": "Apache-2.0", - "peer": true, + "node_modules/typescript-json-schema/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/text-decoder/node_modules/b4a": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "react-native-b4a": "*" + "brace-expansion": "^5.0.5" }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT", - "peer": true + "node_modules/typescript-json-schema/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/throttle-debounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", - "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "node_modules/typescript-json-schema/node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } }, - "node_modules/tildify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "node_modules/typescript-json-schema/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT", - "peer": true - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "node_modules/typescript-json-schema/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "node_modules/typescript-json-schema/node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "node_modules/typescript-json-schema/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=14.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "node_modules/typescript-json-schema/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "dev": true, "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, "engines": { - "node": ">=14.0.0" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/tldts": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.2.tgz", - "integrity": "sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==", + "node_modules/typescript-json-schema/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.4.2" - }, - "bin": { - "tldts": "bin/cli.js" + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/tldts-core": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.2.tgz", - "integrity": "sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==", + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", "dev": true, "license": "MIT" }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "license": "MIT", - "peer": true, "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/undici": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz", + "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "is-number": "^7.0.0" - }, "engines": { - "node": ">=8.0" + "node": ">=20.18.1" } }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", - "license": "MIT", - "peer": true + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "license": "BSD-3-Clause", - "peer": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" }, - "engines": { - "node": ">=0.8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "dev": true, "license": "MIT", - "peer": true, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">= 14.0.0" + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ts-easing": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", - "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==", - "license": "Unlicense", - "peer": true - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "@types/unist": "^2.0.0" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ts-node/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "peer": true, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "^5.0.1" + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" }, - "engines": { - "node": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "license": "Unlicense", - "peer": true + "node_modules/universal-github-app-jwt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz", + "integrity": "sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "^9.0.0", + "jsonwebtoken": "^9.0.2" + } }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 10.0.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", - "peer": true, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">= 0.6" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "license": "MIT", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" + "punycode": "^2.1.0" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "node_modules/uri-template": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uri-template/-/uri-template-2.0.0.tgz", + "integrity": "sha512-r/i44nPoo0ktEZDjx+hxp9PSjQuBBfsd6RgCRuuMqCP0FZEp+YE0SpihThI4UGc5ePqQEFsdyZc7UVlowp+LLw==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "pct-encode": "~1.0.0" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "license": "MIT" + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4" } }, - "node_modules/typed-array-length": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", - "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "for-each": "^0.3.5", - "gopd": "^1.2.0", - "is-typed-array": "^1.1.15", - "possible-typed-array-names": "^1.1.0", - "reflect.getprototypeof": "^1.0.10" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.4.0" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "peer": true + "bin": { + "uuid": "dist/bin/uuid" + } }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "uvu": "bin.js" }, "engines": { - "node": ">=14.17" + "node": ">=8" } }, - "node_modules/typescript-json-schema": { - "version": "0.67.4", - "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.67.4.tgz", - "integrity": "sha512-BhDCVfwGtPKKt9JOBvh6ocmSbEk7ftx7dpqqIpvGNrjzYcUKm8pnYwKSFfNJwqcp/qNTfZr9sKtVyTxx4V9iRA==", + "node_modules/uvu/node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "dev": true, "license": "BSD-3-Clause", - "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "license": "ISC", "dependencies": { - "@types/json-schema": "^7.0.15", - "@types/node": "^24.10.2", - "glob": "^13.0.6", - "path-equal": "^1.2.5", - "safe-stable-stringify": "^2.5.0", - "ts-node": "^10.9.2", - "typescript": "~5.9.3", - "vm2": "^3.11.3", - "yargs": "^18.0.0" - }, - "bin": { - "typescript-json-schema": "bin/typescript-json-schema" + "builtins": "^1.0.3" } }, - "node_modules/typescript-json-schema/node_modules/@types/node": { - "version": "24.13.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", - "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", - "license": "MIT", - "peer": true, + "node_modules/validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate.io-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==", + "dev": true + }, + "node_modules/validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", + "dev": true, "dependencies": { - "undici-types": "~7.18.0" + "validate.io-number": "^1.0.3" } }, - "node_modules/typescript-json-schema/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node_modules/validate.io-integer-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", + "dev": true, + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-integer": "^1.0.4" } }, - "node_modules/typescript-json-schema/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "peer": true, "engines": { - "node": "18 || 20 || >=22" + "node": ">= 0.8" } }, - "node_modules/typescript-json-schema/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], "license": "MIT", - "peer": true, "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/typescript-json-schema/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "license": "ISC", - "peer": true, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" }, - "engines": { - "node": ">=20" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/typescript-json-schema/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "node_modules/vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "dev": true, "license": "MIT", - "peer": true - }, - "node_modules/typescript-json-schema/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/typescript-json-schema/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "peer": true, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript-json-schema/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/typescript-json-schema/node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/typescript-json-schema/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=18" + "node": "^18.0.0 || >=20.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/typescript-json-schema/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/vite-node": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", + "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-regex": "^6.2.2" + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" }, "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/typescript-json-schema/node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "license": "MIT", - "peer": true + "node_modules/vite/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" }, - "node_modules/typescript-json-schema/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "node_modules/vite/node_modules/rollup": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=18" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", + "fsevents": "~2.3.2" } }, - "node_modules/typescript-json-schema/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "node_modules/vitest": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", + "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" + "@vitest/expect": "1.6.1", + "@vitest/runner": "1.6.1", + "@vitest/snapshot": "1.6.1", + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.1", + "@vitest/ui": "1.6.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "node_modules/typescript-json-schema/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", - "peer": true, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node_modules/vitest/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "node_modules/vm2": { + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.11.5.tgz", + "integrity": "sha512-RSrkBiwrj6FRU+QdqNs6KG0XdlvJCjpQ4GXiqmMbrhmwfu5k/XIMpAer0L8f6iuf0uJ3a4T1xJN126Q8yf0VIA==", "dev": true, - "license": "MIT" - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" + "acorn": "^8.15.0", + "acorn-walk": "^8.3.4" }, - "engines": { - "node": ">= 0.4" + "bin": { + "vm2": "bin/vm2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz", - "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==", - "license": "MIT", "engines": { - "node": ">=20.18.1" + "node": ">=6.0" } }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" + "xml-name-validator": "^5.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=18" } }, - "node_modules/unist-util-generated": { + "node_modules/web-namespaces": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true, "license": "MIT", - "peer": true, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, "license": "MIT", - "peer": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { - "@types/unist": "^2.0.0" + "isexe": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "license": "MIT", - "peer": true, "dependencies": { - "@types/unist": "^2.0.0" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "license": "MIT", - "peer": true, "dependencies": { - "@types/unist": "^2.0.0" + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "license": "MIT", - "peer": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "license": "MIT", - "peer": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/universal-github-app-jwt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz", - "integrity": "sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/jsonwebtoken": "^9.0.0", - "jsonwebtoken": "^9.0.2" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "license": "ISC", - "peer": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "peer": true, + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=8" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "peer": true, "dependencies": { - "punycode": "^2.1.0" + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" } }, - "node_modules/uri-template": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uri-template/-/uri-template-2.0.0.tgz", - "integrity": "sha512-r/i44nPoo0ktEZDjx+hxp9PSjQuBBfsd6RgCRuuMqCP0FZEp+YE0SpihThI4UGc5ePqQEFsdyZc7UVlowp+LLw==", + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "pct-encode": "~1.0.0" - } - }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", - "license": "MIT" - }, - "node_modules/use-memo-one": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", - "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", - "license": "MIT", - "peer": true, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peer": true, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT", - "peer": true - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "node_modules/winston/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/winston/node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4.0" + "node": ">=10" } }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/uvu/node_modules/diff": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", - "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.3.1" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", - "peer": true - }, - "node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "license": "ISC", "dependencies": { - "builtins": "^1.0.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/validate.io-array": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", - "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", - "license": "MIT", - "peer": true + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, - "node_modules/validate.io-function": { + "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", - "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==", - "peer": true + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, - "node_modules/validate.io-integer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", - "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", - "peer": true, - "dependencies": { - "validate.io-number": "^1.0.3" + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/validate.io-integer-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", - "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", - "peer": true, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", "dependencies": { - "validate.io-array": "^1.0.3", - "validate.io-integer": "^1.0.4" + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/validate.io-number": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", - "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==", - "peer": true - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } ], "license": "MIT", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=0.4" } }, - "node_modules/vfile-location": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", - "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/unist": "^2.0.0", - "vfile": "^5.0.0" + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/eemeli" } }, - "node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=12" } }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz", + "integrity": "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" + "pend": "~1.2.0" }, "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=12" } }, - "node_modules/vite-node": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", - "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", + "node_modules/yn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-4.0.0.tgz", + "integrity": "sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg==", "dev": true, "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite/node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "node_modules/zen-observable": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.10.0.tgz", + "integrity": "sha512-iI3lT0iojZhKwT5DaFy2Ce42n3yFcLdFyOh01G7H0flMY60P8MJuVFEoJoNwXlmAyQ45GrjL6AcZmmlv8A5rbw==", "dev": true, "license": "MIT" }, - "node_modules/vite/node_modules/rollup": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", - "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "node_modules/zip-stream": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.2.tgz", + "integrity": "sha512-LfOdrUvPB8ZoXtvOBz6DlNClfvi//b5d56mSWyJi7XbH/HfhOHfUhOqxhT/rUiR7yiktlunqRo+jY6y/cWC/5g==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" + "archiver-utils": "^4.0.1", + "compress-commons": "^5.0.1", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.61.1", - "@rollup/rollup-android-arm64": "4.61.1", - "@rollup/rollup-darwin-arm64": "4.61.1", - "@rollup/rollup-darwin-x64": "4.61.1", - "@rollup/rollup-freebsd-arm64": "4.61.1", - "@rollup/rollup-freebsd-x64": "4.61.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", - "@rollup/rollup-linux-arm-musleabihf": "4.61.1", - "@rollup/rollup-linux-arm64-gnu": "4.61.1", - "@rollup/rollup-linux-arm64-musl": "4.61.1", - "@rollup/rollup-linux-loong64-gnu": "4.61.1", - "@rollup/rollup-linux-loong64-musl": "4.61.1", - "@rollup/rollup-linux-ppc64-gnu": "4.61.1", - "@rollup/rollup-linux-ppc64-musl": "4.61.1", - "@rollup/rollup-linux-riscv64-gnu": "4.61.1", - "@rollup/rollup-linux-riscv64-musl": "4.61.1", - "@rollup/rollup-linux-s390x-gnu": "4.61.1", - "@rollup/rollup-linux-x64-gnu": "4.61.1", - "@rollup/rollup-linux-x64-musl": "4.61.1", - "@rollup/rollup-openbsd-x64": "4.61.1", - "@rollup/rollup-openharmony-arm64": "4.61.1", - "@rollup/rollup-win32-arm64-msvc": "4.61.1", - "@rollup/rollup-win32-ia32-msvc": "4.61.1", - "@rollup/rollup-win32-x64-gnu": "4.61.1", - "@rollup/rollup-win32-x64-msvc": "4.61.1", - "fsevents": "~2.3.2" + "node": ">= 12.0.0" } }, - "node_modules/vitest": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", - "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", - "dev": true, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "dependencies": { - "@vitest/expect": "1.6.1", - "@vitest/runner": "1.6.1", - "@vitest/snapshot": "1.6.1", - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.1", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, "funding": { - "url": "https://opencollective.com/vitest" - }, + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.1", - "@vitest/ui": "1.6.1", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } + "zod": "^3.25.28 || ^4" } }, - "node_modules/vitest/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" } }, - "node_modules/vm2": { - "version": "3.11.5", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.11.5.tgz", - "integrity": "sha512-RSrkBiwrj6FRU+QdqNs6KG0XdlvJCjpQ4GXiqmMbrhmwfu5k/XIMpAer0L8f6iuf0uJ3a4T1xJN126Q8yf0VIA==", + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/api-grade-core": { + "name": "@dawmatt/api-grade-core", + "version": "0.1.20", "license": "MIT", - "peer": true, "dependencies": { - "acorn": "^8.15.0", - "acorn-walk": "^8.3.4" + "@stoplight/spectral-core": "^1.23.0", + "@stoplight/spectral-formats": "^1.8.3", + "@stoplight/spectral-parsers": "^1.0.5", + "@stoplight/spectral-ruleset-bundler": "^1.7.0", + "@stoplight/spectral-rulesets": "^1.22.4", + "@stoplight/yaml": "^4.3.0", + "chalk": "^5.3.0" }, - "bin": { - "vm2": "bin/vm2" + "devDependencies": { + "@types/node": "^20.12.0", + "@vitest/coverage-v8": "^1.6.0", + "typescript": "^5.4.5", + "vitest": "^1.6.0" }, "engines": { - "node": ">=6.0" + "node": ">=20.0.0" } }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, + "packages/api-grade-mcp": { + "name": "@dawmatt/api-grade-mcp", + "version": "0.1.0", "license": "MIT", "dependencies": { - "xml-name-validator": "^5.0.0" + "@azure/msal-node": "^2.16.2", + "@dawmatt/api-grade-core": "*", + "@modelcontextprotocol/sdk": "^1.0.0", + "zod": "^3.22.0" + }, + "bin": { + "api-grade-mcp": "dist/index.js" + }, + "devDependencies": { + "@types/node": "^20.12.0", + "@vitest/coverage-v8": "^1.6.0", + "typescript": "^5.4.5", + "vitest": "^1.6.0" }, "engines": { - "node": ">=18" + "node": ">=20.0.0" } }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "packages/api-grade-mcp/node_modules/@azure/msal-common": { + "version": "14.16.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.1.tgz", + "integrity": "sha512-nyxsA6NA4SVKh5YyRpbSXiMr7oQbwark7JU9LMeg6tJYTSPyAGkdx61wPT4gyxZfxlSxMMEyAsWaubBlNyIa1w==", "license": "MIT", - "peer": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, + "packages/api-grade-mcp/node_modules/@azure/msal-node": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.3.tgz", + "integrity": "sha512-CO+SE4weOsfJf+C5LM8argzvotrXw252/ZU6SM2Tz63fEblhH1uuVaaO4ISYFuN4Q6BhTo7I3qIdi8ydUQCqhw==", "license": "MIT", + "dependencies": { + "@azure/msal-common": "14.16.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, "engines": { - "node": ">=20" + "node": ">=16" } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "packages/api-grade-mcp/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", + "packages/backstage-plugin-api-grade": { + "name": "@dawmatt/backstage-plugin-api-grade", + "version": "0.1.20", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "@dawmatt/api-grade-core": "*" }, - "bin": { - "node-which": "bin/node-which" + "devDependencies": { + "@backstage/core-components": "^0.14.0", + "@backstage/core-plugin-api": "^1.0.0", + "@backstage/plugin-catalog-react": "^1.0.0", + "@dawmatt/backstage-plugin-api-grade-backend": "*", + "@testing-library/dom": "^10.4.1", + "@testing-library/react": "^16.3.2", + "@types/node": "^20.12.0", + "@types/react": "^18.0.0", + "@vitejs/plugin-react": "^4.0.0", + "@vitest/coverage-v8": "^1.6.0", + "jsdom": "^29.1.1", + "react": "^18", + "react-dom": "^18", + "typescript": "^5.4.5", + "vitest": "^1.6.0" }, "engines": { - "node": ">= 8" + "node": ">=20.0.0" + }, + "peerDependencies": { + "@backstage/core-components": "^0.14.0", + "@backstage/core-plugin-api": "^1.0.0", + "@backstage/plugin-catalog-react": "^1.0.0", + "react": "^18", + "react-dom": "^18" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "packages/backstage-plugin-api-grade-backend": { + "name": "@dawmatt/backstage-plugin-api-grade-backend", + "version": "0.1.20", "license": "MIT", "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" + "@dawmatt/api-grade-core": "*", + "express": "^4.18.0" + }, + "devDependencies": { + "@backstage/backend-plugin-api": "^0.6.0", + "@backstage/catalog-client": "^1.0.0", + "@types/express": "^4.17.0", + "@types/node": "^20.12.0", + "@vitest/coverage-v8": "^1.6.0", + "typescript": "^5.4.5", + "vitest": "^1.6.0" }, "engines": { - "node": ">= 0.4" + "node": ">=20.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@backstage/backend-plugin-api": "^0.6.0", + "@backstage/catalog-client": "^1.0.0" } }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "license": "MIT", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/@backstage/core-components/-/core-components-0.14.10.tgz", + "integrity": "sha512-RAEIQsJimokQDF0eAuRXSZreo2vjhf4a2tlMbi/edPRaGk4nTOHH7q6V7qLqqX9spTzS0bBAhkuif/v96shJuw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" + "@backstage/config": "^1.2.0", + "@backstage/core-plugin-api": "^1.9.3", + "@backstage/errors": "^1.2.4", + "@backstage/theme": "^0.5.6", + "@backstage/version-bridge": "^1.0.8", + "@date-io/core": "^1.3.13", + "@material-table/core": "^3.1.0", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "4.0.0-alpha.61", + "@react-hookz/web": "^24.0.0", + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "@types/react-sparklines": "^1.7.0", + "ansi-regex": "^6.0.1", + "classnames": "^2.2.6", + "d3-selection": "^3.0.0", + "d3-shape": "^3.0.0", + "d3-zoom": "^3.0.0", + "dagre": "^0.8.5", + "linkify-react": "4.1.3", + "linkifyjs": "4.1.3", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.9.4", + "rc-progress": "3.5.1", + "react-helmet": "6.1.0", + "react-hook-form": "^7.12.2", + "react-idle-timer": "5.7.2", + "react-markdown": "^8.0.0", + "react-sparklines": "^1.7.0", + "react-syntax-highlighter": "^15.4.5", + "react-use": "^17.3.2", + "react-virtualized-auto-sizer": "^1.0.11", + "react-window": "^1.8.6", + "remark-gfm": "^3.0.1", + "zen-observable": "^0.10.0", + "zod": "^3.22.4" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + } + }, + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@backstage/theme": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@backstage/theme/-/theme-0.5.7.tgz", + "integrity": "sha512-XztEKnNot3DA4BuLZJocbSYvpYpWm/OF9PP7nOk9pJ4Jg4YIrEzZxOxPorOp7r/UhZhLwnqneIV3RcFBhOt9BA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@mui/material": "^5.12.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@material-ui/core": "^4.12.2", + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" } }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-table/core": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@material-table/core/-/core-3.2.5.tgz", + "integrity": "sha512-TmVN/In15faabezW3COb4Ve5+YhqxFEQnf2Q2Cz3FVXXCFqJvtu3pkRLi+7N9UJ5bvistszz6wfHeiZZY1Rf9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@date-io/date-fns": "^1.3.13", + "@material-ui/pickers": "^3.2.10", + "@material-ui/styles": "^4.11.4", + "classnames": "^2.2.6", + "date-fns": "^2.16.1", + "debounce": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "prop-types": "^15.7.2", + "react-beautiful-dnd": "^13.0.0", + "react-double-scrollbar": "0.0.15", + "uuid": "^3.4.0" + }, + "peerDependencies": { + "@date-io/core": "^1.3.13", + "@material-ui/core": "^4.11.2", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/pickers": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@material-ui/pickers/-/pickers-3.3.11.tgz", + "integrity": "sha512-pDYjbjUeabapijS2FpSwK/ruJdk7IGeAshpLbKDa3PRRKRy7Nv6sXxAvUg2F+lID/NwUKgBmCYS5bzrl7Xxqzw==", + "deprecated": "This package no longer supported. It has been relaced by @mui/x-date-pickers", + "dev": true, "license": "MIT", "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" + "@babel/runtime": "^7.6.0", + "@date-io/core": "1.x", + "@types/styled-jsx": "^2.2.8", + "clsx": "^1.0.2", + "react-transition-group": "^4.0.0", + "rifm": "^0.7.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@date-io/core": "^1.3.6", + "@material-ui/core": "^4.0.0", + "prop-types": "^15.6.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/which-typed-array": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", - "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" }, "engines": { - "node": ">= 0.4" + "node": ">=8.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" + "type": "opencollective", + "url": "https://opencollective.com/material-ui" }, - "bin": { - "why-is-node-running": "cli.js" + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/winston": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", - "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/@material-ui/styles/node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.8", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-table/core/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true, + "license": "MIT" + }, + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" }, "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "node": ">=8.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/winston/node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" }, "engines": { - "node": ">=8" + "node": ">=8.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-ui/core/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true, + "license": "MIT" }, - "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-ui/icons": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", + "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4" + }, "engines": { - "node": ">=10.0.0" + "node": ">=8.0.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "@material-ui/core": "^4.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" }, "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "@types/react": { "optional": true } } }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-ui/lab": { + "version": "4.0.0-alpha.61", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", + "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "is-wsl": "^3.1.0" + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" }, "engines": { - "node": ">=18" + "node": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@material-ui/core": "^4.12.1", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@material-ui/lab/node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, "engines": { - "node": ">=18" + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/xml-naming": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", - "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/@types/react": { + "version": "17.0.93", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.93.tgz", + "integrity": "sha512-KM4Ty/ZTLZupiYxZVAlP+InNJS3De6uBMdq0ePa6/04+eG9Y7ftnWfst1xTLQ5rwAhgHwQ4momt/O4KepdGBTw==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=16.0.0" + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "^0.16", + "csstype": "^3.2.2" } }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "dev": true, - "license": "MIT" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "license": "MIT", - "peer": true, "engines": { - "node": ">=0.4" + "node": ">=6" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } + "packages/backstage-plugin-api-grade/node_modules/@backstage/core-components/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC", - "peer": true + "packages/backstage-plugin-api-grade/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "dev": true, + "license": "MIT" }, - "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "license": "ISC", - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, + "packages/backstage-plugin-api-grade/node_modules/@mui/core-downloads-tracker": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", + "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", + "dev": true, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/eemeli" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "packages/backstage-plugin-api-grade/node_modules/@mui/material": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", + "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.18.0", + "@mui/system": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz", - "integrity": "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==", - "license": "MIT", - "peer": true, - "dependencies": { - "pend": "~1.2.0" + "node": ">=12.0.0" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-4.0.0.tgz", - "integrity": "sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } } }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "packages/backstage-plugin-api-grade/node_modules/@mui/material/node_modules/@mui/system": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", + "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, "engines": { - "node": ">=12.20" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } } }, - "node_modules/zen-observable": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.10.0.tgz", - "integrity": "sha512-iI3lT0iojZhKwT5DaFy2Ce42n3yFcLdFyOh01G7H0flMY60P8MJuVFEoJoNwXlmAyQ45GrjL6AcZmmlv8A5rbw==", - "license": "MIT", - "peer": true - }, - "node_modules/zip-stream": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.2.tgz", - "integrity": "sha512-LfOdrUvPB8ZoXtvOBz6DlNClfvi//b5d56mSWyJi7XbH/HfhOHfUhOqxhT/rUiR7yiktlunqRo+jY6y/cWC/5g==", + "packages/backstage-plugin-api-grade/node_modules/@mui/material/node_modules/@mui/system/node_modules/@mui/private-theming": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", + "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "archiver-utils": "^4.0.1", - "compress-commons": "^5.0.1", - "readable-stream": "^3.6.0" + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.17.1", + "prop-types": "^15.8.1" }, "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "peer": true, + "node": ">=12.0.0" + }, "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", - "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", - "license": "ISC", - "peer": true, + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, "peerDependencies": { - "zod": "^3.25.28 || ^4" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "packages/backstage-plugin-api-grade/node_modules/@mui/material/node_modules/@mui/system/node_modules/@mui/styled-engine": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", + "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, "engines": { - "node": ">=18.0.0" + "node": ">=12.0.0" }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "peer": true, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } } }, - "packages/api-grade-core": { - "version": "0.1.0", + "packages/backstage-plugin-api-grade/node_modules/@mui/material/node_modules/@mui/types": { + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "dev": true, "license": "MIT", - "dependencies": { - "@stoplight/spectral-core": "^1.23.0", - "@stoplight/spectral-formats": "^1.8.3", - "@stoplight/spectral-parsers": "^1.0.5", - "@stoplight/spectral-ruleset-bundler": "^1.7.0", - "@stoplight/spectral-rulesets": "^1.22.4", - "@stoplight/yaml": "^4.3.0", - "chalk": "^5.3.0" - }, - "devDependencies": { - "@types/node": "^20.12.0", - "@vitest/coverage-v8": "^1.6.0", - "typescript": "^5.4.5", - "vitest": "^1.6.0" + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, - "engines": { - "node": ">=20.0.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "packages/backstage-plugin-api-grade": { - "version": "0.1.0", + "packages/backstage-plugin-api-grade/node_modules/@mui/material/node_modules/@mui/utils": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", + "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "dev": true, "license": "MIT", "dependencies": { - "api-grade-core": "*" - }, - "devDependencies": { - "@testing-library/dom": "^10.4.1", - "@testing-library/react": "^16.3.2", - "@types/node": "^20.12.0", - "@types/react": "^18.0.0", - "@vitest/coverage-v8": "^1.6.0", - "jsdom": "^29.1.1", - "typescript": "^5.4.5", - "vitest": "^1.6.0" + "@babel/runtime": "^7.23.9", + "@mui/types": "~7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" }, "engines": { - "node": ">=20.0.0" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@backstage/core-plugin-api": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.0.0", - "react": "^18" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "packages/backstage-plugin-api-grade-backend": { - "version": "0.1.0", + "packages/backstage-plugin-api-grade/node_modules/linkify-react": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/linkify-react/-/linkify-react-4.1.3.tgz", + "integrity": "sha512-rhI3zM/fxn5BfRPHfi4r9N7zgac4vOIxub1wHIWXLA5ENTMs+BGaIaFO1D1PhmxgwhIKmJz3H7uCP0Dg5JwSlA==", + "dev": true, "license": "MIT", - "dependencies": { - "api-grade-core": "*", - "express": "^4.18.0" - }, - "devDependencies": { - "@types/express": "^4.17.0", - "@types/node": "^20.12.0", - "@vitest/coverage-v8": "^1.6.0", - "typescript": "^5.4.5", - "vitest": "^1.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, "peerDependencies": { - "@backstage/backend-plugin-api": "^0.6.0", - "@backstage/catalog-client": "^1.0.0" + "linkifyjs": "^4.0.0", + "react": ">= 15.0.0" + } + }, + "packages/backstage-plugin-api-grade/node_modules/linkifyjs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz", + "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==", + "dev": true, + "license": "MIT" + }, + "packages/backstage-plugin-api-grade/node_modules/react-is": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, + "license": "MIT" + }, + "packages/backstage-plugin-api-grade/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" } } } diff --git a/packages/api-grade-mcp/README.md b/packages/api-grade-mcp/README.md index 586749f..66aae34 100644 --- a/packages/api-grade-mcp/README.md +++ b/packages/api-grade-mcp/README.md @@ -62,7 +62,7 @@ Create `.vscode/mcp.json` in your project root: | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | | `grade-api-quick-fixes-only` | Classified list of quick fixes (safe, non-breaking improvements) for AI-assisted correction | | `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | -| `get-ruleset-config` | Show the active ruleset configuration and which scope is effective | +| `get-ruleset-config` | Get the active Spectral ruleset and which scope is effective | ## Usage Examples diff --git a/packages/api-grade-mcp/src/tools/get-ruleset-config.ts b/packages/api-grade-mcp/src/tools/get-ruleset-config.ts index 4b77dcc..4fa3fb3 100644 --- a/packages/api-grade-mcp/src/tools/get-ruleset-config.ts +++ b/packages/api-grade-mcp/src/tools/get-ruleset-config.ts @@ -12,7 +12,7 @@ function sanitizeAuth(auth: AuthConfig | null | undefined, hasToken: boolean): R export function registerGetRulesetConfigTool(server: McpServer, sessionState: SessionState): void { server.tool( 'get-ruleset-config', - 'Return the active ruleset configuration at every scope (session, workspace, global), indicate which scope is currently in effect (the effective ruleset), and show the full resolution chain. Use this to diagnose why a particular ruleset is being applied or to confirm a set-ruleset-config call took effect.', + 'Return the active Spectral ruleset used by this MCP server when no rulesetPath is supplied on a grading request. Supports three scopes: session (in-memory, resets on server restart), workspace (persisted in workspace), and global (persisted to home). Return configuration at every scope, indicate which scope is currently in effect (the effective ruleset), and show the full resolution chain. Use this to diagnose why a particular ruleset is being applied or to confirm a set-ruleset-config call took effect.', {}, async () => { const workspaceConfig = await loadWorkspaceConfig(); diff --git a/packages/api-grade-mcp/src/tools/set-ruleset-config.ts b/packages/api-grade-mcp/src/tools/set-ruleset-config.ts index e902650..fe5f3b0 100644 --- a/packages/api-grade-mcp/src/tools/set-ruleset-config.ts +++ b/packages/api-grade-mcp/src/tools/set-ruleset-config.ts @@ -13,7 +13,7 @@ import type { SessionState, RulesetConfig, AuthConfig } from '../types.js'; export function registerSetRulesetConfigTool(server: McpServer, sessionState: SessionState): void { server.tool( 'set-ruleset-config', - 'Set the default ruleset used by this MCP server when no rulesetPath is supplied on a grading request. Supports three scopes: session (in-memory, resets on server restart), workspace (persisted to .api-grade/config.json in the workspace root), and global (persisted to ~/.api-grade/config.json). Optionally configure authentication for rulesets hosted in secured locations.', + 'Set the default Spectral ruleset used by this MCP server when no rulesetPath is supplied on a grading request. Supports three scopes: session (in-memory, resets on server restart), workspace (persisted to .api-grade/config.json in the workspace root), and global (persisted to ~/.api-grade/config.json). Optionally configure authentication for rulesets hosted in secured locations.', { scope: z .enum(['session', 'workspace', 'global']) diff --git a/specs/007-ai-support/contracts/mcp-tools.md b/specs/007-ai-support/contracts/mcp-tools.md index 8d5a859..27e007d 100644 --- a/specs/007-ai-support/contracts/mcp-tools.md +++ b/specs/007-ai-support/contracts/mcp-tools.md @@ -361,7 +361,7 @@ Response confirms the scope was cleared and which scope will now take effect. ## Tool 6: `get-ruleset-config` -**Purpose**: Return the active ruleset configuration at every scope (session, workspace, global), indicate which scope is currently in effect (the effective ruleset), and show the full resolution chain. Use this to diagnose why a particular ruleset is being applied or to confirm a `set-ruleset-config` call took effect. +**Purpose**: Return the default Spectral ruleset used by this MCP server when no `rulesetPath` is supplied on a grading request. Supports three scopes: `session` (in-memory, resets on server restart), `workspace` (persisted to workspace), and `global` (persisted to home).Return configuration at every scope, indicate which scope is currently in effect (the effective ruleset), and show the full resolution chain. Use this to diagnose why a particular ruleset is being applied or to confirm a `set-ruleset-config` call took effect. **Input Schema**: diff --git a/specs/007-ai-support/quickstart.md b/specs/007-ai-support/quickstart.md index 065d9f3..fb50d56 100644 --- a/specs/007-ai-support/quickstart.md +++ b/specs/007-ai-support/quickstart.md @@ -153,7 +153,7 @@ Once configured, the AI tool has access to six api-grade capabilities: | `assert-api-grade` | Pass/fail assertion for a minimum grade threshold | | `grade-api-quick-fixes-only` | Classified list of fixable violations for AI-assisted correction | | `set-ruleset-config` | Set the default Spectral ruleset at session, workspace, or global scope | -| `get-ruleset-config` | Show the active ruleset configuration at all scopes | +| `get-ruleset-config` | Get the active Spectral ruleset and which scope is effective | --- @@ -223,9 +223,9 @@ The AI calls `set-ruleset-config` with `scope: "global"`. The setting is saved t ### Checking the active configuration -> Show me the current ruleset configuration +> Show me the current Spectral ruleset being used -The AI calls `get-ruleset-config` and returns which ruleset is active at every scope and which one is currently in effect. +The AI calls `get-ruleset-config` and returns which Spectral ruleset is active at every scope and which one is currently in effect. ### Precedence order diff --git a/yarn.lock b/yarn.lock index 7863920..47412d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.2.1": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -12,7 +12,7 @@ "@asamuzakjp/css-color@^5.1.11": version "5.1.11" - resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-5.1.11.tgz#28a0aac8220a4cc19045ac3bd9a813d4060bd375" + resolved "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz" integrity sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg== dependencies: "@asamuzakjp/generational-cache" "^1.0.1" @@ -23,7 +23,7 @@ "@asamuzakjp/dom-selector@^7.1.1": version "7.1.1" - resolved "https://registry.yarnpkg.com/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz#01880086bb2490098f167beb58555da1a6c9adbd" + resolved "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz" integrity sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ== dependencies: "@asamuzakjp/generational-cache" "^1.0.1" @@ -34,24 +34,24 @@ "@asamuzakjp/generational-cache@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz#3d0bf6be4fc059851390a7070720c6007af793ec" + resolved "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz" integrity sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg== "@asamuzakjp/nwsapi@^2.3.9": version "2.3.9" - resolved "https://registry.yarnpkg.com/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz#ad5549322dfe9d153d4b4dd6f7ff2ae234b06e24" + resolved "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz" integrity sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q== "@asyncapi/specs@^6.8.0": version "6.11.1" - resolved "https://registry.yarnpkg.com/@asyncapi/specs/-/specs-6.11.1.tgz#c629fe962a241a983f883a56b0e9c901a311becb" + resolved "https://registry.npmjs.org/@asyncapi/specs/-/specs-6.11.1.tgz" integrity sha512-A3WBLqAKGoJ2+6FWFtpjBlCQ1oFCcs4GxF7zsIGvNqp/klGUHjlA3aAcZ9XMMpLGE8zPeYDz2x9FmO6DSuKraQ== dependencies: "@types/json-schema" "^7.0.11" "@aws-crypto/crc32@5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" + resolved "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz" integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== dependencies: "@aws-crypto/util" "^5.2.0" @@ -60,7 +60,7 @@ "@aws-crypto/crc32c@5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz#4e34aab7f419307821509a98b9b08e84e0c1917e" + resolved "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz" integrity sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag== dependencies: "@aws-crypto/util" "^5.2.0" @@ -69,7 +69,7 @@ "@aws-crypto/sha1-browser@5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz#b0ee2d2821d3861f017e965ef3b4cb38e3b6a0f4" + resolved "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz" integrity sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg== dependencies: "@aws-crypto/supports-web-crypto" "^5.2.0" @@ -81,7 +81,7 @@ "@aws-crypto/sha256-browser@5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz" integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== dependencies: "@aws-crypto/sha256-js" "^5.2.0" @@ -92,9 +92,9 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" -"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": +"@aws-crypto/sha256-js@^5.2.0", "@aws-crypto/sha256-js@5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz" integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== dependencies: "@aws-crypto/util" "^5.2.0" @@ -103,14 +103,14 @@ "@aws-crypto/supports-web-crypto@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + resolved "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz" integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== dependencies: tslib "^2.6.2" -"@aws-crypto/util@5.2.0", "@aws-crypto/util@^5.2.0": +"@aws-crypto/util@^5.2.0", "@aws-crypto/util@5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" + resolved "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz" integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== dependencies: "@aws-sdk/types" "^3.222.0" @@ -118,53 +118,53 @@ tslib "^2.6.2" "@aws-sdk/abort-controller@^3.347.0": - version "3.374.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.374.0.tgz#f57ec7e02cdd7f66432e4e71af9e0ac224d6e9b3" - integrity sha512-pO1pqFBdIF28ZvnJmg58Erj35RLzXsTrjvHghdc/xgtSvodFFCNrUsPg6AP3On8eiw9elpHoS4P8jMx1pHDXEw== + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.370.0.tgz" + integrity sha512-/W4arzC/+yVW/cvEXbuwvG0uly4yFSZnnIA+gkqgAm+0HVfacwcPpNf4BjyxjnvIdh03l7w2DriF6MlKUfiQ3A== dependencies: - "@smithy/abort-controller" "^1.0.1" + "@aws-sdk/types" "3.370.0" tslib "^2.5.0" -"@aws-sdk/checksums@^3.1000.6": - version "3.1000.6" - resolved "https://registry.yarnpkg.com/@aws-sdk/checksums/-/checksums-3.1000.6.tgz#77ba636934de36f652649c633e9bb5413da8a464" - integrity sha512-RMCrCteiUwYTEv2G9zfP/BEuKHv57665vVieJyp9cf8VgilWxP/KrWVtMdfdDlIH8nFhvu3rIMc29z3ebGEZ1w== +"@aws-sdk/checksums@^3.1000.5": + version "3.1000.5" + resolved "https://registry.npmjs.org/@aws-sdk/checksums/-/checksums-3.1000.5.tgz" + integrity sha512-zOXUUnilC6lgCsQtp77p/QNPmRlTES9Xi6tlDwbR6kfC/kz5PCzZckgHWm5z+8DskdwuMAbFDq61x3zr10GEEQ== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" "@aws-crypto/util" "5.2.0" - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" "@aws-sdk/client-codecommit@^3.350.0": - version "3.1070.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-codecommit/-/client-codecommit-3.1070.0.tgz#db1ba99601c9b41e93a17af847b4e0e4e5d8926c" - integrity sha512-V1mvn2bXkLAOE4SBgHb573mFp/EhbTkZgyGun09haS3bc1Q9aAZhOLi6E7bGK2wF3KkgVpF1TSqvrgnhMRdXeg== + version "3.1068.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-codecommit/-/client-codecommit-3.1068.0.tgz" + integrity sha512-2g2icHFmbjvDzzlVpKS3BG+4rL5K4tXlzZG6DwEQo+v+DxpKHR+EjxIOgpOlT4y0esVehuWdk9Xv2/N2ZyyTjQ== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/credential-provider-node" "^3.972.56" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/credential-provider-node" "^3.972.55" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/fetch-http-handler" "^5.4.6" "@smithy/node-http-handler" "^4.7.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/client-cognito-identity@3.1070.0": - version "3.1070.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1070.0.tgz#c995556774bebd9117af5f3bfaec10573c338034" - integrity sha512-Xca8Ay6hguFCtQ7ZoNwBVDOmcKrOPBn0K3jq8QtBm5wI/YgJrw61ShH8TyaTtGOwdlOcTyAe32Kh6IOlq6kkYA== +"@aws-sdk/client-cognito-identity@3.1068.0": + version "3.1068.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1068.0.tgz" + integrity sha512-by2Qj3f9BI9X4cY0n160R3uzkMpI6k9PmGA8QLAuzr8HzkiNrYFygMEPhIEdqBFHQPD/8AXNUs45HYjEDsQ33g== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/credential-provider-node" "^3.972.56" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/credential-provider-node" "^3.972.55" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/fetch-http-handler" "^5.4.6" "@smithy/node-http-handler" "^4.7.6" @@ -172,19 +172,19 @@ tslib "^2.6.2" "@aws-sdk/client-s3@^3.350.0": - version "3.1070.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.1070.0.tgz#cc029f98b60021fd5c8b24da2ffb91460d52be4b" - integrity sha512-B/OUiCqGQ4Zr7v9gFFyiuitKN2c0PIgvOlQb5bYg1SM2y0F8a5JQ7FNsjRcl+d2PqYWLHwHx12CvZDyLn4KxIw== + version "3.1068.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1068.0.tgz" + integrity sha512-lFgaIpxZvloNbJvQ337YPdMXhzI2zJdDw13nATVGnkAGNoNPx4ksD84AQAcuW75hsaaMaIuNmXU9sSx6+FTirA== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/credential-provider-node" "^3.972.56" - "@aws-sdk/middleware-flexible-checksums" "^3.974.31" - "@aws-sdk/middleware-sdk-s3" "^3.972.52" - "@aws-sdk/signature-v4-multi-region" "^3.996.35" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/credential-provider-node" "^3.972.55" + "@aws-sdk/middleware-flexible-checksums" "^3.974.30" + "@aws-sdk/middleware-sdk-s3" "^3.972.51" + "@aws-sdk/signature-v4-multi-region" "^3.996.34" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/fetch-http-handler" "^5.4.6" "@smithy/node-http-handler" "^4.7.6" @@ -192,29 +192,29 @@ tslib "^2.6.2" "@aws-sdk/client-sts@^3.350.0": - version "3.1070.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.1070.0.tgz#dfa89698d2e00fe7fc12782328c2035982e5a69e" - integrity sha512-uX3eD0OxYbaHqbN8aaSzZTrNJUctfCus2NLMVHUSONrzlJdA/w4o5ZAfJhgnTjlfdfRMv1lZd2Wnqm8hlzmwGA== + version "3.1068.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.1068.0.tgz" + integrity sha512-WCUEpfdsSSO7zsXi7GUwHR+A5HZDQNsGktFJxOm73ZU+WLlBKRDzKdWZdYOpNkgBpXxy5KCeVMvXuaq2s1zn7w== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/credential-provider-node" "^3.972.56" - "@aws-sdk/signature-v4-multi-region" "^3.996.35" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/credential-provider-node" "^3.972.55" + "@aws-sdk/signature-v4-multi-region" "^3.996.34" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/fetch-http-handler" "^5.4.6" "@smithy/node-http-handler" "^4.7.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/core@^3.974.21": - version "3.974.21" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.974.21.tgz#bf173e6c3585dfc01e9ff6563ed12b6ad1bda330" - integrity sha512-P5JAHvn4dTi96UsAGS67LVOqqpUNNRhnfFXqzCYtdBIGZtqBue4CXvRr9YenOO7PALj/Pn8uuyw53FBCiCYw8w== +"@aws-sdk/core@^3.974.20": + version "3.974.20" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.20.tgz" + integrity sha512-7sDi2B2N3mc3nf1nz6FyEx/FCrJ1N1QnBmraHHQNabFaeAh2IaOOLml48/rHOD1bICHgTRkbBgNTvUzEr5Z35g== dependencies: - "@aws-sdk/types" "^3.973.13" - "@aws-sdk/xml-builder" "^3.972.30" + "@aws-sdk/types" "^3.973.12" + "@aws-sdk/xml-builder" "^3.972.29" "@aws/lambda-invoke-store" "^0.2.2" "@smithy/core" "^3.24.6" "@smithy/signature-v4" "^5.4.6" @@ -222,233 +222,241 @@ bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-cognito-identity@^3.972.46": - version "3.972.46" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.46.tgz#3d7bc664a2218074553dbfd48e1f633951370b94" - integrity sha512-xQ+zJxuP4MZGsr6TIVVgsLRsxaBu1YqOFNbZMaNskqbTF2d9F8ibBLOMFV1BkUBOvI6ShwhlNViOQcK1Od/RPg== +"@aws-sdk/credential-provider-cognito-identity@^3.972.45": + version "3.972.45" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.45.tgz" + integrity sha512-4L/REssieLON1hVsTzZucP1p2u5jmPNejyh/9BCGZXr93IalBbhRPCrtKIKwMTu9yRGr/bcKzhrQocByKLSzLQ== dependencies: - "@aws-sdk/nested-clients" "^3.997.21" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/nested-clients" "^3.997.20" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@^3.972.47": - version "3.972.47" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.47.tgz#1a1fdb32eae2750d9ab49cd615bd51f285552f30" - integrity sha512-3YoPwJczcc+MtX2xxXaYaOOWO6xKUJr1ZIIDIFuninr51BYONVVcF/CP8K2xfVRC/PztJjqKWxNGFH7BWQAw1Q== +"@aws-sdk/credential-provider-env@^3.972.46": + version "3.972.46" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.46.tgz" + integrity sha512-+GPXVS2srMOlH74S+SmC1gVuP2TvUZ0siuC0onKO93q+udP+M72dmY8wJfVQ5CX9z/9X5A1HHwz5yRIGBtskvQ== dependencies: - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@^3.972.49": - version "3.972.49" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.49.tgz#af9beb1597e98b57382b7cc1bdb314e8bc84bad0" - integrity sha512-2UtGUPy+x3lqyceHrtC1uEuVxBZbDalPF6KAFqBwYgm4edWdBrZKNnCqzDs7KynWUvEC6mrR+ojRk+ZgQz9C2w== +"@aws-sdk/credential-provider-http@^3.972.48": + version "3.972.48" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.48.tgz" + integrity sha512-fA5loSdlocacRxyUXtpoHSMuk5rsIKRDzQYVMnMxjcmFeZshaJlJ8lymy/hYKji6sne/UmNGj5pxuEs6kq/Qcg== dependencies: - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/fetch-http-handler" "^5.4.6" "@smithy/node-http-handler" "^4.7.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@^3.972.54": - version "3.972.54" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.54.tgz#57281b580804cd9801bcd40a40b1b5c8f4ffacae" - integrity sha512-Hx4gO4YRjFwitf3MVl3cDwYe1aryJthC4txVl9b+JAURovA50M2ywf9r8j1E/Q6SCTPT4qQpjOAbKYIC9CG+Vw== - dependencies: - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/credential-provider-env" "^3.972.47" - "@aws-sdk/credential-provider-http" "^3.972.49" - "@aws-sdk/credential-provider-login" "^3.972.53" - "@aws-sdk/credential-provider-process" "^3.972.47" - "@aws-sdk/credential-provider-sso" "^3.972.53" - "@aws-sdk/credential-provider-web-identity" "^3.972.53" - "@aws-sdk/nested-clients" "^3.997.21" - "@aws-sdk/types" "^3.973.13" +"@aws-sdk/credential-provider-ini@^3.972.53": + version "3.972.53" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.53.tgz" + integrity sha512-ZfdhIOR41q8TcWEnUac+gCOb+O2LBWdHLmjedXpXz4IEFW2ppNuFcm6p0sMTavpM+zD5TYfpH5Gp7guRyqSgsQ== + dependencies: + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/credential-provider-env" "^3.972.46" + "@aws-sdk/credential-provider-http" "^3.972.48" + "@aws-sdk/credential-provider-login" "^3.972.52" + "@aws-sdk/credential-provider-process" "^3.972.46" + "@aws-sdk/credential-provider-sso" "^3.972.52" + "@aws-sdk/credential-provider-web-identity" "^3.972.52" + "@aws-sdk/nested-clients" "^3.997.20" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/credential-provider-imds" "^4.3.7" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-login@^3.972.53": - version "3.972.53" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.53.tgz#cd61cb6e4656553f1728cb45caf60c7bc04d25f0" - integrity sha512-+71sluhkgPqdhbbD3UDwUpj24GCkng9HQx6z7qoBFb8dwkF4ktpOcVKDeHpgg8PvBgLYwAnUYLTEGRC/PniCiQ== +"@aws-sdk/credential-provider-login@^3.972.52": + version "3.972.52" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.52.tgz" + integrity sha512-9hu2oR0qH7Fst5Tzdx+UWxm+w5zCXtErTLtOOW5hwwQc170CLwOeniRxyFY6s9mHfGEfC5zFukNBdKBwJR8mhQ== dependencies: - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/nested-clients" "^3.997.21" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/nested-clients" "^3.997.20" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@^3.350.0", "@aws-sdk/credential-provider-node@^3.972.56": - version "3.972.56" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.56.tgz#8d040683a7c8bfb6d97fc5d2d133532ae503cf42" - integrity sha512-iI+4o0dvQQ4NHel4FMDiFy5q2gaU/ryLK3niOsoPccAt9WLFRkV4XTYPWRr9XvmBUqEzXG73S4p/8gm0Lu/W3A== - dependencies: - "@aws-sdk/credential-provider-env" "^3.972.47" - "@aws-sdk/credential-provider-http" "^3.972.49" - "@aws-sdk/credential-provider-ini" "^3.972.54" - "@aws-sdk/credential-provider-process" "^3.972.47" - "@aws-sdk/credential-provider-sso" "^3.972.53" - "@aws-sdk/credential-provider-web-identity" "^3.972.53" - "@aws-sdk/types" "^3.973.13" +"@aws-sdk/credential-provider-node@^3.350.0", "@aws-sdk/credential-provider-node@^3.972.55": + version "3.972.55" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.55.tgz" + integrity sha512-zMGLa/dhESVqmCD7mmIFFKSwSFrJGScvCXcjvBZEVOOMauFS5JRQvLTMukFpMEFWiV6dTAlsen2ATDBulLPtbg== + dependencies: + "@aws-sdk/credential-provider-env" "^3.972.46" + "@aws-sdk/credential-provider-http" "^3.972.48" + "@aws-sdk/credential-provider-ini" "^3.972.53" + "@aws-sdk/credential-provider-process" "^3.972.46" + "@aws-sdk/credential-provider-sso" "^3.972.52" + "@aws-sdk/credential-provider-web-identity" "^3.972.52" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/credential-provider-imds" "^4.3.7" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@^3.972.47": - version "3.972.47" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.47.tgz#bfc176edb72910264f39d6ebf2b16bdc91dbbd5f" - integrity sha512-tAizPm9IFo/PHn06c+LQJlzfY2AGOlyF0CUljFejrU6LcZBjnk8pmbZK3/xoIDdnIzjEdbClfvY3mXfr818ZEg== +"@aws-sdk/credential-provider-process@^3.972.46": + version "3.972.46" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.46.tgz" + integrity sha512-VUoNFBIjWrUN8NbFiQiuxQEgFjvziAlBRPK+ddh27aj65gk0BYu6bLZnrdrNZwpW6vAihtSUtEMQ1PUJ32QRPA== dependencies: - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@^3.972.53": - version "3.972.53" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.53.tgz#018bf9178299b749871d74b657bf1488af3d3bab" - integrity sha512-pUXE3fu4tfEDV8BksIgf4dXvuIH10FhwHMl/wu8rBD5T1sMpryQWFVitH3kdPS90wlgrGYJQ/meQTSPacyZfeg== +"@aws-sdk/credential-provider-sso@^3.972.52": + version "3.972.52" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.52.tgz" + integrity sha512-nb2/n4o/HQf+FVpVbZe9vCTFngmuDoIsltMgLAtjixaKzvzhB4J8WSDFyWgnErgLHk55ctWH+I4PU+LIHhyffg== dependencies: - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/nested-clients" "^3.997.21" - "@aws-sdk/token-providers" "3.1069.0" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/nested-clients" "^3.997.20" + "@aws-sdk/token-providers" "3.1066.0" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@^3.972.53": - version "3.972.53" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.53.tgz#830f7a598610f47c8424f9452f8d04d28ca1a066" - integrity sha512-JmMGlhVvSj8uSG9CpeDkJAXT35H89tc6v84iMgEIE75q4yp1MKVVKvopv6Gg28HJIR7hMNkojRF8H2m5W44wyg== +"@aws-sdk/credential-provider-web-identity@^3.972.52": + version "3.972.52" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.52.tgz" + integrity sha512-lKj6aRSGbqLmpYmM24bY7a1Xmfcq2vkE3hv8CSPYfc1yCu0BPu/XEJ1L4Fm61MsU6ULLNSG8UGsffNoFUBjESA== dependencies: - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/nested-clients" "^3.997.21" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/nested-clients" "^3.997.20" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" "@aws-sdk/credential-providers@^3.350.0": - version "3.1070.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.1070.0.tgz#5e02522a8977d48ccb39dcf4f572c61720c42059" - integrity sha512-dbRx4iWgJp9mavY7ErFw+I+IAgxrSZn/a9zog9H52R9m8rPiB8zCXO2FLuhVmQek7UJ4/YcB1bmvlJOOvEjWJw== - dependencies: - "@aws-sdk/client-cognito-identity" "3.1070.0" - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/credential-provider-cognito-identity" "^3.972.46" - "@aws-sdk/credential-provider-env" "^3.972.47" - "@aws-sdk/credential-provider-http" "^3.972.49" - "@aws-sdk/credential-provider-ini" "^3.972.54" - "@aws-sdk/credential-provider-login" "^3.972.53" - "@aws-sdk/credential-provider-node" "^3.972.56" - "@aws-sdk/credential-provider-process" "^3.972.47" - "@aws-sdk/credential-provider-sso" "^3.972.53" - "@aws-sdk/credential-provider-web-identity" "^3.972.53" - "@aws-sdk/nested-clients" "^3.997.21" - "@aws-sdk/types" "^3.973.13" + version "3.1068.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.1068.0.tgz" + integrity sha512-DN7UewD/XKGfNGWXZsTECWRj3IsULkE7aG+fPwqPf13CnX4UmNvj80g1xieJ0lVdMQ2h0L3gZpn2ClIY06+/vQ== + dependencies: + "@aws-sdk/client-cognito-identity" "3.1068.0" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/credential-provider-cognito-identity" "^3.972.45" + "@aws-sdk/credential-provider-env" "^3.972.46" + "@aws-sdk/credential-provider-http" "^3.972.48" + "@aws-sdk/credential-provider-ini" "^3.972.53" + "@aws-sdk/credential-provider-login" "^3.972.52" + "@aws-sdk/credential-provider-node" "^3.972.55" + "@aws-sdk/credential-provider-process" "^3.972.46" + "@aws-sdk/credential-provider-sso" "^3.972.52" + "@aws-sdk/credential-provider-web-identity" "^3.972.52" + "@aws-sdk/nested-clients" "^3.997.20" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/credential-provider-imds" "^4.3.7" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@^3.974.31": - version "3.974.31" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.31.tgz#5da2003d9eaf8530dbb619aeccdad7893cd591fc" - integrity sha512-Yzj6NRYVZdBaCp7o1BwHGyeDBfixdeToLIAMprshIITEdl9wKVSiidVOfeaiH8FyeC1hBmBfDZFvs/aH1Y3xpw== +"@aws-sdk/middleware-flexible-checksums@^3.974.30": + version "3.974.30" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.30.tgz" + integrity sha512-OaIhub+3yTgfFWPzKO8OzOZFIMUoJaiS5v67y3spQg7SoULGoMx4jKVBbE+uhnzkiZXQ+rEDS0RqrK4/aD1yJw== dependencies: - "@aws-sdk/checksums" "^3.1000.6" + "@aws-sdk/checksums" "^3.1000.5" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@^3.972.52": - version "3.972.52" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.52.tgz#d16c62891e46c81afeccb03921fabc1c867de904" - integrity sha512-rerjP08onRqkBh0AcCqip6GkKvESapmLoTgi1xysZ4C6a1xMrIMtTBcEbUb6EY71oeajnigeUD4KwZjtIO+aWQ== +"@aws-sdk/middleware-sdk-s3@^3.972.51": + version "3.972.51" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.51.tgz" + integrity sha512-keQgcIUTcHL0Qn7guhsuLaxQU36r9norCrxgaPH4DNCwon4TPtXdI/UdYuycl9vj3Dlwc3YR1dfL3U+6iIwJ6w== dependencies: - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/signature-v4-multi-region" "^3.996.35" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/signature-v4-multi-region" "^3.996.34" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/nested-clients@^3.997.21": - version "3.997.21" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.997.21.tgz#1b21a56409f22af63c8a4e731fbc1a51b6360b2b" - integrity sha512-eC7Vl7Qom/BGhZjG9GEqPwdQ/fk45hg1t5LP4EUxG5d1fdshLbaxCiwh/tszUzDX/4mW40mu2QsbeJJRPBbqUw== +"@aws-sdk/nested-clients@^3.997.20": + version "3.997.20" + resolved "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.20.tgz" + integrity sha512-IYJuLpXp2DEILVQpQOy0PMpkftv0AHEOCn52o0atyOaumA0CdWQ3klPyXdViGYLbNpESsVFMVybvHUeZAuiGxA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/signature-v4-multi-region" "^3.996.35" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/signature-v4-multi-region" "^3.996.34" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/fetch-http-handler" "^5.4.6" "@smithy/node-http-handler" "^4.7.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@^3.996.35": - version "3.996.35" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.35.tgz#2994b9f33e84b9c74392b7495f89e5c958bda503" - integrity sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg== +"@aws-sdk/signature-v4-multi-region@^3.996.34": + version "3.996.34" + resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.34.tgz" + integrity sha512-mx1L5qlumSOt/nKM3BFaHE2HVkWwz0i4Bw0pyYO42FfX/FeLlo8YI6csC0gSPprEk6fTIqI+CZN9RwUwKd5krQ== dependencies: - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/types" "^3.973.12" "@smithy/signature-v4" "^5.4.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/token-providers@3.1069.0": - version "3.1069.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1069.0.tgz#0cc290f99ca683d7e0cb711ce4904ae70bdcd17f" - integrity sha512-ks4X+kngC3PA5howV7Qu1TgG4bfC4jPykKdvw3nmBSXR9yZxRJouBholFSNQ5kY3L+Fgwyw+LCjzQmNi+KR91g== +"@aws-sdk/token-providers@3.1066.0": + version "3.1066.0" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1066.0.tgz" + integrity sha512-UqEUJq7dqa44hneLDUcX7UJy95cg8YqEWyakRpvIPnrNS3Mq+UlQHgCDGu5pvwAPtlIW4qcYbvW6reG6++FyvA== dependencies: - "@aws-sdk/core" "^3.974.21" - "@aws-sdk/nested-clients" "^3.997.21" - "@aws-sdk/types" "^3.973.13" + "@aws-sdk/core" "^3.974.20" + "@aws-sdk/nested-clients" "^3.997.20" + "@aws-sdk/types" "^3.973.12" "@smithy/core" "^3.24.6" "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/types@^3.222.0", "@aws-sdk/types@^3.347.0", "@aws-sdk/types@^3.973.13": - version "3.973.13" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.973.13.tgz#c076f611e94394a49c1bc1aeb64371ef6db4b3da" - integrity sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg== +"@aws-sdk/types@^3.222.0", "@aws-sdk/types@^3.347.0", "@aws-sdk/types@^3.973.12": + version "3.973.12" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.12.tgz" + integrity sha512-43ajd1NF0RMgX5k0hxCNUyEdrtFUsb2aHT2QvpktSC/2Eyb2Jr/JPVqdp0XIoaHWikZJq5tNWSLO6kB5q2eMCA== dependencies: "@smithy/types" "^4.14.3" tslib "^2.6.2" +"@aws-sdk/types@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.370.0.tgz" + integrity sha512-8PGMKklSkRKjunFhzM2y5Jm0H2TBu7YRNISdYzXLUHKSP9zlMEYagseKVdmox0zKHf1LXVNuSlUV2b6SRrieCQ== + dependencies: + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/util-arn-parser@^3.310.0": - version "3.972.16" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.16.tgz#402cfbffedef86329209b63dcfb037cf3f4cc8d5" - integrity sha512-dBp9KAXOLe7mMGwy29VA+lCcZDgcncFeCQ/fIv0m3nvUXQpi/O6Yilfpv5icQ2IEEQOHynyjNbLgjtD+FvNiMw== + version "3.972.15" + resolved "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.15.tgz" + integrity sha512-nF4CwAP6OxnWvUtEzu7MHB0Nzd/WqKoSaMzWEKNtV32eiY9pMFgOaH8m6dBWeyQy0L4AldP2HpAx/gLGyOxKkQ== dependencies: - "@aws-sdk/core" "^3.974.21" + "@aws-sdk/core" "^3.974.20" tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": - version "3.965.8" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.965.8.tgz#d9a6bede3c136f433441391615da68c924692487" - integrity sha512-uUbMs1cBZPafD0ohUj6EwNf0fPZ534NvBxHox4hjX+0Rxq5paSYUem7+hi833pYrzrcnBATKIYpR02MDXT5M9g== + version "3.965.7" + resolved "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.7.tgz" + integrity sha512-M0D6oIpohdNHjc7udzTHEQyot0+0iuA36jc2I9Hps+f/GtKi2HO/pyijQnCnNcwZqLB5+rtn81z3eZK/GyjAmA== dependencies: tslib "^2.6.2" -"@aws-sdk/xml-builder@^3.972.30": - version "3.972.30" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.30.tgz#a52f9d8a69b1ceedb21012dd7830f098aa11102c" - integrity sha512-StElZPEoBquWwNqw1AcfpzEyZqJvFxouG+mpDNYlcH6ZOrqd2CuIryv+8LV8gNHZUOyKyJF3Dq9vxaXEmDR9TQ== +"@aws-sdk/xml-builder@^3.972.29": + version "3.972.29" + resolved "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.29.tgz" + integrity sha512-fk0niuGFxfi8yIJuMVM4mhwObkiQSuwZFj3tAPrLVx64Pk3BkrEIpqjzHKY4hKoEBUD6Jg/S74Zj9jy+5F3DnQ== dependencies: "@smithy/types" "^4.14.3" fast-xml-parser "5.7.3" @@ -456,28 +464,28 @@ "@aws/lambda-invoke-store@^0.2.2": version "0.2.4" - resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz#802f6a50f6b6589063ef63ba8acdee86fcb9f395" + resolved "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz" integrity sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ== "@azure/abort-controller@^2.0.0", "@azure/abort-controller@^2.1.2": version "2.1.2" - resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d" + resolved "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz" integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA== dependencies: tslib "^2.6.2" "@azure/core-auth@^1.10.0", "@azure/core-auth@^1.9.0": version "1.10.1" - resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.10.1.tgz#68a17fa861ebd14f6fd314055798355ef6bedf1b" + resolved "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz" integrity sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg== dependencies: "@azure/abort-controller" "^2.1.2" "@azure/core-util" "^1.13.0" tslib "^2.6.2" -"@azure/core-client@^1.9.2", "@azure/core-client@^1.9.3": +"@azure/core-client@^1.10.0", "@azure/core-client@^1.9.2", "@azure/core-client@^1.9.3": version "1.10.2" - resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.10.2.tgz#a964e00370df37c09c8770bb5c6f17fef1fc4956" + resolved "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.2.tgz" integrity sha512-1D2LpsU7y9xrqKjdIbsB7PlrRePw0xsVV8p+AKTlzITrWmscajryfJCdDJB/oGwvDI5HmRo04eMMADB67uwAwQ== dependencies: "@azure/abort-controller" "^2.1.2" @@ -490,14 +498,14 @@ "@azure/core-http-compat@^2.2.0": version "2.4.0" - resolved "https://registry.yarnpkg.com/@azure/core-http-compat/-/core-http-compat-2.4.0.tgz#28322f317eb46d625d7d18bb0eb02c2654f5de1b" + resolved "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.4.0.tgz" integrity sha512-f1P96IB399YiN2ARYHP7EpZi3Bf3wH4SN2lGzrw7JVwm7bbsVYtf2iKSBwTywD2P62NOPZGHFSZi+6jjb75JuA== dependencies: "@azure/abort-controller" "^2.1.2" "@azure/core-lro@^2.2.0": version "2.7.2" - resolved "https://registry.yarnpkg.com/@azure/core-lro/-/core-lro-2.7.2.tgz#787105027a20e45c77651a98b01a4d3b01b75a08" + resolved "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz" integrity sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw== dependencies: "@azure/abort-controller" "^2.0.0" @@ -507,14 +515,14 @@ "@azure/core-paging@^1.6.2": version "1.6.2" - resolved "https://registry.yarnpkg.com/@azure/core-paging/-/core-paging-1.6.2.tgz#40d3860dc2df7f291d66350b2cfd9171526433e7" + resolved "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz" integrity sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA== dependencies: tslib "^2.6.2" "@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.19.1", "@azure/core-rest-pipeline@^1.22.0": version "1.24.0" - resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.24.0.tgz#7582157ffebfe60d0a7fc00fd292203d8cbd3f40" + resolved "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.24.0.tgz" integrity sha512-PpLsoDQ3AMmKZ0VU+0GrmqMxgp/sExjlVm4R+nLWngeoEGAzOIPVifaxKGU5gMv+nWELUoHfvrolWD+ZS/nFJg== dependencies: "@azure/abort-controller" "^2.1.2" @@ -527,14 +535,14 @@ "@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.2.0", "@azure/core-tracing@^1.3.0": version "1.3.1" - resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.3.1.tgz#e971045c901ea9c110616b0e1db272507781d5f6" + resolved "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz" integrity sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ== dependencies: tslib "^2.6.2" "@azure/core-util@^1.11.0", "@azure/core-util@^1.13.0", "@azure/core-util@^1.2.0": version "1.13.1" - resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.13.1.tgz#6dff2ff6d3c9c6430c6f4d3b3e65de531f10bafe" + resolved "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz" integrity sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A== dependencies: "@azure/abort-controller" "^2.1.2" @@ -543,7 +551,7 @@ "@azure/core-xml@^1.4.5": version "1.5.1" - resolved "https://registry.yarnpkg.com/@azure/core-xml/-/core-xml-1.5.1.tgz#5528aef8e561ee97c605d0080b8803a21d2be783" + resolved "https://registry.npmjs.org/@azure/core-xml/-/core-xml-1.5.1.tgz" integrity sha512-xcNRHqCoSp4AunOALEae6A8f3qATb83gSrm31Iqb01OzblvC3/W/bfXozcq78EzIdzZzuH1bZ2NvRR0TdX709w== dependencies: fast-xml-parser "^5.5.9" @@ -551,7 +559,7 @@ "@azure/identity@^4.0.0": version "4.13.1" - resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-4.13.1.tgz#bdc091658baa59a47ee9fbab487a4bb018729bc3" + resolved "https://registry.npmjs.org/@azure/identity/-/identity-4.13.1.tgz" integrity sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw== dependencies: "@azure/abort-controller" "^2.0.0" @@ -568,35 +576,49 @@ "@azure/logger@^1.0.0", "@azure/logger@^1.1.4", "@azure/logger@^1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.3.0.tgz#5501cf85d4f52630602a8cc75df76568c969a827" + resolved "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz" integrity sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA== dependencies: "@typespec/ts-http-runtime" "^0.3.0" tslib "^2.6.2" "@azure/msal-browser@^5.5.0": - version "5.14.0" - resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-5.14.0.tgz#3c68c22b239f6c40fab08f433221f1b587abd8a5" - integrity sha512-Dfl7hPZe9/JJwRhFFXHq2z1oHYBuGubmff3kWXOsd1AGgyXlqjNYAWuN/1JL/ZrcZBs8TKMjGSil6Rcc7E8VPQ== + version "5.13.0" + resolved "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.13.0.tgz" + integrity sha512-Ea23x0U8XNFY+qJ9T44zO2BbY+AHdb+WdjmYnx36OhJ/KO+PGU5pmsNHf1DCElYX+6wyVRJz1HFeCPC/cHbRug== dependencies: - "@azure/msal-common" "16.9.0" + "@azure/msal-common" "16.8.0" + +"@azure/msal-common@14.16.1": + version "14.16.1" + resolved "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.1.tgz" + integrity sha512-nyxsA6NA4SVKh5YyRpbSXiMr7oQbwark7JU9LMeg6tJYTSPyAGkdx61wPT4gyxZfxlSxMMEyAsWaubBlNyIa1w== -"@azure/msal-common@16.9.0": - version "16.9.0" - resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-16.9.0.tgz#0222b099615ebc70bc61892ee1232341c086fcc6" - integrity sha512-1MWGjqgUCRAYgLmVFZKp7fs3Rg1TFvIMgywY8ze2olNVvLlJoRThuoziWSDJuwwyJI5L4rnLb9Tyt5D9GvSLPw== +"@azure/msal-common@16.8.0": + version "16.8.0" + resolved "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.8.0.tgz" + integrity sha512-5S4RHOcInL2Nu2U217tDZbWGI6StMfcWCrA7TWvWdJmXQ+cYrrIqr84AsN62fGh2MDBysiBJPt6CfWceJfloEA== + +"@azure/msal-node@^2.16.2": + version "2.16.3" + resolved "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.3.tgz" + integrity sha512-CO+SE4weOsfJf+C5LM8argzvotrXw252/ZU6SM2Tz63fEblhH1uuVaaO4ISYFuN4Q6BhTo7I3qIdi8ydUQCqhw== + dependencies: + "@azure/msal-common" "14.16.1" + jsonwebtoken "^9.0.0" + uuid "^8.3.0" "@azure/msal-node@^5.1.0": - version "5.2.5" - resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-5.2.5.tgz#d8c37a1cb1d05954b285f63d160d290d90b63b6d" - integrity sha512-RUuewWk9JvWJS5Yiy8/74Lm1rQAWlrU/qg/Bgtk1jIauVRtnb9XKwS5Xg0J+Whwjesq9EVrBIFgQEP8vHxgezA== + version "5.2.4" + resolved "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.2.4.tgz" + integrity sha512-rpBUg9dA8UpC2WiFt3KeDKVQmmmVrfxdRnW+F1ebgou/jX/0tAvYuonaq5RUo8OaqzOrj4x/HaI8DmY56RXZ2Q== dependencies: - "@azure/msal-common" "16.9.0" + "@azure/msal-common" "16.8.0" jsonwebtoken "^9.0.0" "@azure/storage-blob@^12.5.0": version "12.32.0" - resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.32.0.tgz#2950bbfed33e5dbf990c912924ce1d4cb1d4b8eb" + resolved "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.32.0.tgz" integrity sha512-80LzSNnFQye2LCCBFghAJS6jJQJ7N4bfgZ6qDMgVGRtugZ7TLDKQZ2hczMigmZH3jAcMRdma/IygsC5+0gT7Tw== dependencies: "@azure/abort-controller" "^2.1.2" @@ -616,7 +638,7 @@ "@azure/storage-common@^12.4.0": version "12.4.0" - resolved "https://registry.yarnpkg.com/@azure/storage-common/-/storage-common-12.4.0.tgz#901cd66dc87694cbf93af48fcb915cb0198df32e" + resolved "https://registry.npmjs.org/@azure/storage-common/-/storage-common-12.4.0.tgz" integrity sha512-kNhJKMxQb374KOVt63CZnGIpDcrKNzJeyANLJymxE9mCJSdRGzb+Iv9oSIiCj6tNMLypr530b9ObOiA/5OvwOg== dependencies: "@azure/abort-controller" "^2.1.2" @@ -631,7 +653,7 @@ "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz" integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== dependencies: "@babel/helper-validator-identifier" "^7.29.7" @@ -640,12 +662,12 @@ "@babel/compat-data@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz" integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== -"@babel/core@^7.28.0": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.28.0": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz" integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== dependencies: "@babel/code-frame" "^7.29.7" @@ -666,7 +688,7 @@ "@babel/generator@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.7.tgz#cca0b8827e6bcf3ba176788e7f3b180ad6db2fa3" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz" integrity sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ== dependencies: "@babel/parser" "^7.29.7" @@ -677,7 +699,7 @@ "@babel/helper-compilation-targets@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz" integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== dependencies: "@babel/compat-data" "^7.29.7" @@ -688,12 +710,12 @@ "@babel/helper-globals@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz" integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz" integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== dependencies: "@babel/traverse" "^7.29.7" @@ -701,7 +723,7 @@ "@babel/helper-module-transforms@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz" integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== dependencies: "@babel/helper-module-imports" "^7.29.7" @@ -710,27 +732,27 @@ "@babel/helper-plugin-utils@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz#c0a0766f1a13617d8a17407d7ab8f9d486225ea4" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz" integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== "@babel/helper-string-parser@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz" integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== "@babel/helper-validator-identifier@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz" integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== "@babel/helper-validator-option@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz" integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== "@babel/helpers@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz" integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== dependencies: "@babel/template" "^7.29.7" @@ -738,33 +760,33 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.4", "@babel/parser@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.7.tgz#837b87387cbf5ec5530cb634b3c622f68edb9334" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz" integrity sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg== dependencies: "@babel/types" "^7.29.7" "@babel/plugin-transform-react-jsx-self@^7.27.1": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz#c24424527858220624fd59a5b1eab4fa413c803a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz" integrity sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw== dependencies: "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-react-jsx-source@^7.27.1": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz#5cf25a3689906b58e2f0a2f2b374789e6627b15f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz" integrity sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q== dependencies: "@babel/helper-plugin-utils" "^7.29.7" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.9", "@babel/runtime@^7.26.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.9", "@babel/runtime@^7.26.0", "@babel/runtime@^7.29.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz" integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== "@babel/template@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz" integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== dependencies: "@babel/code-frame" "^7.29.7" @@ -773,7 +795,7 @@ "@babel/traverse@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.7.tgz#c47b07a41b95da0907d026b5dd894d98de7d2f2d" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz" integrity sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw== dependencies: "@babel/code-frame" "^7.29.7" @@ -786,7 +808,7 @@ "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.4", "@babel/types@^7.28.2", "@babel/types@^7.29.7": version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.7.tgz#8005e31d82712ee7adaef6e23c63b71a62770a92" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz" integrity sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA== dependencies: "@babel/helper-string-parser" "^7.29.7" @@ -794,7 +816,7 @@ "@backstage/backend-common@^0.23.3": version "0.23.3" - resolved "https://registry.yarnpkg.com/@backstage/backend-common/-/backend-common-0.23.3.tgz#bba71a3f932a88481ab8e09f4406fc551fb47aec" + resolved "https://registry.npmjs.org/@backstage/backend-common/-/backend-common-0.23.3.tgz" integrity sha512-/OZRnxlNokdMfoQEfDRrjIuojPi6UL80smHuNpcvP/93fXkrYiMwISulDQPxCfm1Rm9JW8mnRORGFihKIALNpQ== dependencies: "@aws-sdk/abort-controller" "^3.347.0" @@ -863,12 +885,12 @@ "@backstage/backend-dev-utils@^0.1.4": version "0.1.7" - resolved "https://registry.yarnpkg.com/@backstage/backend-dev-utils/-/backend-dev-utils-0.1.7.tgz#8fd5737936128c4e663e6ad23fe5f158021290ae" + resolved "https://registry.npmjs.org/@backstage/backend-dev-utils/-/backend-dev-utils-0.1.7.tgz" integrity sha512-05lbgXZGofBHcs/Yz2TTI3Brn98BcUU8ZFVx/sCz1EXG8/eFoZSEjr7F2cA1x2UKTIYIt7HGZEYxF1+1lqxNDQ== "@backstage/backend-plugin-api@^0.6.0": version "0.6.21" - resolved "https://registry.yarnpkg.com/@backstage/backend-plugin-api/-/backend-plugin-api-0.6.21.tgz#0d1b9222a8e69cfd500a0789edaff7d14a77dffe" + resolved "https://registry.npmjs.org/@backstage/backend-plugin-api/-/backend-plugin-api-0.6.21.tgz" integrity sha512-Cek3jgJmUY6oGDAYd7o/M6fezSnOIHzCBEsJHeE4vakdZ2vYOGVWPGIQmWSylEhK/oEL54JUslB5VjHo1onL9A== dependencies: "@backstage/cli-common" "^0.1.14" @@ -885,7 +907,7 @@ "@backstage/backend-plugin-api@^0.7.0": version "0.7.0" - resolved "https://registry.yarnpkg.com/@backstage/backend-plugin-api/-/backend-plugin-api-0.7.0.tgz#1a95a8fb5703856e08fef0e94b12f4a50e77ea68" + resolved "https://registry.npmjs.org/@backstage/backend-plugin-api/-/backend-plugin-api-0.7.0.tgz" integrity sha512-cq93C7UkS1t/D6VP3XZ8gLD8o3cRmbeSsIUGk+AYiUm0e8aSCWSAlBBiFYrylVOAuQXzEIgE9Gb3MNNFbl+Qug== dependencies: "@backstage/cli-common" "^0.1.14" @@ -900,10 +922,10 @@ knex "^3.0.0" luxon "^3.0.0" -"@backstage/catalog-client@^1.0.0", "@backstage/catalog-client@^1.12.1", "@backstage/catalog-client@^1.16.0", "@backstage/catalog-client@^1.6.5": - version "1.16.0" - resolved "https://registry.yarnpkg.com/@backstage/catalog-client/-/catalog-client-1.16.0.tgz#425205f47cade09ecbcc83ce82f0ea8595978a4f" - integrity sha512-mJMDosS4VaVDk8YbxvzTYuSN8MYNspgdH9Wn4UY6hobU7jju+eafJ5LZeWLXLU6ExgKXgCjKvxzHwMosxKmhNg== +"@backstage/catalog-client@^1.0.0", "@backstage/catalog-client@^1.12.1", "@backstage/catalog-client@^1.15.1", "@backstage/catalog-client@^1.6.5": + version "1.15.2" + resolved "https://registry.npmjs.org/@backstage/catalog-client/-/catalog-client-1.15.2.tgz" + integrity sha512-Q0Jjsp7rPEMYsqxumu681KlUOC/my1zkhk1YxBiggAHRFCVYUAXMM98WL2uN4IzzN+0r7bHxO5a2a7nGBk/n8w== dependencies: "@backstage/catalog-model" "^1.9.0" "@backstage/errors" "^1.3.1" @@ -915,7 +937,7 @@ "@backstage/catalog-model@^1.5.0", "@backstage/catalog-model@^1.7.6", "@backstage/catalog-model@^1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@backstage/catalog-model/-/catalog-model-1.9.0.tgz#f32d5a668dd5d26c0eca25957347ca58779d5a5f" + resolved "https://registry.npmjs.org/@backstage/catalog-model/-/catalog-model-1.9.0.tgz" integrity sha512-Q3K2IGemrEKgHVJr2X0gztr2fXMeobJrskRvNJVUtVtmGs+cIXjwYhl6K3/a2gmAXqLRk7rPh8waULLqumVyLg== dependencies: "@backstage/errors" "^1.3.1" @@ -927,7 +949,7 @@ "@backstage/cli-common@^0.1.14": version "0.1.18" - resolved "https://registry.yarnpkg.com/@backstage/cli-common/-/cli-common-0.1.18.tgz#1aacaa648dc0ac6a5238cec52c6712e8582f3ad3" + resolved "https://registry.npmjs.org/@backstage/cli-common/-/cli-common-0.1.18.tgz" integrity sha512-6Ks0tnqJpZPppwq4F6Ft3AvmUUe7NAqzKtXMKSmePjBtGgoqVn/dB8HJSZcW4UMooiGGDjGEz2bpWQ/qH3bWQw== dependencies: "@backstage/errors" "^1.2.7" @@ -937,7 +959,7 @@ "@backstage/cli-common@^0.2.2": version "0.2.2" - resolved "https://registry.yarnpkg.com/@backstage/cli-common/-/cli-common-0.2.2.tgz#a5e89b2783c93772b857bba689762bda0cd3c2aa" + resolved "https://registry.npmjs.org/@backstage/cli-common/-/cli-common-0.2.2.tgz" integrity sha512-wdquML3iQZaLcPJR1Z19dLahGhShwa0xmxkOI26wUJzcJhbqMt5MjD6F/Hg3p0kF3bvZP+dPC/LNXNDUsCOk4g== dependencies: "@backstage/errors" "^1.3.1" @@ -946,9 +968,9 @@ undici "^7.24.5" "@backstage/config-loader@^1.8.1": - version "1.10.12" - resolved "https://registry.yarnpkg.com/@backstage/config-loader/-/config-loader-1.10.12.tgz#991137a9670fcb8148d88caf929c0de4e9946963" - integrity sha512-q8N0qrMa2qGHLBiJxZCzzOD2U0+eiUj8NuhSUuob/XyEdjqJ1nVS9jkSugOQ2FwWngHNYs1oikNEWK8CgA0H0w== + version "1.10.11" + resolved "https://registry.npmjs.org/@backstage/config-loader/-/config-loader-1.10.11.tgz" + integrity sha512-iELyjcP2S6Po/qbGSzvWrhUrAx4Co7XppdlrWAiGGAH9RGbOSVc4SpgTOhbIOYayKXiADyDcypSqJ4sloJn+Gw== dependencies: "@backstage/cli-common" "^0.2.2" "@backstage/config" "^1.3.8" @@ -958,6 +980,7 @@ ajv "^8.10.0" chokidar "^3.5.2" fs-extra "^11.2.0" + json-schema "^0.4.0" json-schema-merge-allof "^0.8.1" json-schema-traverse "^1.0.0" lodash "^4.17.21" @@ -967,22 +990,22 @@ "@backstage/config@^1.2.0", "@backstage/config@^1.3.2", "@backstage/config@^1.3.6", "@backstage/config@^1.3.7", "@backstage/config@^1.3.8": version "1.3.8" - resolved "https://registry.yarnpkg.com/@backstage/config/-/config-1.3.8.tgz#ed848a8d52b7c585c74cf9c8e10c814b9086d732" + resolved "https://registry.npmjs.org/@backstage/config/-/config-1.3.8.tgz" integrity sha512-OEfwIyc+sdZfUmgV9YgmljsboL0ClulCipj7vE9t0QL3Qu7mgEkOzQmIL7sbCjh9DgvvvavIllo028e5MhioYQ== dependencies: "@backstage/errors" "^1.3.1" "@backstage/types" "^1.2.2" ms "^2.1.3" -"@backstage/core-app-api@^1.19.4", "@backstage/core-app-api@^1.20.2": - version "1.20.2" - resolved "https://registry.yarnpkg.com/@backstage/core-app-api/-/core-app-api-1.20.2.tgz#98a36bc12db295935524f1a0ecc030a683859c3e" - integrity sha512-IfOGghQtm6/4Yf6aRjX01k0t6/aYotf6bUGr6Dg7iJVY7R19pNa+NpeQwqGKsfD9o1oTyK1bPoQwJEWkozRonA== +"@backstage/core-app-api@^1.19.4", "@backstage/core-app-api@^1.20.1": + version "1.20.1" + resolved "https://registry.npmjs.org/@backstage/core-app-api/-/core-app-api-1.20.1.tgz" + integrity sha512-QQBYu+0oYroSYaf7NaXXujckUOa8B5yDOUgoksOZPBiNrUmHLn0L6HP4HUupXL6nd/Fj7/GeFlzNdvEQxwdwfw== dependencies: "@backstage/config" "^1.3.8" - "@backstage/core-plugin-api" "^1.12.7" + "@backstage/core-plugin-api" "^1.12.6" "@backstage/types" "^1.2.2" - "@backstage/ui" "^0.16.0" + "@backstage/ui" "^0.15.0" "@backstage/version-bridge" "^1.0.12" "@types/prop-types" "^15.7.3" history "^5.0.0" @@ -993,24 +1016,24 @@ zen-observable "^0.10.0" zod "^3.25.76 || ^4.0.0" -"@backstage/core-compat-api@^0.5.12", "@backstage/core-compat-api@^0.5.7": - version "0.5.12" - resolved "https://registry.yarnpkg.com/@backstage/core-compat-api/-/core-compat-api-0.5.12.tgz#298e166d2e964cbe7356a7e0c7c3b05d60eec0f4" - integrity sha512-3uZ4MVwzGmxlRkS9D5cpBU7cx6CLwAJAjAdUf/urzO/dC9HOByY1uyjoQWThttJmuP/f0LZux7A63FLaQTwl0Q== +"@backstage/core-compat-api@^0.5.11", "@backstage/core-compat-api@^0.5.7": + version "0.5.11" + resolved "https://registry.npmjs.org/@backstage/core-compat-api/-/core-compat-api-0.5.11.tgz" + integrity sha512-8XsFgb7z3ZdvVhKPKcmVNTIh7AoYumszoyaj7PIFSzo3BzEEUzdapUak1qOnsODdIl+qbSQ1vwjHrw8AL9NE6A== dependencies: - "@backstage/core-plugin-api" "^1.12.7" + "@backstage/core-plugin-api" "^1.12.6" "@backstage/errors" "^1.3.1" "@backstage/filter-predicates" "^0.1.3" - "@backstage/frontend-plugin-api" "^0.17.2" - "@backstage/plugin-app-react" "^0.2.4" - "@backstage/plugin-catalog-react" "^3.1.0" + "@backstage/frontend-plugin-api" "^0.17.0" + "@backstage/plugin-app-react" "^0.2.3" + "@backstage/plugin-catalog-react" "^3.0.0" "@backstage/types" "^1.2.2" "@backstage/version-bridge" "^1.0.12" lodash "^4.17.21" "@backstage/core-components@^0.14.0": version "0.14.10" - resolved "https://registry.yarnpkg.com/@backstage/core-components/-/core-components-0.14.10.tgz#944fe655220be8af9fde0deeafe16f9ce7fe1924" + resolved "https://registry.npmjs.org/@backstage/core-components/-/core-components-0.14.10.tgz" integrity sha512-RAEIQsJimokQDF0eAuRXSZreo2vjhf4a2tlMbi/edPRaGk4nTOHH7q6V7qLqqX9spTzS0bBAhkuif/v96shJuw== dependencies: "@backstage/config" "^1.2.0" @@ -1051,13 +1074,13 @@ zen-observable "^0.10.0" zod "^3.22.4" -"@backstage/core-components@^0.18.11", "@backstage/core-components@^0.18.6": - version "0.18.11" - resolved "https://registry.yarnpkg.com/@backstage/core-components/-/core-components-0.18.11.tgz#73b19ee5d24e2ba138178582fd07b310c6994d48" - integrity sha512-obgNIV7Ly4HajtKP+mzxZtJN/3/qoTD/awnvTTeNDQqKY0w1GMevIqI9OVVoKhBw3dXSPVHK8V1bjSLfbBbN8A== +"@backstage/core-components@^0.18.10", "@backstage/core-components@^0.18.6": + version "0.18.10" + resolved "https://registry.npmjs.org/@backstage/core-components/-/core-components-0.18.10.tgz" + integrity sha512-3EZjTwhJGt4KJPNu3fKIHRajOKbCRd/i5q/bvnHoW9kRxtV1UXkmaRzSxjb4Kh9DYoWTvuq7/+EWGY9WKrz9fg== dependencies: "@backstage/config" "^1.3.8" - "@backstage/core-plugin-api" "^1.12.7" + "@backstage/core-plugin-api" "^1.12.6" "@backstage/errors" "^1.3.1" "@backstage/theme" "^0.7.3" "@backstage/version-bridge" "^1.0.12" @@ -1081,7 +1104,7 @@ linkifyjs "4.3.2" lodash "^4.17.21" parse5 "^6.0.0" - qs "^6.15.2" + qs "^6.9.4" rc-progress "3.5.1" react-full-screen "^1.1.1" react-helmet "6.1.0" @@ -1099,14 +1122,14 @@ zen-observable "^0.10.0" zod "^3.25.76 || ^4.0.0" -"@backstage/core-plugin-api@^1.0.0", "@backstage/core-plugin-api@^1.12.1", "@backstage/core-plugin-api@^1.12.2", "@backstage/core-plugin-api@^1.12.4", "@backstage/core-plugin-api@^1.12.7", "@backstage/core-plugin-api@^1.9.3": - version "1.12.7" - resolved "https://registry.yarnpkg.com/@backstage/core-plugin-api/-/core-plugin-api-1.12.7.tgz#805be2822ff624e233badb5306f1f768b80ad37e" - integrity sha512-ATYZ+Nxoawsfbi6Dca8RQU5wqcqe0pc7nBkk2jBL8xsXjWgDhMSZxKUGDlgAM5jrI9//6fWTVj9aOTMyJzqfUQ== +"@backstage/core-plugin-api@^1.0.0", "@backstage/core-plugin-api@^1.12.1", "@backstage/core-plugin-api@^1.12.2", "@backstage/core-plugin-api@^1.12.4", "@backstage/core-plugin-api@^1.12.6", "@backstage/core-plugin-api@^1.9.3": + version "1.12.6" + resolved "https://registry.npmjs.org/@backstage/core-plugin-api/-/core-plugin-api-1.12.6.tgz" + integrity sha512-RCyiD5b3daod756VLRkuyqlxjGVsRqqSwB4X3vKxUaTgZiE0rzxKv/MH2gxo2U2YSP15Q9WoXqMstNWF3i5O6w== dependencies: "@backstage/config" "^1.3.8" "@backstage/errors" "^1.3.1" - "@backstage/frontend-plugin-api" "^0.17.2" + "@backstage/frontend-plugin-api" "^0.17.0" "@backstage/types" "^1.2.2" "@backstage/version-bridge" "^1.0.12" history "^5.0.0" @@ -1114,7 +1137,7 @@ "@backstage/errors@^1.2.4", "@backstage/errors@^1.2.7", "@backstage/errors@^1.3.0", "@backstage/errors@^1.3.1": version "1.3.1" - resolved "https://registry.yarnpkg.com/@backstage/errors/-/errors-1.3.1.tgz#4ed8b932f4e3bef9783eb6100f6b3ef00e5a8f2f" + resolved "https://registry.npmjs.org/@backstage/errors/-/errors-1.3.1.tgz" integrity sha512-EsBo684l3rEcKrGYSBw26LsRdLAAxU6u6GWaOPLt4MYAvK28fCs5arsg2He2Q6cIYJRiD8PiLEAH8o+C1xUWLA== dependencies: "@backstage/types" "^1.2.2" @@ -1122,7 +1145,7 @@ "@backstage/filter-predicates@^0.1.3": version "0.1.3" - resolved "https://registry.yarnpkg.com/@backstage/filter-predicates/-/filter-predicates-0.1.3.tgz#3703fea032750cdabc70ef7fcfda21b9776967b3" + resolved "https://registry.npmjs.org/@backstage/filter-predicates/-/filter-predicates-0.1.3.tgz" integrity sha512-zEfsrlU1+GjbLlKPINcXNxKTZpjEWFYF+wYqo/is6fSCqiFF11upqetxSZV0OQ11oIEqvtonJB1aZVJv19VtnQ== dependencies: "@backstage/config" "^1.3.8" @@ -1133,7 +1156,7 @@ "@backstage/frontend-app-api@^0.14.1": version "0.14.1" - resolved "https://registry.yarnpkg.com/@backstage/frontend-app-api/-/frontend-app-api-0.14.1.tgz#be668ffbaca3ee1530a34b306aedd460e7e28b97" + resolved "https://registry.npmjs.org/@backstage/frontend-app-api/-/frontend-app-api-0.14.1.tgz" integrity sha512-d01J9XfhTq1yBWPcUmlr6BfNPv4Ykb9zJFGTfDn3OtnCb06J3o3miENL8+V/CpW7COHa1trfWYvDDCI/7RJYbg== dependencies: "@backstage/config" "^1.3.6" @@ -1149,7 +1172,7 @@ "@backstage/frontend-defaults@^0.3.6": version "0.3.6" - resolved "https://registry.yarnpkg.com/@backstage/frontend-defaults/-/frontend-defaults-0.3.6.tgz#2c365952e56b9ae1ea4796d38f0924d71f21d113" + resolved "https://registry.npmjs.org/@backstage/frontend-defaults/-/frontend-defaults-0.3.6.tgz" integrity sha512-oZjBc/9J2IGuS2smsXvRqR/zzkseUH/zJG9oUK53PW+Oy5fgj0YJbAVRQRnTGlLjNUSO1zwKa1ASwSi+Bnpwmg== dependencies: "@backstage/config" "^1.3.6" @@ -1162,7 +1185,7 @@ "@backstage/frontend-plugin-api@^0.13.3", "@backstage/frontend-plugin-api@^0.13.4": version "0.13.4" - resolved "https://registry.yarnpkg.com/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz#8b965a06934539db55dc85de495839883aa5708b" + resolved "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.13.4.tgz" integrity sha512-IkzS5ltuxj5cl4OG/6FWZmkr7lcA9rZ4j1LaACA8W9//Av7lYVagvyqK2kuQfQmo2burzVTQMj25YV08h+QX7A== dependencies: "@backstage/errors" "^1.2.7" @@ -1171,10 +1194,10 @@ zod "^3.25.76" zod-to-json-schema "^3.25.1" -"@backstage/frontend-plugin-api@^0.17.2": - version "0.17.2" - resolved "https://registry.yarnpkg.com/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.17.2.tgz#a9196be5eec7cc9dc4ca1a2e152defcf1681d5db" - integrity sha512-8bLENCv0A1NdjxHXHIGUnmxnJe+xfwz5vrDSXvJlnlYGOKKWJFGETN2MJEeRufGQ/szKgUnYpUjOOGF9yQj/Tw== +"@backstage/frontend-plugin-api@^0.17.0": + version "0.17.1" + resolved "https://registry.npmjs.org/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.17.1.tgz" + integrity sha512-qZBRz7RJARs2C87PzskIVdDKF5YqB3DaD6qvkMUmuNAOfzidnRbRW7HEp7s2wa+wuMayZk11+i64kRYIr/ytDw== dependencies: "@backstage/config" "^1.3.8" "@backstage/errors" "^1.3.1" @@ -1185,9 +1208,9 @@ zod "^4.0.0" zod-to-json-schema "^3.25.1" -"@backstage/frontend-test-utils@^0.4.5": +"@backstage/frontend-test-utils@^0.4.5", "@backstage/frontend-test-utils@^0.6.0": version "0.4.5" - resolved "https://registry.yarnpkg.com/@backstage/frontend-test-utils/-/frontend-test-utils-0.4.5.tgz#0c3ed9e4584b1c9d3ea864ad6f64711640eab58b" + resolved "https://registry.npmjs.org/@backstage/frontend-test-utils/-/frontend-test-utils-0.4.5.tgz" integrity sha512-5B9zvB5IiRUr5UaP3To/JQC+AcgLGFiZzaIoy7+sMSvgKWVrlwK7EtVOLB9B4/4peJIPCOMzuXWkUJaP3jSK9A== dependencies: "@backstage/config" "^1.3.6" @@ -1202,7 +1225,7 @@ "@backstage/integration-aws-node@^0.1.12": version "0.1.21" - resolved "https://registry.yarnpkg.com/@backstage/integration-aws-node/-/integration-aws-node-0.1.21.tgz#bef87788291c14a51c02ba7af0b783d1b1e86a90" + resolved "https://registry.npmjs.org/@backstage/integration-aws-node/-/integration-aws-node-0.1.21.tgz" integrity sha512-aqeol4gA/NP2uNcPWeBMHl/z2W7b44rUveM365SVMCtVmX7izG1f0AmU5e7RuRQ1784EZuGdy5kZlvp93kaoGA== dependencies: "@aws-sdk/client-sts" "^3.350.0" @@ -1213,20 +1236,20 @@ "@backstage/config" "^1.3.7" "@backstage/errors" "^1.3.0" -"@backstage/integration-react@^1.2.14", "@backstage/integration-react@^1.2.19": - version "1.2.19" - resolved "https://registry.yarnpkg.com/@backstage/integration-react/-/integration-react-1.2.19.tgz#588a53df7e0a205a39152b5265b1e398da2ec1e5" - integrity sha512-i2+8yS9Rh2+vLMcjmpYqT4rdmaYwYxwBeQ8GYtldXJYkyp+KWiGI0FQIJZeV1ViN4gBQLLs/SgnZ+EfGOw0iUg== +"@backstage/integration-react@^1.2.14", "@backstage/integration-react@^1.2.18": + version "1.2.18" + resolved "https://registry.npmjs.org/@backstage/integration-react/-/integration-react-1.2.18.tgz" + integrity sha512-zbEnIwGIVWwqrIWR7BlXHaT9ZfZn38Rh6Hit0aRxsHGOPbMp2IkTvG+mAW6q4Lxn8SE5kcRVtSMho/dECwIu7g== dependencies: "@backstage/config" "^1.3.8" - "@backstage/core-plugin-api" "^1.12.7" - "@backstage/integration" "^2.0.3" + "@backstage/core-plugin-api" "^1.12.6" + "@backstage/integration" "^2.0.2" "@material-ui/core" "^4.12.2" "@material-ui/icons" "^4.9.1" "@backstage/integration@^1.13.0": version "1.20.1" - resolved "https://registry.yarnpkg.com/@backstage/integration/-/integration-1.20.1.tgz#6a3b4eba069734d1abf2f779ce0b6c483051a35b" + resolved "https://registry.npmjs.org/@backstage/integration/-/integration-1.20.1.tgz" integrity sha512-rfYMauJAq0BcEPcAm3em/NJC8Gvu3WzRfbgr3onEdjEc0/hEE2ffXmTcMSZykieltV3IAMHwfF2UBm0eV+hOhQ== dependencies: "@azure/identity" "^4.0.0" @@ -1240,10 +1263,10 @@ lodash "^4.17.21" luxon "^3.0.0" -"@backstage/integration@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@backstage/integration/-/integration-2.0.3.tgz#d3b3c2b621c46f12d61b51f88211ded538a56a5d" - integrity sha512-qYZbKilulxvpDsyd6zFAq8lUNLh47qC0xywh96jXBaNouVc1EdxoBxv3JYku33EAc2lmBDeMQVnj768FlbYaTw== +"@backstage/integration@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@backstage/integration/-/integration-2.0.2.tgz" + integrity sha512-rBOBngFpOfFfwtGyAQC8/5b0CEd5L/srstsAIR1GHP+teyu3I1XpxC+WldiICkQ/Ls12gEA2xLOj4aSeT3Qzug== dependencies: "@azure/identity" "^4.0.0" "@azure/storage-blob" "^12.5.0" @@ -1259,25 +1282,25 @@ "@backstage/plugin-app-react@^0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@backstage/plugin-app-react/-/plugin-app-react-0.1.0.tgz#b420759b5ac92951d47854d182c85bb201e2b5f2" + resolved "https://registry.npmjs.org/@backstage/plugin-app-react/-/plugin-app-react-0.1.0.tgz" integrity sha512-9lVx7Gon5uRmIAkdSTNH0TrRdE1qx4UB7KH4uHWt07ARDNWUyXIHe94wcnu5NSlkqqt6VriomYju5cLCG8cKdw== dependencies: "@backstage/core-plugin-api" "^1.12.1" "@backstage/frontend-plugin-api" "^0.13.3" "@material-ui/core" "^4.9.13" -"@backstage/plugin-app-react@^0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@backstage/plugin-app-react/-/plugin-app-react-0.2.4.tgz#68b3a7b7b3d9c7e5fb663c24357f9df4a3b45437" - integrity sha512-bpzYnX93IpoiUeDlLraf3K7AvKFLi7+PcgDfR8/ZYkDwgMM7/QGhqiEBiV3nGFbvvsqLtaGqlOlmmtk5yILJSA== +"@backstage/plugin-app-react@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@backstage/plugin-app-react/-/plugin-app-react-0.2.3.tgz" + integrity sha512-2NsiqqEW6NVzQu/kATKX6DPgjEBbdlLYuRqGRB89NEPk1/XiDFPbnnCjD0ZQ0iA7pj0+9QHLXUhe6hHzKOiIIw== dependencies: - "@backstage/core-plugin-api" "^1.12.7" - "@backstage/frontend-plugin-api" "^0.17.2" + "@backstage/core-plugin-api" "^1.12.6" + "@backstage/frontend-plugin-api" "^0.17.0" "@material-ui/core" "^4.9.13" "@backstage/plugin-app@^0.3.5": version "0.3.5" - resolved "https://registry.yarnpkg.com/@backstage/plugin-app/-/plugin-app-0.3.5.tgz#b43c8d900532dc9a50bab2d47e128b4d643386d8" + resolved "https://registry.npmjs.org/@backstage/plugin-app/-/plugin-app-0.3.5.tgz" integrity sha512-CYrCS1/9u463qU/Nk9TuIc+9mnAb6hcuVQZWqlpwITkm6uh5+oe3h16+KRGrC7JUgsPUtFYtDxNhSNI5taSfXQ== dependencies: "@backstage/core-components" "^0.18.6" @@ -1298,7 +1321,7 @@ "@backstage/plugin-auth-node@^0.4.16", "@backstage/plugin-auth-node@^0.4.17": version "0.4.17" - resolved "https://registry.yarnpkg.com/@backstage/plugin-auth-node/-/plugin-auth-node-0.4.17.tgz#1e890a31ba0795b0c51720282fc72c31c5b7cc2a" + resolved "https://registry.npmjs.org/@backstage/plugin-auth-node/-/plugin-auth-node-0.4.17.tgz" integrity sha512-nNZPWPRMCfU0LoxV15bfClPUfZ8XbnKDC4VTMRGyXo37FdRI9uNvrSrZm++e0QKCR/xGfab377SByp/9jITKmQ== dependencies: "@backstage/backend-common" "^0.23.3" @@ -1321,7 +1344,7 @@ "@backstage/plugin-catalog-common@^1.1.10", "@backstage/plugin-catalog-common@^1.1.7": version "1.1.10" - resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-common/-/plugin-catalog-common-1.1.10.tgz#d1c30a80c34b12ff6bf3e22a4cc24c8a6031fa14" + resolved "https://registry.npmjs.org/@backstage/plugin-catalog-common/-/plugin-catalog-common-1.1.10.tgz" integrity sha512-EAKg+wEoqwcb/NhCMgIULHyTYva6bVXXWsf42SqxHOBsBxQyuHcJPiJA/oeRqhO0teT/lR6PkdokfzV+qcr8nA== dependencies: "@backstage/catalog-model" "^1.9.0" @@ -1330,7 +1353,7 @@ "@backstage/plugin-catalog-react@^1.0.0": version "1.21.6" - resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-react/-/plugin-catalog-react-1.21.6.tgz#bd9cf0816d8c3596acdea0a67a190a1af4675895" + resolved "https://registry.npmjs.org/@backstage/plugin-catalog-react/-/plugin-catalog-react-1.21.6.tgz" integrity sha512-miWlG4f+7PUiSB3FDL66ss3k92VAMIBlxbGjXziSVdqcf4bYuG+9hqOkXvetFkrInMe65gX7tNb9YL5dThTw3A== dependencies: "@backstage/catalog-client" "^1.12.1" @@ -1359,24 +1382,24 @@ yaml "^2.0.0" zen-observable "^0.10.0" -"@backstage/plugin-catalog-react@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-react/-/plugin-catalog-react-3.1.0.tgz#315ee1aba1989d5870808799e1e95a7169e1abb0" - integrity sha512-hxuYXs9asUpMEqbt/bXAI0OxpbPwM5dAHBK73Ir63nCV05hrc4nZzqtZp5rUCa0/MfzcSqjbKVlT09sjlVPcXg== +"@backstage/plugin-catalog-react@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@backstage/plugin-catalog-react/-/plugin-catalog-react-3.0.0.tgz" + integrity sha512-Khny0+02jy1TbgrAX8fQjuBLLLs7gsfaHxW+EoCk2ebG7IlLgCiCfjCuhmrz0W08O+2uACzzNZe0grDSY6tykw== dependencies: - "@backstage/catalog-client" "^1.16.0" + "@backstage/catalog-client" "^1.15.1" "@backstage/catalog-model" "^1.9.0" - "@backstage/core-compat-api" "^0.5.12" - "@backstage/core-components" "^0.18.11" - "@backstage/core-plugin-api" "^1.12.7" + "@backstage/core-compat-api" "^0.5.11" + "@backstage/core-components" "^0.18.10" + "@backstage/core-plugin-api" "^1.12.6" "@backstage/errors" "^1.3.1" "@backstage/filter-predicates" "^0.1.3" - "@backstage/frontend-plugin-api" "^0.17.2" - "@backstage/integration-react" "^1.2.19" + "@backstage/frontend-plugin-api" "^0.17.0" + "@backstage/integration-react" "^1.2.18" "@backstage/plugin-permission-common" "^0.9.9" - "@backstage/plugin-permission-react" "^0.5.2" + "@backstage/plugin-permission-react" "^0.5.1" "@backstage/types" "^1.2.2" - "@backstage/ui" "^0.16.0" + "@backstage/ui" "^0.15.0" "@backstage/version-bridge" "^1.0.12" "@material-ui/core" "^4.12.2" "@material-ui/icons" "^4.9.1" @@ -1386,7 +1409,7 @@ classnames "^2.2.6" lodash "^4.17.21" material-ui-popup-state "^5.3.6" - qs "^6.15.2" + qs "^6.9.4" react-use "^17.2.4" yaml "^2.0.0" zen-observable "^0.10.0" @@ -1394,7 +1417,7 @@ "@backstage/plugin-permission-common@^0.7.14": version "0.7.14" - resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-common/-/plugin-permission-common-0.7.14.tgz#ecb12877c412ff271124af54fca46ec06d9c812f" + resolved "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.7.14.tgz" integrity sha512-fHbxhX9ZoT8bTVuGycfTeU/6TE2yjZ6YNvm/2ko1bcxGnvYe1p5Ug5JW+iWjDZS+F6F152tWzhRcg05wQlPNKQ== dependencies: "@backstage/config" "^1.2.0" @@ -1406,7 +1429,7 @@ "@backstage/plugin-permission-common@^0.8.0": version "0.8.4" - resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-common/-/plugin-permission-common-0.8.4.tgz#9f9a166041853833b50e844bbe35a2d9b9aca37f" + resolved "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.8.4.tgz" integrity sha512-zZSfXadycRCP/YG2Cf4p/hxDU4fhrYDAVneo9PKZMfy3O4ERdtrYehGuOspcak2NkeMmaj2KfsFuWFuWK2xBTQ== dependencies: "@backstage/config" "^1.3.2" @@ -1417,9 +1440,33 @@ zod "^3.22.4" zod-to-json-schema "^3.20.4" -"@backstage/plugin-permission-common@^0.9.5", "@backstage/plugin-permission-common@^0.9.7", "@backstage/plugin-permission-common@^0.9.9": +"@backstage/plugin-permission-common@^0.9.5": + version "0.9.9" + resolved "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz" + integrity sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q== + dependencies: + "@backstage/config" "^1.3.8" + "@backstage/errors" "^1.3.1" + "@backstage/types" "^1.2.2" + cross-fetch "^4.0.0" + zod "^3.25.76 || ^4.0.0" + zod-to-json-schema "^3.25.1" + +"@backstage/plugin-permission-common@^0.9.7": version "0.9.9" - resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz#8500efe14cc784b2c62c61291b6f5339ca440907" + resolved "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz" + integrity sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q== + dependencies: + "@backstage/config" "^1.3.8" + "@backstage/errors" "^1.3.1" + "@backstage/types" "^1.2.2" + cross-fetch "^4.0.0" + zod "^3.25.76 || ^4.0.0" + zod-to-json-schema "^3.25.1" + +"@backstage/plugin-permission-common@^0.9.9": + version "0.9.9" + resolved "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.9.9.tgz" integrity sha512-tjFBEKqscUikh3FuXka9n24/N13s9H/L8XUKD9dmzGZL2GVKBt89lLixGsHLypMWntICwqlAFiItIihrdJsq3Q== dependencies: "@backstage/config" "^1.3.8" @@ -1431,7 +1478,7 @@ "@backstage/plugin-permission-react@^0.4.39": version "0.4.41" - resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-react/-/plugin-permission-react-0.4.41.tgz#88e898961f9dcd3ce8a7ef6fe315577351ef870f" + resolved "https://registry.npmjs.org/@backstage/plugin-permission-react/-/plugin-permission-react-0.4.41.tgz" integrity sha512-XGJPNBd8pY5b8dya+twIr0Zznuq/wX2guUKdfnYmQyjw2Li9Ik6Q4sWPyshFfG7tCxe/eaEz9FNFJzgiGG3dIg== dependencies: "@backstage/config" "^1.3.6" @@ -1440,35 +1487,35 @@ dataloader "^2.0.0" swr "^2.0.0" -"@backstage/plugin-permission-react@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-react/-/plugin-permission-react-0.5.2.tgz#96bc593a2db7b80a2f47907b3decc17c46fbfcd6" - integrity sha512-/POYCx66/Z6qo//CiFieKFXwMUB1rbj6fpiRN1qiK1ky3QrJd+ewGaQOF/Mssl4hFDHGma/chfHKgSJj4PgZQw== +"@backstage/plugin-permission-react@^0.5.1": + version "0.5.1" + resolved "https://registry.npmjs.org/@backstage/plugin-permission-react/-/plugin-permission-react-0.5.1.tgz" + integrity sha512-R7RBOol/ZW4yNGkxIPWEHghR8hkpS7LYqgE7RHxNAtp/L0NUQ1mp+HcOo9QQo1iWaqrqAEX3TA2WVqoolguoTA== dependencies: "@backstage/config" "^1.3.8" - "@backstage/core-plugin-api" "^1.12.7" + "@backstage/core-plugin-api" "^1.12.6" "@backstage/plugin-permission-common" "^0.9.9" dataloader "^2.0.0" swr "^2.0.0" "@backstage/plugin-search-common@^1.2.24": version "1.2.24" - resolved "https://registry.yarnpkg.com/@backstage/plugin-search-common/-/plugin-search-common-1.2.24.tgz#80ca737be71987f95a660947363ae8d58e805637" + resolved "https://registry.npmjs.org/@backstage/plugin-search-common/-/plugin-search-common-1.2.24.tgz" integrity sha512-vhLiHAiUpWsvB1AIKpB7EEJB0/l3thzdC78Eq58nJdjYEt5hEpiyA6HvrzlJ6ANg83130ur0VCOlSVZhjNfTVw== dependencies: "@backstage/plugin-permission-common" "^0.9.9" "@backstage/types" "^1.2.2" "@backstage/test-utils@^1.7.14": - version "1.7.19" - resolved "https://registry.yarnpkg.com/@backstage/test-utils/-/test-utils-1.7.19.tgz#7d75de7238f99cb09c681ba929ee8a1ed0aacff3" - integrity sha512-F0agWjHqIY4Fg8k1xfVjfPSEXqOnEXX/Pp6BlVlUeqRJVqCZjeVX1/IPEaX+ql8forV/MQ0KBF+uiqZSj87qUw== + version "1.7.18" + resolved "https://registry.npmjs.org/@backstage/test-utils/-/test-utils-1.7.18.tgz" + integrity sha512-oBW5tfNXQM2Tqw/3wS/DdI8bW3Y96nqsMVkfVbdgV59QUkFYcONhnTaHzKjjybfJauWJ03SDVnFn3mcvgyg+jQ== dependencies: "@backstage/config" "^1.3.8" - "@backstage/core-app-api" "^1.20.2" - "@backstage/core-plugin-api" "^1.12.7" + "@backstage/core-app-api" "^1.20.1" + "@backstage/core-plugin-api" "^1.12.6" "@backstage/plugin-permission-common" "^0.9.9" - "@backstage/plugin-permission-react" "^0.5.2" + "@backstage/plugin-permission-react" "^0.5.1" "@backstage/theme" "^0.7.3" "@backstage/types" "^1.2.2" "@material-ui/core" "^4.12.2" @@ -1479,16 +1526,25 @@ "@backstage/theme@^0.5.6": version "0.5.7" - resolved "https://registry.yarnpkg.com/@backstage/theme/-/theme-0.5.7.tgz#496b310d436efdb6ce1e240b69cc1ef7e3526db0" + resolved "https://registry.npmjs.org/@backstage/theme/-/theme-0.5.7.tgz" integrity sha512-XztEKnNot3DA4BuLZJocbSYvpYpWm/OF9PP7nOk9pJ4Jg4YIrEzZxOxPorOp7r/UhZhLwnqneIV3RcFBhOt9BA== dependencies: "@emotion/react" "^11.10.5" "@emotion/styled" "^11.10.5" "@mui/material" "^5.12.2" -"@backstage/theme@^0.7.1", "@backstage/theme@^0.7.3": +"@backstage/theme@^0.7.1": + version "0.7.3" + resolved "https://registry.npmjs.org/@backstage/theme/-/theme-0.7.3.tgz" + integrity sha512-EE9Mm6GjEMDwr/+iXmJfMq2jIJDCnjPbaua5YCtUN/E1Q/FOBcFmijJeTLn8gF0xeEiYxrZhQf0NBRlxfapR/g== + dependencies: + "@emotion/react" "^11.10.5" + "@emotion/styled" "^11.10.5" + "@mui/material" "^5.12.2" + +"@backstage/theme@^0.7.3": version "0.7.3" - resolved "https://registry.yarnpkg.com/@backstage/theme/-/theme-0.7.3.tgz#57442b42dd3ec086769f5cd95303b003fa8fee4c" + resolved "https://registry.npmjs.org/@backstage/theme/-/theme-0.7.3.tgz" integrity sha512-EE9Mm6GjEMDwr/+iXmJfMq2jIJDCnjPbaua5YCtUN/E1Q/FOBcFmijJeTLn8gF0xeEiYxrZhQf0NBRlxfapR/g== dependencies: "@emotion/react" "^11.10.5" @@ -1497,13 +1553,13 @@ "@backstage/types@^1.1.1", "@backstage/types@^1.2.1", "@backstage/types@^1.2.2": version "1.2.2" - resolved "https://registry.yarnpkg.com/@backstage/types/-/types-1.2.2.tgz#280e3dec7be5bcddc54ee0e8a024a2768d274692" + resolved "https://registry.npmjs.org/@backstage/types/-/types-1.2.2.tgz" integrity sha512-gCctHIL3VSCKiffbWDq4Zl2n7g8NPO/dD2ksdOEm9KzWfb5AubsfQzakoKjZ8XvmdaY9jY7j1yRmHSjAqq7rBA== -"@backstage/ui@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@backstage/ui/-/ui-0.16.0.tgz#08ab2fd79afb8596ad7cb9f9b367d2ef5d1c7ec3" - integrity sha512-UBb2tIQbM6HX6qvvYIvWm6kgKuz6gfj1ryo/Ka3b3cZNigDe2k8d92JqiBf8Dh9o+JEqOycKdgtU0homsBsIRA== +"@backstage/ui@^0.15.0": + version "0.15.0" + resolved "https://registry.npmjs.org/@backstage/ui/-/ui-0.15.0.tgz" + integrity sha512-x0d1sqv521iDKHPiomHJ8jyVNCdeY/Df45YRctV9jfnm5hN7p/TaYW9MENdU4sx22re0epMxcO/hGChQYkcQmg== dependencies: "@backstage/version-bridge" "^1.0.12" "@braintree/sanitize-url" "^7.1.2" @@ -1519,84 +1575,84 @@ "@backstage/version-bridge@^1.0.11", "@backstage/version-bridge@^1.0.12", "@backstage/version-bridge@^1.0.8": version "1.0.12" - resolved "https://registry.yarnpkg.com/@backstage/version-bridge/-/version-bridge-1.0.12.tgz#04e85e5ad1f59e9ae70eec10a03fe6c3f2aa26c0" + resolved "https://registry.npmjs.org/@backstage/version-bridge/-/version-bridge-1.0.12.tgz" integrity sha512-n+JfiPw7KCpGSNG+v47+W2gTwBdRTTkcikLGvm29A7SG91NYDee7fhBhYTXQ1vOHJpj1yBl+2vlrNVTap33Q9g== "@balena/dockerignore@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" + resolved "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz" integrity sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q== "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@braintree/sanitize-url@^7.1.2": version "7.1.2" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz#ca2035b0fefe956a8676ff0c69af73e605fcd81f" + resolved "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz" integrity sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA== "@bramus/specificity@^2.4.2": version "2.4.2" - resolved "https://registry.yarnpkg.com/@bramus/specificity/-/specificity-2.4.2.tgz#aa8db8eb173fdee7324f82284833106adeecc648" + resolved "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz" integrity sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw== dependencies: css-tree "^3.0.0" "@changesets/types@^4.0.1": version "4.1.0" - resolved "https://registry.yarnpkg.com/@changesets/types/-/types-4.1.0.tgz#fb8f7ca2324fd54954824e864f9a61a82cb78fe0" + resolved "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz" integrity sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw== -"@colors/colors@1.6.0", "@colors/colors@^1.6.0": +"@colors/colors@^1.6.0", "@colors/colors@1.6.0": version "1.6.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@csstools/color-helpers@^6.0.2": version "6.0.2" - resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-6.0.2.tgz#82c59fd30649cf0b4d3c82160489748666e6550b" + resolved "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz" integrity sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q== "@csstools/css-calc@^3.2.0", "@csstools/css-calc@^3.2.1": version "3.2.1" - resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-3.2.1.tgz#b30e061ca9f297ccb2b3b032bfee32fda02b1b27" + resolved "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz" integrity sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg== "@csstools/css-color-parser@^4.1.0": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-4.1.7.tgz#ca32fc74a3cdec7c288651fe01241fcd59f95a0e" - integrity sha512-CmjJFQTFQx/U/xNJhSjCQ0ilpesPmNQ8+eOUeM/+kDOVW33qsIjeOXc27vrQDdWVkf83ZSWwtg7kXSUvKDJ8cQ== + version "4.1.4" + resolved "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.4.tgz" + integrity sha512-yI8kNhHiOrLb8Rlulsk07DeQz0PwyT69FX9dkz5rAp7p9RUwFKEXnZpBGzURiLHgi66YqIWxOHn1nij8Lrg27Q== dependencies: "@csstools/color-helpers" "^6.0.2" "@csstools/css-calc" "^3.2.1" "@csstools/css-parser-algorithms@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz#e1c65dc09378b42f26a111fca7f7075fc2c26164" + resolved "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz" integrity sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w== "@csstools/css-syntax-patches-for-csstree@^1.1.3": version "1.1.5" - resolved "https://registry.yarnpkg.com/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz#b8e26e0fe25e9a6ec607d045470cc46d2f62731e" + resolved "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz" integrity sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A== "@csstools/css-tokenizer@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz#798a33950d11226a0ebb6acafa60f5594424967f" + resolved "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz" integrity sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA== "@dabh/diagnostics@^2.0.8": version "2.0.8" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.8.tgz#ead97e72ca312cf0e6dd7af0d300b58993a31a5e" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz" integrity sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q== dependencies: "@so-ric/colorspace" "^1.1.6" @@ -1605,31 +1661,65 @@ "@dagrejs/dagre@^1.1.4": version "1.1.8" - resolved "https://registry.yarnpkg.com/@dagrejs/dagre/-/dagre-1.1.8.tgz#fcbee59344c7b4f48b711ba30783543b70029310" + resolved "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-1.1.8.tgz" integrity sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw== dependencies: "@dagrejs/graphlib" "2.2.4" "@dagrejs/graphlib@2.2.4": version "2.2.4" - resolved "https://registry.yarnpkg.com/@dagrejs/graphlib/-/graphlib-2.2.4.tgz#d77bfa9ff49e2307c0c6e6b8b26b5dd3c05816c4" + resolved "https://registry.npmjs.org/@dagrejs/graphlib/-/graphlib-2.2.4.tgz" integrity sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw== -"@date-io/core@1.x", "@date-io/core@^1.3.13": +"@date-io/core@^1.3.13", "@date-io/core@1.x": version "1.3.13" - resolved "https://registry.yarnpkg.com/@date-io/core/-/core-1.3.13.tgz#90c71da493f20204b7a972929cc5c482d078b3fa" + resolved "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz" integrity sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA== "@date-io/date-fns@^1.3.13": version "1.3.13" - resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-1.3.13.tgz#7798844041640ab393f7e21a7769a65d672f4735" + resolved "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-1.3.13.tgz" integrity sha512-yXxGzcRUPcogiMj58wVgFjc9qUYrCnnU9eLcyNbsQCmae4jPuZCDoIBR21j8ZURsM7GRtU62VOw5yNd4dDHunA== dependencies: "@date-io/core" "^1.3.13" +"@dawmatt/api-grade-core@*", "@dawmatt/api-grade-core@file:/Users/matt/Code/DawMatt/api-grade/packages/api-grade-core": + version "0.1.20" + resolved "file:packages/api-grade-core" + dependencies: + "@stoplight/spectral-core" "^1.23.0" + "@stoplight/spectral-formats" "^1.8.3" + "@stoplight/spectral-parsers" "^1.0.5" + "@stoplight/spectral-ruleset-bundler" "^1.7.0" + "@stoplight/spectral-rulesets" "^1.22.4" + "@stoplight/yaml" "^4.3.0" + chalk "^5.3.0" + +"@dawmatt/api-grade-mcp@file:/Users/matt/Code/DawMatt/api-grade/packages/api-grade-mcp": + version "0.1.0" + resolved "file:packages/api-grade-mcp" + dependencies: + "@azure/msal-node" "^2.16.2" + "@dawmatt/api-grade-core" "*" + "@modelcontextprotocol/sdk" "^1.0.0" + zod "^3.22.0" + +"@dawmatt/backstage-plugin-api-grade-backend@*", "@dawmatt/backstage-plugin-api-grade-backend@file:/Users/matt/Code/DawMatt/api-grade/packages/backstage-plugin-api-grade-backend": + version "0.1.20" + resolved "file:packages/backstage-plugin-api-grade-backend" + dependencies: + "@dawmatt/api-grade-core" "*" + express "^4.18.0" + +"@dawmatt/backstage-plugin-api-grade@file:/Users/matt/Code/DawMatt/api-grade/packages/backstage-plugin-api-grade": + version "0.1.20" + resolved "file:packages/backstage-plugin-api-grade" + dependencies: + "@dawmatt/api-grade-core" "*" + "@emotion/babel-plugin@^11.13.5": version "11.13.5" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz" integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -1646,7 +1736,7 @@ "@emotion/cache@^11.13.5", "@emotion/cache@^11.14.0": version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz" integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== dependencies: "@emotion/memoize" "^0.9.0" @@ -1657,29 +1747,29 @@ "@emotion/hash@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== "@emotion/hash@^0.9.2": version "0.9.2" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz" integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== "@emotion/is-prop-valid@^1.3.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz#e9ad47adff0b5c94c72db3669ce46de33edf28c0" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz" integrity sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw== dependencies: "@emotion/memoize" "^0.9.0" "@emotion/memoize@^0.9.0": version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz" integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== -"@emotion/react@^11.10.5": +"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.10.5", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0": version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz" integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== dependencies: "@babel/runtime" "^7.18.3" @@ -1693,7 +1783,7 @@ "@emotion/serialize@^1.3.3": version "1.3.3" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz" integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== dependencies: "@emotion/hash" "^0.9.2" @@ -1704,12 +1794,12 @@ "@emotion/sheet@^1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz" integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== -"@emotion/styled@^11.10.5": +"@emotion/styled@^11.10.5", "@emotion/styled@^11.3.0": version "11.14.1" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.14.1.tgz#8c34bed2948e83e1980370305614c20955aacd1c" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz" integrity sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw== dependencies: "@babel/runtime" "^7.18.3" @@ -1721,154 +1811,44 @@ "@emotion/unitless@^0.10.0": version "0.10.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz" integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== "@emotion/use-insertion-effect-with-fallbacks@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz" integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== "@emotion/utils@^1.4.2": version "1.4.2" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz" integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== "@emotion/weak-memoize@^0.4.0": version "0.4.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz" integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - "@esbuild/darwin-arm64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.12.2": version "4.12.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== "@eslint/config-array@^0.23.5": version "0.23.5" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.5.tgz#56e86d243049195d8acc0c06a1b3dfdc3fa3de95" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz" integrity sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA== dependencies: "@eslint/object-schema" "^3.0.5" @@ -1877,31 +1857,31 @@ "@eslint/config-helpers@^0.6.0": version "0.6.0" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.6.0.tgz#ef9a36881d39dfd5dbeac22b0da997fabfb08b03" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz" integrity sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA== dependencies: "@eslint/core" "^1.2.1" "@eslint/core@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.2.1.tgz#c1da7cd1b82fa8787f98b5629fb811848a1b63ce" + resolved "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz" integrity sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ== dependencies: "@types/json-schema" "^7.0.15" "@eslint/js@^10.0.1": version "10.0.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-10.0.1.tgz#1e8a876f50117af8ab67e47d5ad94d38d6622583" + resolved "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz" integrity sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA== "@eslint/object-schema@^3.0.5": version "3.0.5" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.5.tgz#88e9bf4d11d2b19c082e78ebe7ce88724a5eb091" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz" integrity sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw== "@eslint/plugin-kit@^0.7.2": version "0.7.2" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz#4b0962f3f2c7ce8bc98b3ecfe34525c09d2cb729" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz" integrity sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A== dependencies: "@eslint/core" "^1.2.1" @@ -1909,12 +1889,12 @@ "@exodus/bytes@^1.11.0", "@exodus/bytes@^1.15.0", "@exodus/bytes@^1.6.0": version "1.15.1" - resolved "https://registry.yarnpkg.com/@exodus/bytes/-/bytes-1.15.1.tgz#b13bc464ca162c17abf0837fb3a11aeab79e45d1" + resolved "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz" integrity sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q== "@google-cloud/paginator@^5.0.0": version "5.0.2" - resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-5.0.2.tgz#86ad773266ce9f3b82955a8f75e22cd012ccc889" + resolved "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz" integrity sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg== dependencies: arrify "^2.0.0" @@ -1922,17 +1902,17 @@ "@google-cloud/projectify@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-4.0.0.tgz#d600e0433daf51b88c1fa95ac7f02e38e80a07be" + resolved "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz" integrity sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA== "@google-cloud/promisify@<4.1.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-4.0.0.tgz#a906e533ebdd0f754dca2509933334ce58b8c8b1" + resolved "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz" integrity sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g== "@google-cloud/storage@^7.0.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-7.21.0.tgz#46b89afbdc3014e18b60afdfba5d9212a23e7b58" + resolved "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.21.0.tgz" integrity sha512-l+IFTkd+6Y5LoAuXyYCKNAKtw/Ci+rAMqgdTB1jv4iZiLhw0rtq+0qjIRbBizXkNzEFmXiXUW0H7sZQQvk1ffA== dependencies: "@google-cloud/paginator" "^5.0.0" @@ -1952,7 +1932,7 @@ "@grpc/grpc-js@^1.11.1": version "1.14.4" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.14.4.tgz#e73ff57d97802f063999545f43ebb2b1eca65d9d" + resolved "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz" integrity sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ== dependencies: "@grpc/proto-loader" "^0.8.0" @@ -1960,7 +1940,7 @@ "@grpc/proto-loader@^0.7.13": version "0.7.15" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.15.tgz#4cdfbf35a35461fc843abe8b9e2c0770b5095e60" + resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz" integrity sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ== dependencies: lodash.camelcase "^4.3.0" @@ -1970,7 +1950,7 @@ "@grpc/proto-loader@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.8.1.tgz#5a6b290ccbfb1ae2f6775afb74e9898bd8c5d4e8" + resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz" integrity sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg== dependencies: lodash.camelcase "^4.3.0" @@ -1980,19 +1960,19 @@ "@hono/node-server@^1.19.9": version "1.19.14" - resolved "https://registry.yarnpkg.com/@hono/node-server/-/node-server-1.19.14.tgz#e30f844bc77e3ce7be442aac3b1f73ad8b58d181" + resolved "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz" integrity sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw== "@humanfs/core@^0.19.2": version "0.19.2" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.2.tgz#a8272ca03b2acf492670222b2320b6c421bfde60" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz" integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== dependencies: "@humanfs/types" "^0.15.0" "@humanfs/node@^0.16.6": version "0.16.8" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.8.tgz#8f800cccc13f4f8cd3116e2d9c0a94939da3e3ed" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz" integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== dependencies: "@humanfs/core" "^0.19.2" @@ -2001,60 +1981,60 @@ "@humanfs/types@^0.15.0": version "0.15.0" - resolved "https://registry.yarnpkg.com/@humanfs/types/-/types-0.15.0.tgz#f2a09f62012390b2bff3fc6fb248ddec8c09a090" + resolved "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz" integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== "@internationalized/date@^3.12.0", "@internationalized/date@^3.12.1": version "3.12.2" - resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.12.2.tgz#08a65edd2a29775e22c168ddc029fb54bf9b8a85" + resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.12.2.tgz" integrity sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw== dependencies: "@swc/helpers" "^0.5.0" "@internationalized/number@^3.6.6": version "3.6.7" - resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.6.7.tgz#5a0a8fa413b5f8679a59dcf37e2a74dc508b8371" + resolved "https://registry.npmjs.org/@internationalized/number/-/number-3.6.7.tgz" integrity sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg== dependencies: "@swc/helpers" "^0.5.0" "@internationalized/string@^3.2.8": version "3.2.9" - resolved "https://registry.yarnpkg.com/@internationalized/string/-/string-3.2.9.tgz#0e50385c411eac1275d91cdeb56dd7fbc234997f" + resolved "https://registry.npmjs.org/@internationalized/string/-/string-3.2.9.tgz" integrity sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg== dependencies: "@swc/helpers" "^0.5.0" "@ioredis/commands@1.10.0": version "1.10.0" - resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.10.0.tgz#cc387f8ec5ebe5b3b5104d393b5ac1f9cf794b9a" + resolved "https://registry.npmjs.org/@ioredis/commands/-/commands-1.10.0.tgz" integrity sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q== "@istanbuljs/schema@^0.1.2": version "0.1.6" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.6.tgz#8dc9afa2ac1506cb1a58f89940f1c124446c8df3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz" integrity sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw== "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -2062,7 +2042,7 @@ "@jridgewell/remapping@^2.3.5": version "2.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -2070,53 +2050,53 @@ "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": version "0.3.31" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@js-sdsl/ordered-map@^4.4.2": version "4.4.2" - resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + resolved "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz" integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== "@jsep-plugin/assignment@^1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@jsep-plugin/assignment/-/assignment-1.3.0.tgz#fcfc5417a04933f7ceee786e8ab498aa3ce2b242" + resolved "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz" integrity sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ== "@jsep-plugin/regex@^1.0.1", "@jsep-plugin/regex@^1.0.4": version "1.0.4" - resolved "https://registry.yarnpkg.com/@jsep-plugin/regex/-/regex-1.0.4.tgz#cb2fc423220fa71c609323b9ba7f7d344a755fcc" + resolved "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz" integrity sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg== "@jsep-plugin/ternary@^1.0.2": version "1.1.4" - resolved "https://registry.yarnpkg.com/@jsep-plugin/ternary/-/ternary-1.1.4.tgz#1ac778bee799137f116cc108f3bf58b9615c45c3" + resolved "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.4.tgz" integrity sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg== "@keyv/memcache@^1.3.5": version "1.4.1" - resolved "https://registry.yarnpkg.com/@keyv/memcache/-/memcache-1.4.1.tgz#5bd6187dc98fb543d442a9032b280d3dd730c46d" + resolved "https://registry.npmjs.org/@keyv/memcache/-/memcache-1.4.1.tgz" integrity sha512-BoXgJG3xZO6J3JPuJGzbP+gyc1QcqzEK7o0SP7TFdMu+AXJ8LAXflCqJug3BmDNTCnBb3mqUgMr01EOhJ+CqWw== dependencies: json-buffer "^3.0.1" @@ -2124,14 +2104,14 @@ "@keyv/redis@^2.5.3": version "2.8.5" - resolved "https://registry.yarnpkg.com/@keyv/redis/-/redis-2.8.5.tgz#2365eed421c74ec8837572af557ca058c3f47049" + resolved "https://registry.npmjs.org/@keyv/redis/-/redis-2.8.5.tgz" integrity sha512-e9W1faN32A1Wy5726qtorAvPu1Xffh75ngfQQtETQ0hIN/FQtK0RcBTz/OH/vwDvLX8zrzdu0sWq/KoSHDYfVw== dependencies: ioredis "^5.4.1" "@kubernetes/client-node@0.20.0": version "0.20.0" - resolved "https://registry.yarnpkg.com/@kubernetes/client-node/-/client-node-0.20.0.tgz#4447ae27fd6eef3d4830a5a039f3b84ffd5c5913" + resolved "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.20.0.tgz" integrity sha512-xxlv5GLX4FVR/dDKEsmi4SPeuB49aRc35stndyxcC73XnUEEwF39vXbROpHOirmDse8WE9vxOjABnSVS+jb7EA== dependencies: "@types/js-yaml" "^4.0.1" @@ -2153,7 +2133,7 @@ "@manypkg/find-root@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" + resolved "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz" integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== dependencies: "@babel/runtime" "^7.5.5" @@ -2163,7 +2143,7 @@ "@manypkg/get-packages@^1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@manypkg/get-packages/-/get-packages-1.1.3.tgz#e184db9bba792fa4693de4658cfb1463ac2c9c47" + resolved "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz" integrity sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A== dependencies: "@babel/runtime" "^7.5.5" @@ -2175,7 +2155,7 @@ "@material-table/core@^3.1.0": version "3.2.5" - resolved "https://registry.yarnpkg.com/@material-table/core/-/core-3.2.5.tgz#37b3c665bed3ded6c147ad74adb330bf49efb213" + resolved "https://registry.npmjs.org/@material-table/core/-/core-3.2.5.tgz" integrity sha512-TmVN/In15faabezW3COb4Ve5+YhqxFEQnf2Q2Cz3FVXXCFqJvtu3pkRLi+7N9UJ5bvistszz6wfHeiZZY1Rf9Q== dependencies: "@babel/runtime" "^7.12.5" @@ -2191,9 +2171,27 @@ react-double-scrollbar "0.0.15" uuid "^3.4.0" -"@material-ui/core@^4.12.2", "@material-ui/core@^4.9.13": +"@material-ui/core@^4.0.0", "@material-ui/core@^4.11.2", "@material-ui/core@^4.12.1", "@material-ui/core@^4.12.2", "@material-ui/core@^4.9.13": version "4.12.4" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.4.tgz#4ac17488e8fcaf55eb6a7f5efb2a131e10138a73" + resolved "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz" + integrity sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.5" + "@material-ui/system" "^4.12.2" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.3" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + +"@material-ui/core@^4.9.13": + version "4.12.4" + resolved "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz" integrity sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ== dependencies: "@babel/runtime" "^7.4.4" @@ -2211,14 +2209,25 @@ "@material-ui/icons@^4.9.1": version "4.11.3" - resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.3.tgz#b0693709f9b161ce9ccde276a770d968484ecff1" + resolved "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz" integrity sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA== dependencies: "@babel/runtime" "^7.4.4" -"@material-ui/lab@4.0.0-alpha.61", "@material-ui/lab@^4.0.0-alpha.61": +"@material-ui/lab@^4.0.0-alpha.61": version "4.0.0-alpha.61" - resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz#9bf8eb389c0c26c15e40933cc114d4ad85e3d978" + resolved "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz" + integrity sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.3" + clsx "^1.0.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@material-ui/lab@4.0.0-alpha.61": + version "4.0.0-alpha.61" + resolved "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz" integrity sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg== dependencies: "@babel/runtime" "^7.4.4" @@ -2229,7 +2238,7 @@ "@material-ui/pickers@^3.2.10": version "3.3.11" - resolved "https://registry.yarnpkg.com/@material-ui/pickers/-/pickers-3.3.11.tgz#dfaaf49955f7bbe3b1c3720293f69dcddeab3ca4" + resolved "https://registry.npmjs.org/@material-ui/pickers/-/pickers-3.3.11.tgz" integrity sha512-pDYjbjUeabapijS2FpSwK/ruJdk7IGeAshpLbKDa3PRRKRy7Nv6sXxAvUg2F+lID/NwUKgBmCYS5bzrl7Xxqzw== dependencies: "@babel/runtime" "^7.6.0" @@ -2239,9 +2248,31 @@ react-transition-group "^4.0.0" rifm "^0.7.0" -"@material-ui/styles@^4.11.4", "@material-ui/styles@^4.11.5": +"@material-ui/styles@^4.11.4": version "4.11.5" - resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.5.tgz#19f84457df3aafd956ac863dbe156b1d88e2bbfb" + resolved "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz" + integrity sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.3" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.5.1" + jss-plugin-camel-case "^10.5.1" + jss-plugin-default-unit "^10.5.1" + jss-plugin-global "^10.5.1" + jss-plugin-nested "^10.5.1" + jss-plugin-props-sort "^10.5.1" + jss-plugin-rule-value-function "^10.5.1" + jss-plugin-vendor-prefixer "^10.5.1" + prop-types "^15.7.2" + +"@material-ui/styles@^4.11.5": + version "4.11.5" + resolved "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz" integrity sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA== dependencies: "@babel/runtime" "^7.4.4" @@ -2263,7 +2294,7 @@ "@material-ui/system@^4.12.2": version "4.12.2" - resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.2.tgz#f5c389adf3fce4146edd489bf4082d461d86aa8b" + resolved "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz" integrity sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw== dependencies: "@babel/runtime" "^7.4.4" @@ -2273,12 +2304,12 @@ "@material-ui/types@5.1.0": version "5.1.0" - resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + resolved "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz" integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== "@material-ui/utils@^4.11.3": version "4.11.3" - resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.3.tgz#232bd86c4ea81dab714f21edad70b7fdf0253942" + resolved "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz" integrity sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg== dependencies: "@babel/runtime" "^7.4.4" @@ -2287,7 +2318,7 @@ "@modelcontextprotocol/sdk@^1.0.0": version "1.29.0" - resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz#79786d8b525e269de850ac82b1f1f757f3915f44" + resolved "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz" integrity sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ== dependencies: "@hono/node-server" "^1.19.9" @@ -2310,12 +2341,17 @@ "@mui/core-downloads-tracker@^5.18.0": version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz#85019a8704b0f63305fc5600635ee663810f2b66" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz" integrity sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA== +"@mui/core-downloads-tracker@^9.1.1": + version "9.1.1" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.1.1.tgz" + integrity sha512-AupmMICbdJHqAh6FfOMaaiiIr7dfEgZJn5DFfiPuGNrbs+ZZy9cD1APwO0TSVBz5j08MJEEY6n7iC76/2wjMEA== + "@mui/material@^5.12.2": version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.18.0.tgz#71e72d52338252edc6f8d9461e04fdf0d61905cd" + resolved "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz" integrity sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA== dependencies: "@babel/runtime" "^7.23.9" @@ -2331,18 +2367,45 @@ react-is "^19.0.0" react-transition-group "^4.4.5" +"@mui/material@>=5 <10": + version "9.1.1" + resolved "https://registry.npmjs.org/@mui/material/-/material-9.1.1.tgz" + integrity sha512-Wv+gInjrpf99l1Q0oHe0eOWGTnlbkzs5nowClX65KCT/2fyPMwcbFEEkUsOHdpcHhB5UAbz/d7jlwt5ajWVvlA== + dependencies: + "@babel/runtime" "^7.29.2" + "@mui/core-downloads-tracker" "^9.1.1" + "@mui/system" "^9.1.1" + "@mui/types" "^9.1.1" + "@mui/utils" "^9.1.1" + "@popperjs/core" "^2.11.8" + "@types/react-transition-group" "^4.4.12" + clsx "^2.1.1" + csstype "^3.2.3" + prop-types "^15.8.1" + react-is "^19.2.6" + react-transition-group "^4.4.5" + "@mui/private-theming@^5.17.1": version "5.17.1" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.17.1.tgz#b4b6fbece27830754ef78186e3f1307dca42f295" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz" integrity sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ== dependencies: "@babel/runtime" "^7.23.9" "@mui/utils" "^5.17.1" prop-types "^15.8.1" +"@mui/private-theming@^9.1.1": + version "9.1.1" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-9.1.1.tgz" + integrity sha512-oH6c+d6sJ1CZT0Vg2/fHdUQ5zvo9Pn+f+WWk0tlQliHqqIRdN32DZ7UxjalW3LUj4OkHbdWR31biWuLxK9i7Cg== + dependencies: + "@babel/runtime" "^7.29.2" + "@mui/utils" "^9.1.1" + prop-types "^15.8.1" + "@mui/styled-engine@^5.18.0": version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.18.0.tgz#914cca1385bb33ce0cde31721f529c8bd7fa301c" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz" integrity sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg== dependencies: "@babel/runtime" "^7.23.9" @@ -2351,9 +2414,21 @@ csstype "^3.1.3" prop-types "^15.8.1" +"@mui/styled-engine@^9.1.1": + version "9.1.1" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-9.1.1.tgz" + integrity sha512-neaYKdJfvEG54q8efHLJR7swpHG/gfSv9xGqW5iTSMsubD7yPCPFrhVBt284j1DOF3uZaaDJSHQL7gz6jGF21Q== + dependencies: + "@babel/runtime" "^7.29.2" + "@emotion/cache" "^11.14.0" + "@emotion/serialize" "^1.3.3" + "@emotion/sheet" "^1.4.0" + csstype "^3.2.3" + prop-types "^15.8.1" + "@mui/system@^5.18.0": version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.18.0.tgz#e55331203a40584b26c5a855a07949ac8973bfb6" + resolved "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz" integrity sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw== dependencies: "@babel/runtime" "^7.23.9" @@ -2365,14 +2440,35 @@ csstype "^3.1.3" prop-types "^15.8.1" +"@mui/system@^9.1.1": + version "9.1.1" + resolved "https://registry.npmjs.org/@mui/system/-/system-9.1.1.tgz" + integrity sha512-q+aqNa58QZUwmmyUvJKKrStrej+4BcWFw4M0Ug+zRylPIQgR64cqvBnE3QTfLZm4OXulydp8Hl3zwKxMayrdsA== + dependencies: + "@babel/runtime" "^7.29.2" + "@mui/private-theming" "^9.1.1" + "@mui/styled-engine" "^9.1.1" + "@mui/types" "^9.1.1" + "@mui/utils" "^9.1.1" + clsx "^2.1.1" + csstype "^3.2.3" + prop-types "^15.8.1" + +"@mui/types@^9.1.1": + version "9.1.1" + resolved "https://registry.npmjs.org/@mui/types/-/types-9.1.1.tgz" + integrity sha512-Zjt7u8wNvDg40rPTGoL+TnfkpuSKjwubsNSFRH1KAVZLcaV4I3AFNHIFbvH7p4F3alEibSbdd90xAgn5Rnfndg== + dependencies: + "@babel/runtime" "^7.29.2" + "@mui/types@~7.2.15": version "7.2.24" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.24.tgz#5eff63129d9c29d80bbf2d2e561bd0690314dec2" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz" integrity sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw== "@mui/utils@^5.17.1": version "5.17.1" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.17.1.tgz#72ba4ffa79f7bdf69d67458139390f18484b6e6b" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz" integrity sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg== dependencies: "@babel/runtime" "^7.23.9" @@ -2382,27 +2478,39 @@ prop-types "^15.8.1" react-is "^19.0.0" -"@nodable/entities@^2.1.0", "@nodable/entities@^2.2.0": +"@mui/utils@^9.1.1": + version "9.1.1" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-9.1.1.tgz" + integrity sha512-qSNfnkzZMptaaWFFklpDf4NPJztgwsMDVfM/sSDt+wq4ssYSBhLYwwjuB6eS/+p2IUYbeRzHluzXbw0Zn7aI4A== + dependencies: + "@babel/runtime" "^7.29.2" + "@mui/types" "^9.1.1" + "@types/prop-types" "^15.7.15" + clsx "^2.1.1" + prop-types "^15.8.1" + react-is "^19.2.6" + +"@nodable/entities@^2.1.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@nodable/entities/-/entities-2.2.0.tgz#a1d45a992b022591b1c2b03a77935c939375b642" + resolved "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz" integrity sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -2410,7 +2518,7 @@ "@octokit/auth-app@^4.0.0": version "4.0.13" - resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-4.0.13.tgz#53323bee6bfefbb73ea544dd8e6a0144550e13e3" + resolved "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-4.0.13.tgz" integrity sha512-NBQkmR/Zsc+8fWcVIFrwDgNXS7f4XDrkd9LHdi9DPQw1NdGHLviLzRO2ZBwTtepnwHXW5VTrVU9eFGijMUqllg== dependencies: "@octokit/auth-oauth-app" "^5.0.0" @@ -2425,7 +2533,7 @@ "@octokit/auth-oauth-app@^5.0.0": version "5.0.6" - resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-5.0.6.tgz#e5f922623eb261485efc87f5d0d5b509c71caec8" + resolved "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-5.0.6.tgz" integrity sha512-SxyfIBfeFcWd9Z/m1xa4LENTQ3l1y6Nrg31k2Dcb1jS5ov7pmwMJZ6OGX8q3K9slRgVpeAjNA1ipOAMHkieqyw== dependencies: "@octokit/auth-oauth-device" "^4.0.0" @@ -2438,7 +2546,7 @@ "@octokit/auth-oauth-device@^4.0.0": version "4.0.5" - resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.5.tgz#21e981f51ae63d419ca3db0b75e32c85b33fa0da" + resolved "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.5.tgz" integrity sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ== dependencies: "@octokit/oauth-methods" "^2.0.0" @@ -2448,7 +2556,7 @@ "@octokit/auth-oauth-user@^2.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.2.tgz#7091e1b29527e577b16d0f1699d49fe3d39946ff" + resolved "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.2.tgz" integrity sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg== dependencies: "@octokit/auth-oauth-device" "^4.0.0" @@ -2460,12 +2568,12 @@ "@octokit/auth-token@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.4.tgz#70e941ba742bdd2b49bdb7393e821dea8520a3db" + resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz" integrity sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ== -"@octokit/core@^4.2.1": +"@octokit/core@^4.2.1", "@octokit/core@>=3", "@octokit/core@>=4": version "4.2.4" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.4.tgz#d8769ec2b43ff37cc3ea89ec4681a20ba58ef907" + resolved "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz" integrity sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ== dependencies: "@octokit/auth-token" "^3.0.0" @@ -2478,7 +2586,7 @@ "@octokit/endpoint@^7.0.0": version "7.0.6" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.6.tgz#791f65d3937555141fb6c08f91d618a7d645f1e2" + resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz" integrity sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg== dependencies: "@octokit/types" "^9.0.0" @@ -2487,7 +2595,7 @@ "@octokit/graphql@^5.0.0": version "5.0.6" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.6.tgz#9eac411ac4353ccc5d3fca7d76736e6888c5d248" + resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz" integrity sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw== dependencies: "@octokit/request" "^6.0.0" @@ -2496,12 +2604,12 @@ "@octokit/oauth-authorization-url@^5.0.0": version "5.0.0" - resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-5.0.0.tgz#029626ce87f3b31addb98cd0d2355c2381a1c5a1" + resolved "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-5.0.0.tgz" integrity sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg== "@octokit/oauth-methods@^2.0.0": version "2.0.6" - resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-2.0.6.tgz#3a089781e90171cbe8a0efa448a6a60229bdd3fb" + resolved "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-2.0.6.tgz" integrity sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw== dependencies: "@octokit/oauth-authorization-url" "^5.0.0" @@ -2512,12 +2620,12 @@ "@octokit/openapi-types@^18.0.0": version "18.1.1" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.1.1.tgz#09bdfdabfd8e16d16324326da5148010d765f009" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz" integrity sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw== "@octokit/plugin-paginate-rest@^6.1.2": version "6.1.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz#f86456a7a1fe9e58fec6385a85cf1b34072341f8" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz" integrity sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ== dependencies: "@octokit/tsconfig" "^1.0.2" @@ -2525,19 +2633,19 @@ "@octokit/plugin-request-log@^1.0.4": version "1.0.4" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" + resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== "@octokit/plugin-rest-endpoint-methods@^7.1.2": version "7.2.3" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz#37a84b171a6cb6658816c82c4082ac3512021797" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz" integrity sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA== dependencies: "@octokit/types" "^10.0.0" "@octokit/request-error@^3.0.0", "@octokit/request-error@^3.0.3": version "3.0.3" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69" + resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz" integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ== dependencies: "@octokit/types" "^9.0.0" @@ -2546,7 +2654,7 @@ "@octokit/request@^6.0.0", "@octokit/request@^6.2.3": version "6.2.8" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.8.tgz#aaf480b32ab2b210e9dadd8271d187c93171d8eb" + resolved "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz" integrity sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw== dependencies: "@octokit/endpoint" "^7.0.0" @@ -2558,7 +2666,7 @@ "@octokit/rest@^19.0.3": version "19.0.13" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.13.tgz#e799393264edc6d3c67eeda9e5bd7832dcf974e4" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz" integrity sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA== dependencies: "@octokit/core" "^4.2.1" @@ -2568,105 +2676,110 @@ "@octokit/tsconfig@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@octokit/tsconfig/-/tsconfig-1.0.2.tgz#59b024d6f3c0ed82f00d08ead5b3750469125af7" + resolved "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz" integrity sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA== "@octokit/types@^10.0.0": version "10.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-10.0.0.tgz#7ee19c464ea4ada306c43f1a45d444000f419a4a" + resolved "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz" integrity sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg== dependencies: "@octokit/openapi-types" "^18.0.0" "@octokit/types@^9.0.0", "@octokit/types@^9.2.3": version "9.3.2" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.3.2.tgz#3f5f89903b69f6a2d196d78ec35f888c0013cac5" + resolved "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz" integrity sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA== dependencies: "@octokit/openapi-types" "^18.0.0" "@popperjs/core@^2.11.8": version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== "@protobufjs/base64@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== "@protobufjs/codegen@^2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.5.tgz#d9315ad7cf3f30aac70bda3c068443dc6f143659" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz" integrity sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g== "@protobufjs/eventemitter@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz#d512cb26c0ae026091ee2c1167f1be6faf5c842a" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz" integrity sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg== "@protobufjs/fetch@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.1.tgz#4d6fc00c8fb64016a5c81b469d549046350f1065" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz" integrity sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw== dependencies: "@protobufjs/aspromise" "^1.1.1" "@protobufjs/float@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== "@protobufjs/path@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== "@protobufjs/pool@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== "@protobufjs/utf8@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.1.tgz#eaee5900122c110a3dbcb728c0597014a2621774" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz" integrity sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg== "@react-hookz/deep-equal@^1.0.4": version "1.0.4" - resolved "https://registry.yarnpkg.com/@react-hookz/deep-equal/-/deep-equal-1.0.4.tgz#68a71f36cbc88724b3ce6f4036183778b6e7f282" + resolved "https://registry.npmjs.org/@react-hookz/deep-equal/-/deep-equal-1.0.4.tgz" integrity sha512-N56fTrAPUDz/R423pag+n6TXWbvlBZDtTehaGFjK0InmN+V2OFWLE/WmORhmn6Ce7dlwH5+tQN1LJFw3ngTJVg== "@react-hookz/web@^24.0.0": version "24.0.4" - resolved "https://registry.yarnpkg.com/@react-hookz/web/-/web-24.0.4.tgz#7a13d4c2cc65861b926ef6c4452fba00408c8778" + resolved "https://registry.npmjs.org/@react-hookz/web/-/web-24.0.4.tgz" integrity sha512-DcIM6JiZklDyHF6CRD1FTXzuggAkQ+3Ncq2Wln7Kdih8GV6ZIeN9JfS6ZaQxpQUxan8/4n0J2V/R7nMeiSrb2Q== dependencies: "@react-hookz/deep-equal" "^1.0.4" "@react-types/shared@^3.34.0": version "3.35.0" - resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.35.0.tgz#6427fdc266c0a5980679e10ab9df5db5da234f73" + resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.35.0.tgz" integrity sha512-iNWvuzEwANttpQpdlu8nPBtdHb0mcCMj1ZTH//iRB5E/14IAnyRlR25rxH7pNLyzHINsPGEKnWvpwDMCT6vziQ== +"@remix-run/router@1.23.3": + version "1.23.3" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz" + integrity sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q== + "@remixicon/react@>=4.6.0 <4.9.0": version "4.8.0" - resolved "https://registry.yarnpkg.com/@remixicon/react/-/react-4.8.0.tgz#7357dbffce4612149d50e42808c63fd4fedafe90" + resolved "https://registry.npmjs.org/@remixicon/react/-/react-4.8.0.tgz" integrity sha512-cbzR04GKWa3zWdgn0C2i+u/avb167iWeu9gqFO00UGu84meARPAm3oKowDZTU6dlk/WS3UHo6k//LMRM1l7CRw== "@rolldown/pluginutils@1.0.0-beta.27": version "1.0.0-beta.27" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz#47d2bf4cef6d470b22f5831b420f8964e0bf755f" + resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz" integrity sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA== "@rollup/plugin-commonjs@~22.0.2": version "22.0.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz#ee8ca8415cda30d383b4096aad5222435b4b69b6" + resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz" integrity sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -2679,220 +2792,92 @@ "@rollup/pluginutils@^3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== dependencies: "@types/estree" "0.0.39" estree-walker "^1.0.1" picomatch "^2.2.2" -"@rollup/rollup-android-arm-eabi@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.0.tgz#634b0258cc501bef2353cee09a887b434826e81f" - integrity sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ== - -"@rollup/rollup-android-arm64@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.0.tgz#d7804ff9c31c2b8e7c51d966fedac65a4c828578" - integrity sha512-M6s9cr10MibETyo8JsOkq+Lo1+lU6hcvb1MApnUql5qte/5hMEgzlN8/ReIKNfRV8rrqX50W1BX9zoUhC192RA== - -"@rollup/rollup-darwin-arm64@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.0.tgz#f26d03228e48c8bd55ff6be847242308dbfdb50d" - integrity sha512-BqCoMoIbn0keKys+dEAdBa70EtOwV1bEsQCUgU9FdiZmmMge/Zk7LlkYGqbrdHR+Frnt0E1FOanly+rlwvvQzw== - -"@rollup/rollup-darwin-x64@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.0.tgz#6e9037ccfc806a749aa044b063256a26ad32339d" - integrity sha512-SIMzST3VFNXDAbeIWDWiFCNM5qncUBDWaEV7NfE7oZbDt2mgfW4MvbKdbYiGOLoM32gbTv608UMd0XktEYSD7w== - -"@rollup/rollup-freebsd-arm64@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.0.tgz#ff448605b36cc4736a6fea89bd0eb74653f09cbc" - integrity sha512-ezjfSQMP7ArdUsbBwbQIfwAlhE84I2iVnzQNCFSveqV42q+BmKlzVpf7mxv5EchLcoWU4y6/heFzVg1F+hodUQ== - -"@rollup/rollup-freebsd-x64@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.0.tgz#a30fe00a8651b577966022d1db1fb1bd6776105e" - integrity sha512-9+qTWGW9AZRhnUgwtTwzNwcPlL87ngkeN0LA+q1bADvmY9aNvWaF2TFW8BZgnQPYxpDI7+rMVLivcd4V737TAQ== - -"@rollup/rollup-linux-arm-gnueabihf@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.0.tgz#0ba85b63893eb17e11052bd21fe2809afc475a82" - integrity sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ== - -"@rollup/rollup-linux-arm-musleabihf@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.0.tgz#982bf23fcfe4e8e13002912d4073f56a2eea2a39" - integrity sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA== - -"@rollup/rollup-linux-arm64-gnu@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.0.tgz#c94d1e8bd116ea2b569aab37dd04a6ccab74f1ab" - integrity sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g== - -"@rollup/rollup-linux-arm64-musl@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.0.tgz#a7d79014ba3c5dd2d140309730365d413976db24" - integrity sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw== - -"@rollup/rollup-linux-loong64-gnu@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.0.tgz#5dd943c58bda55d8b269426bd60a47dd9c27776e" - integrity sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg== - -"@rollup/rollup-linux-loong64-musl@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.0.tgz#08b1b9d362c64847306fea979b935e93a2590c4e" - integrity sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA== - -"@rollup/rollup-linux-ppc64-gnu@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.0.tgz#1c5de568966d11091281b22bc764ee7adf92667b" - integrity sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w== - -"@rollup/rollup-linux-ppc64-musl@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.0.tgz#4dde1c9b941748ea49e07cfc96c64b18236225cd" - integrity sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg== - -"@rollup/rollup-linux-riscv64-gnu@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.0.tgz#21dd1014033b970dd23189d1d4d3cdab45de7f9a" - integrity sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg== - -"@rollup/rollup-linux-riscv64-musl@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.0.tgz#4664e0bae205a3a18eb6407c10054c4b8dd7f381" - integrity sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg== - -"@rollup/rollup-linux-s390x-gnu@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.0.tgz#b05a6b3af6a0d3c9b9f7be9c253eb4f101a67848" - integrity sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA== - -"@rollup/rollup-linux-x64-gnu@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.0.tgz#85dda72aa08cdc256f80f46d881b2a988bb0cce2" - integrity sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg== - -"@rollup/rollup-linux-x64-musl@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.0.tgz#d79f5be62a484b58a8ec4d5ae23acf7b0eb1a8ff" - integrity sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw== - -"@rollup/rollup-openbsd-x64@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.0.tgz#8ebafe0d66cde1c8ab0a867cd9dcea89e22ee7b1" - integrity sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg== - -"@rollup/rollup-openharmony-arm64@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.0.tgz#105537bcfcb2fd82796518184e995ae4396bb792" - integrity sha512-yTB9TgfWj5wHe5QgktAgXTLLot1gvEjl1NiPPAUiCs4oPrIWFl5V4nC3GrkNdj9LaAU4s94nVrGbGOCqUpyWsg== - -"@rollup/rollup-win32-arm64-msvc@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.0.tgz#08ebcfc01b5b3b106ae074bae3692e94a63b5125" - integrity sha512-5LOhoaesY3doG1c+ac/2JtgREpKoJr5bUHH8tKY0V8di7+uSV6BwLs2PlR0/yzefGOkR+wE7ZolZphHCsyG5Rw== - -"@rollup/rollup-win32-ia32-msvc@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.0.tgz#493005cb0fcab009e866ccdbad3c97c512c2bf4b" - integrity sha512-yYkWHhmbhRTWTnWos5HC4GcPQfjlzzCNbM9e/+GXrLuaBXYA3qSDR9f0Vgufd5S8yX81U8jPKp7ZnAjZFMtRnw== - -"@rollup/rollup-win32-x64-gnu@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.0.tgz#47b40294def035268329d5ffd5364347bf726e5f" - integrity sha512-SoTb6lPg25xZlA2ibwQ++ahCCnH+FP0qmEuafMJ4gznZKOlXioKEAeJLgCrqjM98ACziXM9V1amFjICVL4IFoA== - -"@rollup/rollup-win32-x64-msvc@4.62.0": - version "4.62.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.0.tgz#6850434fdb691e9b2408ded9b65ea357bf83636d" - integrity sha512-5L+T1fMX4RIEBoZzT0+sQ0PhTS36NULFmMXtl1TZo44TMAROIMHbZufSOjVWt/Y622BtxgxtaNOokbTDvfsrZA== +"@rollup/rollup-darwin-arm64@4.61.1": + version "4.61.1" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz" + integrity sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA== "@sinclair/typebox@^0.27.8": version "0.27.10" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz" integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA== -"@smithy/abort-controller@^1.0.1": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-1.1.0.tgz#2da0d73c504b93ca8bb83bdc8d6b8208d73f418b" - integrity sha512-5imgGUlZL4dW4YWdMYAKLmal9ny/tlenM81QZY7xYyb76z9Z/QOg7oM5Ak9HQl8QfFTlGVWwcMXl+54jroRgEQ== - dependencies: - "@smithy/types" "^1.2.0" - tslib "^2.5.0" - -"@smithy/core@^3.24.6", "@smithy/core@^3.25.0": - version "3.25.0" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.25.0.tgz#7247961c444311bdb19125a4802f876e16344b34" - integrity sha512-TTD6el7tvKyafkXBf7XO3jLOE+qVxOTrLjp/fEGiV3BMfUHK/LfdYlQO9YgZvzxC7kqA3H/IhJXNqQgnbgjb7A== +"@smithy/core@^3.24.6", "@smithy/core@^3.24.7": + version "3.24.7" + resolved "https://registry.npmjs.org/@smithy/core/-/core-3.24.7.tgz" + integrity sha512-KoUi4M1f3BG6kzN1FnCwL7oyFptTbyBJKjR6yhSib+JHRdUmM1o+VwsFtJ66NZCkCzVfJMWRHJNo0R0jznp0Pg== dependencies: "@aws-crypto/crc32" "5.2.0" - "@smithy/types" "^4.15.0" + "@smithy/types" "^4.14.4" tslib "^2.6.2" "@smithy/credential-provider-imds@^4.3.7": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.0.tgz#f9fa2ae1a9ddf936c1cc9deaf99f054f2fcce5db" - integrity sha512-pPQmNdEvMJttv9z2kdYxoui83p/nr32zjMf0aMfmzmGmFEgKXUfy0vXiNg0fx4R5XLQzmJBLM9Wg0guEq2/q8A== + version "4.3.9" + resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.9.tgz" + integrity sha512-ZlfJ/4Fa3jYb+3eaohPfG9utX9HmdhFNcFtpoGAhUhdynAOmGXtmigbi7eEiONKM+ykHw8RwKuDEb85Lx7t7fA== dependencies: - "@smithy/core" "^3.25.0" - "@smithy/types" "^4.15.0" + "@smithy/core" "^3.24.7" + "@smithy/types" "^4.14.4" tslib "^2.6.2" "@smithy/fetch-http-handler@^5.4.6": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.5.0.tgz#15ac7cdabffaf919eae1a499b45628ef982556ff" - integrity sha512-OG8kBYAgX7lf32+xLzgirvuLffn1KNoszaSiButt45i2cRa5irk8LQXLYQ5Smij1SBTN4KMNcBsRwRrLPfIGyA== + version "5.4.7" + resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.7.tgz" + integrity sha512-NslaM2ir0N2hisDmzXLstPaVINZheh8SokyOC++kzFPloZucL2R7Y7bS57mSzx/1Fc/fqmn7twjkeezTTrV0EA== dependencies: - "@smithy/core" "^3.25.0" - "@smithy/types" "^4.15.0" + "@smithy/core" "^3.24.7" + "@smithy/types" "^4.14.4" tslib "^2.6.2" "@smithy/is-array-buffer@^2.2.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" + resolved "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz" integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== dependencies: tslib "^2.6.2" "@smithy/node-http-handler@^4.7.6": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.8.0.tgz#515f710b17f6086f0e1eccc85fbd5c4014dac16d" - integrity sha512-Mq7TNt/VhlEWiYRLQGpzUWeUxh899UGpjKh7Ru0WVIDIjnE+cTRAn0NYlFQ6bWfsQnKnpCbWJj86HzmcG0qEdg== + version "4.7.8" + resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.8.tgz" + integrity sha512-f+DbsWUwSbtMu1a/j8Y93KiU1SRg9nyzfjereqn1BJ33QOTUXxdlYvVXMhAYl1vuR1Kmna5aIJe09KSIfyFNYw== dependencies: - "@smithy/core" "^3.25.0" - "@smithy/types" "^4.15.0" + "@smithy/core" "^3.24.7" + "@smithy/types" "^4.14.4" tslib "^2.6.2" "@smithy/signature-v4@^5.4.6": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.5.0.tgz#12879a3a8b37a952fa1f2ba87a273830931ef99c" - integrity sha512-vW6UdK7e7gV2wU/tXRsPq4pMQMusb8VymdVOyIFNA1FtyRmEClRFkYDtYI8UcO/HM0wK3qqjvvQs3HOlbgMbdg== + version "5.4.7" + resolved "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.7.tgz" + integrity sha512-LwQZazFayImv+IOm0S0enoLeUJwmAlhGC5O6YCcLWezyu08dF46GOxPOq35OpBIHkgd7OvNvBStIFwVNyrvoBw== dependencies: - "@smithy/core" "^3.25.0" - "@smithy/types" "^4.15.0" + "@smithy/core" "^3.24.7" + "@smithy/types" "^4.14.4" tslib "^2.6.2" -"@smithy/types@^1.2.0": +"@smithy/types@^1.1.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-1.2.0.tgz#9dc65767b0ee3d6681704fcc67665d6fc9b6a34e" + resolved "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz" integrity sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA== dependencies: tslib "^2.5.0" -"@smithy/types@^4.14.3", "@smithy/types@^4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.15.0.tgz#0346065c3e810755428df89c9a84427969931357" - integrity sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg== +"@smithy/types@^4.14.3", "@smithy/types@^4.14.4": + version "4.14.4" + resolved "https://registry.npmjs.org/@smithy/types/-/types-4.14.4.tgz" + integrity sha512-B2S9+UGm1+/pHkcx3ZoLVX1a+pmSk8rqxRR+ZsNqZaJ5q9FWX9AFGQVM4qG5+OBeQUZVy99HY8HqW8gK/wgXzQ== dependencies: tslib "^2.6.2" "@smithy/util-buffer-from@^2.2.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" + resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz" integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== dependencies: "@smithy/is-array-buffer" "^2.2.0" @@ -2900,7 +2885,7 @@ "@smithy/util-utf8@^2.0.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" + resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz" integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== dependencies: "@smithy/util-buffer-from" "^2.2.0" @@ -2908,7 +2893,7 @@ "@so-ric/colorspace@^1.1.6": version "1.1.6" - resolved "https://registry.yarnpkg.com/@so-ric/colorspace/-/colorspace-1.1.6.tgz#62515d8b9f27746b76950a83bde1af812d91923b" + resolved "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz" integrity sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw== dependencies: color "^5.0.2" @@ -2916,12 +2901,12 @@ "@standard-schema/spec@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + resolved "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz" integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== "@stoplight/better-ajv-errors@1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz#d74a5c4da5d786c17188d7f4edec505f089885fa" + resolved "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz" integrity sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA== dependencies: jsonpointer "^5.0.0" @@ -2929,7 +2914,7 @@ "@stoplight/json-ref-readers@1.2.2": version "1.2.2" - resolved "https://registry.yarnpkg.com/@stoplight/json-ref-readers/-/json-ref-readers-1.2.2.tgz#e5992bae597f228f988f362a4c0304c03a92008b" + resolved "https://registry.npmjs.org/@stoplight/json-ref-readers/-/json-ref-readers-1.2.2.tgz" integrity sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ== dependencies: node-fetch "^2.6.0" @@ -2937,7 +2922,7 @@ "@stoplight/json-ref-resolver@~3.1.6": version "3.1.6" - resolved "https://registry.yarnpkg.com/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz#dcf8724472b7d54e8e8952510f39b8ee901dcf56" + resolved "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz" integrity sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A== dependencies: "@stoplight/json" "^3.21.0" @@ -2953,7 +2938,7 @@ "@stoplight/json@^3.17.0", "@stoplight/json@^3.17.1", "@stoplight/json@^3.20.1", "@stoplight/json@^3.21.0", "@stoplight/json@~3.21.0": version "3.21.7" - resolved "https://registry.yarnpkg.com/@stoplight/json/-/json-3.21.7.tgz#102f5fd11921984c96672ce4307850daa1cbfc7b" + resolved "https://registry.npmjs.org/@stoplight/json/-/json-3.21.7.tgz" integrity sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A== dependencies: "@stoplight/ordered-object-literal" "^1.0.3" @@ -2965,17 +2950,17 @@ "@stoplight/ordered-object-literal@^1.0.1", "@stoplight/ordered-object-literal@^1.0.3", "@stoplight/ordered-object-literal@^1.0.5", "@stoplight/ordered-object-literal@~1.0.4": version "1.0.5" - resolved "https://registry.yarnpkg.com/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz#06689095a4f1a53e9d9a5f0055f707c387af966a" + resolved "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz" integrity sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg== -"@stoplight/path@1.3.2", "@stoplight/path@^1.3.2": +"@stoplight/path@^1.3.2", "@stoplight/path@1.3.2": version "1.3.2" - resolved "https://registry.yarnpkg.com/@stoplight/path/-/path-1.3.2.tgz#96e591496b72fde0f0cdae01a61d64f065bd9ede" + resolved "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz" integrity sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ== -"@stoplight/spectral-core@1.23.0", "@stoplight/spectral-core@>=1", "@stoplight/spectral-core@^1.23.0": +"@stoplight/spectral-core@^1.23.0", "@stoplight/spectral-core@>=1", "@stoplight/spectral-core@1.23.0": version "1.23.0" - resolved "https://registry.yarnpkg.com/@stoplight/spectral-core/-/spectral-core-1.23.0.tgz#af02ae6d09e882718e9d21a5d3193edf6642df7d" + resolved "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.23.0.tgz" integrity sha512-WvdgmiiJrjiMrcw7ByxfcYtUvAXNp2MhAfcEIXP3Mn8ZOVwyAWIsFjLlsE5zRqj0LuN8+7OQM/L+BMcHj6x/BQ== dependencies: "@stoplight/better-ajv-errors" "1.0.3" @@ -3002,7 +2987,7 @@ "@stoplight/spectral-formats@^1.8.1", "@stoplight/spectral-formats@^1.8.3": version "1.8.3" - resolved "https://registry.yarnpkg.com/@stoplight/spectral-formats/-/spectral-formats-1.8.3.tgz#e0533ad1a97e35bbce646af590027c85034283c1" + resolved "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.8.3.tgz" integrity sha512-lfYzkHYS2mZQdm3k+TQ0lvXZ66vdBzJuy6awA4kXgQ0jWBbOC/FHzhBk5BaIVo2QRLUAGjMqWSd72WFryi+EvA== dependencies: "@stoplight/json" "^3.17.0" @@ -3010,9 +2995,9 @@ "@types/json-schema" "^7.0.7" tslib "^2.8.1" -"@stoplight/spectral-functions@>=1", "@stoplight/spectral-functions@^1.9.1": +"@stoplight/spectral-functions@^1.9.1", "@stoplight/spectral-functions@>=1": version "1.10.3" - resolved "https://registry.yarnpkg.com/@stoplight/spectral-functions/-/spectral-functions-1.10.3.tgz#b8e7b71531a8609cd36daa71e17368e3203941bc" + resolved "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.10.3.tgz" integrity sha512-AM7Gbh7pv1Mpc6fdVuR7N6C5t5KT3QKDHeBPA27Cw/GAch1VJnHkCV9R/SxDrvOgZ3tL1xrtAGFuNFwRvVdz3g== dependencies: "@stoplight/better-ajv-errors" "1.0.3" @@ -3027,9 +3012,9 @@ lodash "^4.18.1" tslib "^2.8.1" -"@stoplight/spectral-parsers@>=1", "@stoplight/spectral-parsers@^1.0.0", "@stoplight/spectral-parsers@^1.0.5": +"@stoplight/spectral-parsers@^1.0.0", "@stoplight/spectral-parsers@^1.0.5", "@stoplight/spectral-parsers@>=1": version "1.0.5" - resolved "https://registry.yarnpkg.com/@stoplight/spectral-parsers/-/spectral-parsers-1.0.5.tgz#2febd979b2917465759c97fe7375145f86574ff2" + resolved "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.5.tgz" integrity sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ== dependencies: "@stoplight/json" "~3.21.0" @@ -3039,7 +3024,7 @@ "@stoplight/spectral-ref-resolver@^1.0.4": version "1.0.5" - resolved "https://registry.yarnpkg.com/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.5.tgz#2462ae79bbb90b7fcc76b014118a0beeee5e64d5" + resolved "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.5.tgz" integrity sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA== dependencies: "@stoplight/json-ref-readers" "1.2.2" @@ -3050,7 +3035,7 @@ "@stoplight/spectral-ruleset-bundler@^1.7.0": version "1.7.0" - resolved "https://registry.yarnpkg.com/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.7.0.tgz#cd03640716d6def080029f86f19f45eb8a0218c2" + resolved "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.7.0.tgz" integrity sha512-PpIdj5Wje0T7ktxY8EUzBWLU0+mGGQHznT8nlQxTMnRhWLNYsm6HvSZDXLtMi+86yqvTuf7loJy6JvLBDzHGAA== dependencies: "@rollup/plugin-commonjs" "~22.0.2" @@ -3072,7 +3057,7 @@ "@stoplight/spectral-ruleset-migrator@^1.9.6": version "1.12.1" - resolved "https://registry.yarnpkg.com/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.12.1.tgz#f55d7ebc7208979ef64fb1394c5d9788f7399f9d" + resolved "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.12.1.tgz" integrity sha512-IUEbDmmTro0oF6VoAtrUySRV/b6bvYmV7wV6lB99f0Ym5lF9M2DXcgPLo7VMbKTPjCOQcaBzWRnIMXAyLjIRMA== dependencies: "@stoplight/json" "~3.21.0" @@ -3090,9 +3075,9 @@ tslib "^2.8.1" validate-npm-package-name "3.0.0" -"@stoplight/spectral-rulesets@>=1", "@stoplight/spectral-rulesets@^1.22.4": +"@stoplight/spectral-rulesets@^1.22.4", "@stoplight/spectral-rulesets@>=1": version "1.22.4" - resolved "https://registry.yarnpkg.com/@stoplight/spectral-rulesets/-/spectral-rulesets-1.22.4.tgz#fd5a3532da6f7c7f97a0061009b86f2eeae7dffb" + resolved "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.22.4.tgz" integrity sha512-Lwr4DVg8aEqiBcm2CMQAP1FIBmLP9Y8Z2st7jvbxzv3fXmThdafVMy6CrydWH46T4Wotm+UuBJFnqJd9H4RQZQ== dependencies: "@asyncapi/specs" "^6.8.0" @@ -3113,7 +3098,7 @@ "@stoplight/spectral-runtime@^1.1.2": version "1.1.5" - resolved "https://registry.yarnpkg.com/@stoplight/spectral-runtime/-/spectral-runtime-1.1.5.tgz#02b05c439fa35ec28c2a534b2f473887f7b5d034" + resolved "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.5.tgz" integrity sha512-6/HSCQBKnI4M5qonCKos2W7oggXv+U/ml+m/cAd4eJAYfIVEmaLUo03qSWIIl4cBc5ujJPmn2WnCiRrz1++P7Q== dependencies: "@stoplight/json" "^3.20.1" @@ -3124,43 +3109,35 @@ node-fetch "^2.7.0" tslib "^2.8.1" -"@stoplight/types@^12.3.0 || ^13.0.0", "@stoplight/types@^13.0.0", "@stoplight/types@^13.6.0": - version "13.20.0" - resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-13.20.0.tgz#d42682f1e3a14a3c60bdf0df08bff4023518763d" - integrity sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA== +"@stoplight/types@^12.3.0 || ^13.0.0", "@stoplight/types@^13.0.0", "@stoplight/types@^13.6.0", "@stoplight/types@~13.6.0": + version "13.6.0" + resolved "https://registry.npmjs.org/@stoplight/types/-/types-13.6.0.tgz" + integrity sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ== dependencies: "@types/json-schema" "^7.0.4" utility-types "^3.10.0" "@stoplight/types@^14.1.1": version "14.1.1" - resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-14.1.1.tgz#0dd5761aac25673a951955e984c724c138368b7a" + resolved "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz" integrity sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g== dependencies: "@types/json-schema" "^7.0.4" utility-types "^3.10.0" -"@stoplight/types@~13.6.0": - version "13.6.0" - resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-13.6.0.tgz#96c6aaae05858b36f589821cd52c95aa9b205ce7" - integrity sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ== - dependencies: - "@types/json-schema" "^7.0.4" - utility-types "^3.10.0" - "@stoplight/yaml-ast-parser@0.0.48": version "0.0.48" - resolved "https://registry.yarnpkg.com/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.48.tgz#442b21f419427acaa8a3106ebc5d73351c407002" + resolved "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.48.tgz" integrity sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg== "@stoplight/yaml-ast-parser@0.0.50": version "0.0.50" - resolved "https://registry.yarnpkg.com/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz#ed625a1d9ae63eb61980446e058fa745386ab61e" + resolved "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz" integrity sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ== "@stoplight/yaml@^4.3.0", "@stoplight/yaml@~4.3.0": version "4.3.0" - resolved "https://registry.yarnpkg.com/@stoplight/yaml/-/yaml-4.3.0.tgz#ca403157472509812ccec6f277185e7e65d7bd7d" + resolved "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.3.0.tgz" integrity sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w== dependencies: "@stoplight/ordered-object-literal" "^1.0.5" @@ -3170,7 +3147,7 @@ "@stoplight/yaml@~4.2.3": version "4.2.3" - resolved "https://registry.yarnpkg.com/@stoplight/yaml/-/yaml-4.2.3.tgz#d177664fecd6b2fd0d4f264f1078550c30cfd8d1" + resolved "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.2.3.tgz" integrity sha512-Mx01wjRAR9C7yLMUyYFTfbUf5DimEpHMkRDQ1PKLe9dfNILbgdxyrncsOXM3vCpsQ1Hfj4bPiGl+u4u6e9Akqw== dependencies: "@stoplight/ordered-object-literal" "^1.0.1" @@ -3180,26 +3157,26 @@ "@swc/helpers@^0.5.0": version "0.5.23" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.23.tgz#19287d0d86d962b111376039a50c792902c9a86a" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz" integrity sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw== dependencies: tslib "^2.8.0" "@tanstack/react-table@^8.21.3": version "8.21.3" - resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.21.3.tgz#2c38c747a5731c1a07174fda764b9c2b1fb5e91b" + resolved "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz" integrity sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww== dependencies: "@tanstack/table-core" "8.21.3" "@tanstack/table-core@8.21.3": version "8.21.3" - resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.21.3.tgz#2977727d8fc8dfa079112d9f4d4c019110f1732c" + resolved "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz" integrity sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg== -"@testing-library/dom@^10.4.1": +"@testing-library/dom@^10.0.0", "@testing-library/dom@^10.4.1": version "10.4.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.1.tgz#d444f8a889e9a46e9a3b4f3b88e0fcb3efb6cf95" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz" integrity sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg== dependencies: "@babel/code-frame" "^7.10.4" @@ -3213,44 +3190,44 @@ "@testing-library/react@^16.0.0", "@testing-library/react@^16.3.2": version "16.3.2" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.3.2.tgz#672883b7acb8e775fc0492d9e9d25e06e89786d0" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz" integrity sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g== dependencies: "@babel/runtime" "^7.12.5" "@tootallnate/once@2": version "2.0.1" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.1.tgz#35adc6222e3662fa2222ce123b961476a746b9ea" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz" integrity sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ== "@tsconfig/node10@^1.0.7": version "1.0.12" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz" integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/aria-query@^5.0.1": version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== "@types/babel__core@^7.20.5": version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" @@ -3261,14 +3238,14 @@ "@types/babel__generator@*": version "7.27.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz" integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" @@ -3276,14 +3253,14 @@ "@types/babel__traverse@*": version "7.28.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz" integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== dependencies: "@babel/types" "^7.28.2" "@types/body-parser@*": version "1.19.6" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz" integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== dependencies: "@types/connect" "*" @@ -3291,38 +3268,38 @@ "@types/btoa-lite@^1.0.0": version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/btoa-lite/-/btoa-lite-1.0.2.tgz#82bb6aab00abf7cff3ca2825abe010c0cd536ae5" + resolved "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.2.tgz" integrity sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg== "@types/caseless@*": version "0.12.5" - resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" + resolved "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz" integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== "@types/connect@*": version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/cors@^2.8.6": version "2.8.19" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.19.tgz#d93ea2673fd8c9f697367f5eeefc2bbfa94f0342" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz" integrity sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg== dependencies: "@types/node" "*" "@types/debug@^4.0.0": version "4.1.13" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.13.tgz#22d1cc9d542d3593caea764f974306ab36286ee7" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz" integrity sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw== dependencies: "@types/ms" "*" "@types/docker-modem@*": version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/docker-modem/-/docker-modem-3.0.6.tgz#1f9262fcf85425b158ca725699a03eb23cddbf87" + resolved "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz" integrity sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg== dependencies: "@types/node" "*" @@ -3330,7 +3307,7 @@ "@types/dockerode@^3.3.0": version "3.3.47" - resolved "https://registry.yarnpkg.com/@types/dockerode/-/dockerode-3.3.47.tgz#cf8c6b4efcd0bb28b0e6009e613e7faab1b96e75" + resolved "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.47.tgz" integrity sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw== dependencies: "@types/docker-modem" "*" @@ -3339,29 +3316,44 @@ "@types/es-aggregate-error@^1.0.2": version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz#1472dfb0fb1cb4c3f2bd3b2a7b7e19f60a1d66c0" + resolved "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz" integrity sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg== dependencies: "@types/node" "*" "@types/esrecurse@^4.3.1": version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" + resolved "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz" integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== -"@types/estree@*", "@types/estree@1.0.9", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@^1.0.8": +"@types/estree@*", "@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/estree@^1.0.0": version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz" integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/estree@^1.0.6": + version "1.0.9" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== + +"@types/estree@^1.0.8": + version "1.0.9" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== + +"@types/estree@1.0.9": + version "1.0.9" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== "@types/express-serve-static-core@^4.17.33": version "4.19.8" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz#99b960322a4d576b239a640ab52ef191989b036f" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz" integrity sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA== dependencies: "@types/node" "*" @@ -3369,28 +3361,9 @@ "@types/range-parser" "*" "@types/send" "*" -"@types/express-serve-static-core@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz#1a77faffee9572d39124933259be2523837d7eaa" - integrity sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.6.tgz#2d724b2c990dcb8c8444063f3580a903f6d500cc" - integrity sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/serve-static" "^2" - -"@types/express@^4.17.0", "@types/express@^4.17.6": +"@types/express@*", "@types/express@^4.0.0", "@types/express@^4.17.0", "@types/express@^4.17.6": version "4.17.25" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.25.tgz#070c8c73a6fee6936d65c195dbbfb7da5026649b" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz" integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== dependencies: "@types/body-parser" "*" @@ -3400,41 +3373,41 @@ "@types/hast@^2.0.0": version "2.3.10" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz" integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: "@types/unist" "^2" "@types/hoist-non-react-statics@^3.3.0": version "3.3.7" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz#306e3a3a73828522efa1341159da4846e7573a6c" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz" integrity sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g== dependencies: hoist-non-react-statics "^3.3.0" "@types/http-errors@*": version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz" integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== "@types/js-cookie@^3.0.0": version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-3.0.6.tgz#a04ca19e877687bd449f5ad37d33b104b71fdf95" + resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz" integrity sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ== "@types/js-yaml@^4.0.1": version "4.0.9" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" + resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz" integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== "@types/json-schema@^7.0.11", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.7": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/jsonwebtoken@^9.0.0": version "9.0.10" - resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz#a7932a47177dcd4283b6146f3bd5c26d82647f09" + resolved "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz" integrity sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA== dependencies: "@types/ms" "*" @@ -3442,101 +3415,94 @@ "@types/luxon@^3.0.0": version "3.7.1" - resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.7.1.tgz#ef51b960ff86801e4e2de80c68813a96e529d531" + resolved "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz" integrity sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg== "@types/mdast@^3.0.0": version "3.0.15" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz" integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: "@types/unist" "^2" "@types/mime@^1": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/ms@*": version "2.1.0" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node-forge@^1.3.0": version "1.3.14" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.14.tgz#006c2616ccd65550560c2757d8472eb6d3ecea0b" + resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz" integrity sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw== dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=13.7.0": - version "25.9.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.3.tgz#11dfe7a33e68fa5c560f0aa76cc5595621ef26b9" - integrity sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg== +"@types/node@*", "@types/node@^18.0.0 || >=20.0.0", "@types/node@^20.1.1", "@types/node@^20.12.0", "@types/node@>= 8", "@types/node@>=13.7.0": + version "20.19.43" + resolved "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz" + integrity sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA== dependencies: - undici-types ">=7.24.0 <7.24.7" + undici-types "~6.21.0" "@types/node@^12.7.1": version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/node@^18.11.18": version "18.19.130" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.130.tgz#da4c6324793a79defb7a62cba3947ec5add00d59" + resolved "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz" integrity sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg== dependencies: undici-types "~5.26.4" -"@types/node@^20.1.1", "@types/node@^20.12.0": - version "20.19.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.43.tgz#fcecf580ba42a0db55cf404c372c97973c376c97" - integrity sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA== - dependencies: - undici-types "~6.21.0" - "@types/node@^24.10.2": version "24.13.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.13.2.tgz#3b9b280a7055128359f125eb1067d9a190f39854" + resolved "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz" integrity sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA== dependencies: undici-types "~7.18.0" "@types/parse-json@^4.0.0": version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/parse5@^6.0.0": version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" + resolved "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz" integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== "@types/passport@^1.0.3": version "1.0.17" - resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.17.tgz#718a8d1f7000ebcf6bbc0853da1bc8c4bc7ea5e6" + resolved "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz" integrity sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg== dependencies: "@types/express" "*" -"@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.12", "@types/prop-types@^15.7.3": +"@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.12", "@types/prop-types@^15.7.15", "@types/prop-types@^15.7.3": version "15.7.15" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz" integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== "@types/qs@*": version "6.15.1" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.1.tgz#8606884272c63f0db96986bd3548650d8a9388bf" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz" integrity sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw== "@types/range-parser@*": version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react-redux@^7.1.20": version "7.1.34" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.34.tgz#83613e1957c481521e6776beeac4fd506d11bd0e" + resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz" integrity sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ== dependencies: "@types/hoist-non-react-statics" "^3.3.0" @@ -3546,34 +3512,36 @@ "@types/react-sparklines@^1.7.0": version "1.7.5" - resolved "https://registry.yarnpkg.com/@types/react-sparklines/-/react-sparklines-1.7.5.tgz#8f96d5112ae3e7b6e4c5b6be57d79909f853ef5e" + resolved "https://registry.npmjs.org/@types/react-sparklines/-/react-sparklines-1.7.5.tgz" integrity sha512-rIAmNyRKUqWWnaQMjNrxMNkgEFi5f9PrdczSNxj5DscAa48y4i9P0fRKZ72FmNcFsdg6Jx4o6CXWZtIaC0OJOg== dependencies: "@types/react" "*" -"@types/react-transition-group@^4.2.0", "@types/react-transition-group@^4.4.10": +"@types/react-transition-group@^4.2.0", "@types/react-transition-group@^4.4.10", "@types/react-transition-group@^4.4.12": version "4.4.12" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz" integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== -"@types/react@*": - version "19.2.17" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.17.tgz#dccac365baa0f1734ec270ff4b51c89465e8dc7f" - integrity sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw== +"@types/react@*", "@types/react@^16.8.0 || ^17 || ^18 || ^19", "@types/react@^16.8.6 || ^17.0.0", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^18.0.0", "@types/react@^18.0.0 || ^19.0.0", "@types/react@>=16": + version "18.3.31" + resolved "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz" + integrity sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw== dependencies: + "@types/prop-types" "*" csstype "^3.2.2" -"@types/react@^16.13.1 || ^17.0.0 || ^18.0.0", "@types/react@^18.0.0": - version "18.3.31" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.31.tgz#b5e95e28ffcceab8d982f33f2eb076e17653c2a4" - integrity sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw== +"@types/react@^16.13.1 || ^17.0.0 || ^18.0.0": + version "17.0.93" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.93.tgz" + integrity sha512-KM4Ty/ZTLZupiYxZVAlP+InNJS3De6uBMdq0ePa6/04+eG9Y7ftnWfst1xTLQ5rwAhgHwQ4momt/O4KepdGBTw== dependencies: "@types/prop-types" "*" + "@types/scheduler" "^0.16" csstype "^3.2.2" "@types/request@^2.47.1", "@types/request@^2.48.8": version "2.48.13" - resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.13.tgz#abdf4256524e801ea8fdda54320f083edb5a6b80" + resolved "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz" integrity sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg== dependencies: "@types/caseless" "*" @@ -3581,16 +3549,21 @@ "@types/tough-cookie" "*" form-data "^2.5.5" +"@types/scheduler@^0.16": + version "0.16.8" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + "@types/send@*": version "1.2.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-1.2.1.tgz#6a784e45543c18c774c049bff6d3dbaf045c9c74" + resolved "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz" integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== dependencies: "@types/node" "*" "@types/send@<1": version "0.17.6" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.6.tgz#aeb5385be62ff58a52cd5459daa509ae91651d25" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz" integrity sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== dependencies: "@types/mime" "^1" @@ -3598,70 +3571,62 @@ "@types/serve-static@^1": version "1.15.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.10.tgz#768169145a778f8f5dfcb6360aead414a3994fee" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz" integrity sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== dependencies: "@types/http-errors" "*" "@types/node" "*" - "@types/send" "<1" - -"@types/serve-static@^2": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-2.2.0.tgz#d4a447503ead0d1671132d1ab6bd58b805d8de6a" - integrity sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" + "@types/send" "<1" "@types/ssh2@*": version "1.15.5" - resolved "https://registry.yarnpkg.com/@types/ssh2/-/ssh2-1.15.5.tgz#6d8f45db2f39519b8d9377268fa71ed77d969686" + resolved "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz" integrity sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ== dependencies: "@types/node" "^18.11.18" "@types/styled-jsx@^2.2.8": version "2.2.9" - resolved "https://registry.yarnpkg.com/@types/styled-jsx/-/styled-jsx-2.2.9.tgz#e50b3f868c055bcbf9bc353eca6c10fdad32a53f" + resolved "https://registry.npmjs.org/@types/styled-jsx/-/styled-jsx-2.2.9.tgz" integrity sha512-W/iTlIkGEyTBGTEvZCey8EgQlQ5l0DwMqi3iOXlLs2kyBwYTXHKEiU6IZ5EwoRwngL8/dGYuzezSup89ttVHLw== dependencies: "@types/react" "*" "@types/tough-cookie@*": version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz" integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== "@types/triple-beam@^1.3.2": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== "@types/unist@^2", "@types/unist@^2.0.0": version "2.0.11" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== "@types/urijs@^1.19.19": version "1.19.26" - resolved "https://registry.yarnpkg.com/@types/urijs/-/urijs-1.19.26.tgz#500fc9912e0ba01d635480970bdc9ba0f45d7bc6" + resolved "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.26.tgz" integrity sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg== "@types/webpack-env@^1.15.2": version "1.18.8" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.18.8.tgz#71f083718c094204d7b64443701d32f1db3989e3" + resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz" integrity sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A== "@types/ws@^8.5.3": version "8.18.1" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz" integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== dependencies: "@types/node" "*" "@typescript-eslint/eslint-plugin@8.61.1": version "8.61.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz#6e4b7fee21f1983308e9e9b634ecbaf702c86006" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz" integrity sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ== dependencies: "@eslint-community/regexpp" "^4.12.2" @@ -3673,9 +3638,9 @@ natural-compare "^1.4.0" ts-api-utils "^2.5.0" -"@typescript-eslint/parser@8.61.1": +"@typescript-eslint/parser@^8.61.1", "@typescript-eslint/parser@8.61.1": version "8.61.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.61.1.tgz#881fba60b50636249cdeea2e547bf75715254c72" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz" integrity sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg== dependencies: "@typescript-eslint/scope-manager" "8.61.1" @@ -3686,7 +3651,7 @@ "@typescript-eslint/project-service@8.61.1": version "8.61.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.61.1.tgz#fcd9739964a40867eed55f1ac318d3909f24b4af" + resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz" integrity sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA== dependencies: "@typescript-eslint/tsconfig-utils" "^8.61.1" @@ -3695,20 +3660,20 @@ "@typescript-eslint/scope-manager@8.61.1": version "8.61.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz#2479921a40fdb0afa18f5838fae6167264b417b2" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz" integrity sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w== dependencies: "@typescript-eslint/types" "8.61.1" "@typescript-eslint/visitor-keys" "8.61.1" -"@typescript-eslint/tsconfig-utils@8.61.1", "@typescript-eslint/tsconfig-utils@^8.61.1": +"@typescript-eslint/tsconfig-utils@^8.61.1", "@typescript-eslint/tsconfig-utils@8.61.1": version "8.61.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz#ca88080e0cf191d49516d7f300b67aa090d2254f" + resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz" integrity sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg== "@typescript-eslint/type-utils@8.61.1": version "8.61.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz#8fa18f453ee140893b47d339d1a6b64cac9b08a1" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz" integrity sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw== dependencies: "@typescript-eslint/types" "8.61.1" @@ -3717,14 +3682,14 @@ debug "^4.4.3" ts-api-utils "^2.5.0" -"@typescript-eslint/types@8.61.1", "@typescript-eslint/types@^8.61.1": +"@typescript-eslint/types@^8.61.1", "@typescript-eslint/types@8.61.1": version "8.61.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.61.1.tgz#0c51f518e4e6848371a1c988e859d59eb7522d5a" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz" integrity sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA== "@typescript-eslint/typescript-estree@8.61.1": version "8.61.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz#febbe70365ac0bf7611262b61b338fc8797965c7" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz" integrity sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg== dependencies: "@typescript-eslint/project-service" "8.61.1" @@ -3739,7 +3704,7 @@ "@typescript-eslint/utils@8.61.1": version "8.61.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.61.1.tgz#ffd1054de7dd33b7873cd6c6713ec6b0366316d3" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz" integrity sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA== dependencies: "@eslint-community/eslint-utils" "^4.9.1" @@ -3749,7 +3714,7 @@ "@typescript-eslint/visitor-keys@8.61.1": version "8.61.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz#546cf102b4efdb72a9a08e63a1b0d7d745eb66eb" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz" integrity sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w== dependencies: "@typescript-eslint/types" "8.61.1" @@ -3757,7 +3722,7 @@ "@typespec/ts-http-runtime@^0.3.0", "@typespec/ts-http-runtime@^0.3.4": version "0.3.6" - resolved "https://registry.yarnpkg.com/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.6.tgz#eda78b5fffb39ca86a4dadbb5a0c2600131d3570" + resolved "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.6.tgz" integrity sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og== dependencies: http-proxy-agent "^7.0.0" @@ -3766,7 +3731,7 @@ "@vitejs/plugin-react@^4.0.0": version "4.7.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz#647af4e7bb75ad3add578e762ad984b90f4a24b9" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz" integrity sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA== dependencies: "@babel/core" "^7.28.0" @@ -3778,7 +3743,7 @@ "@vitest/coverage-v8@^1.6.0": version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-1.6.1.tgz#47230491ec73aa288a92e36b75c1671b3f741d4e" + resolved "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.1.tgz" integrity sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw== dependencies: "@ampproject/remapping" "^2.2.1" @@ -3797,7 +3762,7 @@ "@vitest/expect@1.6.1": version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.1.tgz#b90c213f587514a99ac0bf84f88cff9042b0f14d" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz" integrity sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog== dependencies: "@vitest/spy" "1.6.1" @@ -3806,7 +3771,7 @@ "@vitest/runner@1.6.1": version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.1.tgz#10f5857c3e376218d58c2bfacfea1161e27e117f" + resolved "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz" integrity sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA== dependencies: "@vitest/utils" "1.6.1" @@ -3815,7 +3780,7 @@ "@vitest/snapshot@1.6.1": version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.1.tgz#90414451a634bb36cd539ccb29ae0d048a8c0479" + resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz" integrity sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ== dependencies: magic-string "^0.30.5" @@ -3824,14 +3789,14 @@ "@vitest/spy@1.6.1": version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.1.tgz#33376be38a5ed1ecd829eb986edaecc3e798c95d" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz" integrity sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw== dependencies: tinyspy "^2.2.0" "@vitest/utils@1.6.1": version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.1.tgz#6d2f36cb6d866f2bbf59da854a324d6bf8040f17" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz" integrity sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g== dependencies: diff-sequences "^29.6.3" @@ -3841,19 +3806,19 @@ "@xobotyi/scrollbar-width@^1.9.5": version "1.9.5" - resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" + resolved "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz" integrity sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ== abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" accepts@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" + resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz" integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== dependencies: mime-types "^3.0.0" @@ -3861,7 +3826,7 @@ accepts@^2.0.0: accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -3869,60 +3834,70 @@ accepts@~1.3.8: acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1, acorn-walk@^8.3.2, acorn-walk@^8.3.4: version "8.3.5" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz" integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== dependencies: acorn "^8.11.0" -acorn@^8.11.0, acorn@^8.15.0, acorn@^8.16.0, acorn@^8.4.1: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.11.0, acorn@^8.15.0, acorn@^8.16.0, acorn@^8.4.1: version "8.17.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.17.0.tgz#1785adb84faf8d8add10369b93826fc2bd08f1fe" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz" integrity sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg== +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" -agent-base@^7.1.0, agent-base@^7.1.2: - version "7.1.4" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" - integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== - ajv-draft-04@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + resolved "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz" integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== ajv-errors@^3.0.0, ajv-errors@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-3.0.0.tgz#e54f299f3a3d30fe144161e5f0d8d51196c527bc" + resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz" integrity sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ== ajv-formats@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz" integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== dependencies: ajv "^8.0.0" ajv-formats@~2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" -ajv@^6.12.3, ajv@^6.14.0: +ajv@^6.12.3: + version "6.15.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.14.0: version "6.15.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz" integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== dependencies: fast-deep-equal "^3.1.1" @@ -3930,9 +3905,9 @@ ajv@^6.12.3, ajv@^6.14.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.10.0, ajv@^8.17.1, ajv@^8.18.0: +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.10.0, ajv@^8.17.1, ajv@^8.18.0, ajv@^8.5.0, ajv@>=8: version "8.20.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz" integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== dependencies: fast-deep-equal "^3.1.3" @@ -3942,34 +3917,34 @@ ajv@^8.0.0, ajv@^8.10.0, ajv@^8.17.1, ajv@^8.18.0: ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1, ansi-regex@^6.2.2: version "6.2.2" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== ansi-styles@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi-styles@^6.2.1: version "6.2.3" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -3977,12 +3952,12 @@ anymatch@~3.1.2: anynum@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/anynum/-/anynum-1.0.0.tgz#afe3f3a78c6621fbdf1e107154fac01eef711cc5" + resolved "https://registry.npmjs.org/anynum/-/anynum-1.0.0.tgz" integrity sha512-xjR9/zBVnUOP6ztMIIgShjsxui80nQUQH+5xJnvrYLs+90bF25/KJqaAi8mk+B4RDtX1Nspi6fmp4YTEts8SfA== archiver-utils@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-4.0.1.tgz#66ad15256e69589a77f706c90c6dbcc1b2775d2a" + resolved "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz" integrity sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg== dependencies: glob "^8.0.0" @@ -3994,7 +3969,7 @@ archiver-utils@^4.0.1: archiver@^6.0.0: version "6.0.2" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-6.0.2.tgz#f45e7598dfe48e834ac8c7a0c37033f826f5a639" + resolved "https://registry.npmjs.org/archiver/-/archiver-6.0.2.tgz" integrity sha512-UQ/2nW7NMl1G+1UnrLypQw1VdT9XZg/ECcKPq7l+STzStrSivFIXIp34D8M5zeNGW5NoOupdYCHv6VySCPNNlw== dependencies: archiver-utils "^4.0.1" @@ -4007,38 +3982,38 @@ archiver@^6.0.0: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-hidden@^1.2.3: version "1.2.6" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.6.tgz#73051c9b088114c795b1ea414e9c0fff874ffc1a" + resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz" integrity sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA== dependencies: tslib "^2.0.0" aria-query@5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: call-bound "^1.0.3" @@ -4046,17 +4021,17 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== arraybuffer.prototype.slice@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" @@ -4069,95 +4044,100 @@ arraybuffer.prototype.slice@^1.0.4: arrify@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== asn1@^0.2.6, asn1@~0.2.3: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0, assert-plus@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== ast-types@0.14.2: version "0.14.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz" integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== dependencies: tslib "^2.0.1" astring@^1.8.1, astring@^1.9.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/astring/-/astring-1.9.0.tgz#cc73e6062a7eb03e7d19c22d8b0b3451fd9bfeef" + resolved "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz" integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== async-function@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== async-lock@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.4.1.tgz#56b8718915a9b68b10fce2f2a9a3dddf765ef53f" + resolved "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz" integrity sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ== async-retry@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz" integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== dependencies: retry "0.13.1" async@^3.2.3, async@^3.2.4: version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws-ssl-profiles@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz#157dd77e9f19b1d123678e93f120e6f193022641" + resolved "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz" integrity sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g== aws4@^1.8.0: version "1.13.2" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz" integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== -b4a@^1.6.4, b4a@^1.8.1: +b4a@^1.6.4: + version "1.8.1" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz" + integrity sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw== + +b4a@^1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.8.1.tgz#7f16334ca80127aeb26064a28841acbf174840a4" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz" integrity sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw== babel-plugin-macros@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: "@babel/runtime" "^7.12.5" @@ -4166,27 +4146,27 @@ babel-plugin-macros@^3.1.0: bail@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== balanced-match@^4.0.2: version "4.0.4" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz" integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== -bare-events@^2.5.4, bare-events@^2.7.0: +bare-events@*, bare-events@^2.5.4, bare-events@^2.7.0: version "2.9.1" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.9.1.tgz#5c86616966343bcb03a1b3155feab253eadbf349" + resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz" integrity sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg== bare-fs@^4.5.5: version "4.7.2" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.7.2.tgz#0f59b317e5bdbec6a1489b519a06a203cd3fe035" + resolved "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.2.tgz" integrity sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg== dependencies: bare-events "^2.5.4" @@ -4197,19 +4177,19 @@ bare-fs@^4.5.5: bare-os@^3.0.1: version "3.9.1" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.9.1.tgz#660228ca7ffc47a72e96b6047cdd9d8342994e2f" + resolved "https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz" integrity sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ== bare-path@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.1.tgz#c12c81b527936b650e87c5d00264d59ef458082c" + resolved "https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz" integrity sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ== dependencies: bare-os "^3.0.1" bare-stream@^2.6.4: version "2.13.3" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.13.3.tgz#f6186c7cbb4bbf53a4560f35e48b16373ba51ce6" + resolved "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz" integrity sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ== dependencies: b4a "^1.8.1" @@ -4218,65 +4198,65 @@ bare-stream@^2.6.4: bare-url@^2.2.2: version "2.4.5" - resolved "https://registry.yarnpkg.com/bare-url/-/bare-url-2.4.5.tgz#50d205f8f2724eec60fd091ba9cebd675fca63aa" + resolved "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz" integrity sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ== dependencies: bare-path "^3.0.0" base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base64-stream@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/base64-stream/-/base64-stream-1.0.0.tgz#157ae00bc7888695e884e1fcc51c551fdfa8a1fa" + resolved "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz" integrity sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA== baseline-browser-mapping@^2.10.12: version "2.10.38" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz#c84d093c4bf7325c5053c279d90f153c66526042" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz" integrity sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw== basic-auth@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== dependencies: safe-buffer "5.1.2" bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" before-after-hook@^2.2.0: version "2.2.3" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== bidi-js@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/bidi-js/-/bidi-js-1.0.3.tgz#6f8bcf3c877c4d9220ddf49b9bb6930c88f877d2" + resolved "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz" integrity sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw== dependencies: require-from-string "^2.0.2" bignumber.js@^9.0.0: version "9.3.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz" integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bl@^4.0.3: version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -4285,7 +4265,7 @@ bl@^4.0.3: body-parser@^2.2.1: version "2.3.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.3.0.tgz#6d8662f4d8c336028b8ac9aa24251b0ca64ba437" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz" integrity sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw== dependencies: bytes "^3.1.2" @@ -4300,7 +4280,7 @@ body-parser@^2.2.1: body-parser@~1.20.5: version "1.20.5" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.5.tgz#303c8c34423d1d6fa799bc764e93c1e4dc6ebf64" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz" integrity sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA== dependencies: bytes "~3.1.2" @@ -4318,46 +4298,53 @@ body-parser@~1.20.5: boolean@^3.0.1: version "3.2.0" - resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" + resolved "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz" integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== bowser@^2.11.0: version "2.14.1" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.14.1.tgz#4ea39bf31e305184522d7ad7bfd91389e4f0cb79" + resolved "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz" integrity sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg== brace-expansion@^1.1.7: version "1.1.15" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.15.tgz#a6d90d54067236e5f42570a3b7378d594d9b7738" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz" integrity sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1, brace-expansion@^2.0.2: +brace-expansion@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz" + integrity sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA== + dependencies: + balanced-match "^1.0.0" + +brace-expansion@^2.0.2: version "2.1.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.1.tgz#c68b1c4111c76aae3a6fba55d496cee10c39dad8" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz" integrity sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA== dependencies: balanced-match "^1.0.0" brace-expansion@^5.0.5: version "5.0.6" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.6.tgz#ec68fe0a641a29d8711579caf641d05bae1f2285" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz" integrity sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g== dependencies: balanced-match "^4.0.2" braces@^3.0.3, braces@~3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" -browserslist@^4.24.0: +browserslist@^4.24.0, "browserslist@>= 4.21.0": version "4.28.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz" integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== dependencies: baseline-browser-mapping "^2.10.12" @@ -4368,27 +4355,27 @@ browserslist@^4.24.0: btoa-lite@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + resolved "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz" integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA== buffer-crc32@^0.2.1: version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer-equal-constant-time@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^5.5.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -4396,7 +4383,7 @@ buffer@^5.5.0: buffer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -4404,39 +4391,39 @@ buffer@^6.0.3: buildcheck@~0.0.6: version "0.0.7" - resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.7.tgz#07a5e76c10ead8fa67d9e4c587b68f49e8f29d61" + resolved "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.7.tgz" integrity sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA== builtins@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== bundle-name@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz" integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== dependencies: run-applescript "^7.0.0" byline@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + resolved "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz" integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== -bytes@3.1.2, bytes@^3.1.2, bytes@~3.1.2: +bytes@^3.1.2, bytes@~3.1.2, bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cac@^6.7.14: version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" @@ -4444,7 +4431,7 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: call-bind@^1.0.7, call-bind@^1.0.8, call-bind@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.9.tgz#39a644700c80bc7d0ca9102fc6d1d43b2fd7eee7" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz" integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -4454,7 +4441,7 @@ call-bind@^1.0.7, call-bind@^1.0.8, call-bind@^1.0.9: call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: call-bind-apply-helpers "^1.0.2" @@ -4462,27 +4449,27 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001782: version "1.0.30001799" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz#5c909138c27f1a61219d3e092071c1cc7d32dc55" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz" integrity sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw== caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== ccount@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chai@^4.3.10: version "4.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + resolved "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz" integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== dependencies: assertion-error "^1.1.0" @@ -4495,39 +4482,39 @@ chai@^4.3.10: chalk@^5.3.0: version "5.6.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz" integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== character-entities-legacy@^1.0.0: version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== character-entities@^1.0.0: version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== character-entities@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== character-reference-invalid@^1.0.0: version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== check-error@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== dependencies: get-func-name "^2.0.2" chokidar@^3.5.2: version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -4542,32 +4529,32 @@ chokidar@^3.5.2: chownr@^1.1.1: version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== classnames@^2.2.6: version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== clean-git-ref@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/clean-git-ref/-/clean-git-ref-2.0.1.tgz#dcc0ca093b90e527e67adb5a5e55b1af6816dcd9" + resolved "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz" integrity sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw== client-only@^0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -4576,7 +4563,7 @@ cliui@^8.0.1: cliui@^9.0.1: version "9.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-9.0.1.tgz#6f7890f386f6f1f79953adc1f78dec46fcc2d291" + resolved "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz" integrity sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w== dependencies: string-width "^7.2.0" @@ -4585,53 +4572,53 @@ cliui@^9.0.1: clsx@^1.0.2, clsx@^1.0.4: version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== clsx@^2.0.0, clsx@^2.1.0, clsx@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== cluster-key-slot@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz#10ccb9ded0729464b6d2e7d714b100a2d1259d43" + resolved "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz" integrity sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw== color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-convert@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-3.1.3.tgz#db6627b97181cb8facdfce755ae26f97ab0711f1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz" integrity sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg== dependencies: color-name "^2.0.0" color-name@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-2.1.0.tgz#0b677385c1c4b4edfdeaf77e38fa338e3a40b693" + resolved "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz" integrity sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^2.1.3: version "2.1.4" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-2.1.4.tgz#9dcf566ff976e23368c8bd673f5c35103ab41058" + resolved "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz" integrity sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg== dependencies: color-name "^2.0.0" color@^5.0.2: version "5.0.3" - resolved "https://registry.yarnpkg.com/color/-/color-5.0.3.tgz#f79390b1b778e222ffbb54304d3dbeaef633f97f" + resolved "https://registry.npmjs.org/color/-/color-5.0.3.tgz" integrity sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA== dependencies: color-convert "^3.1.3" @@ -4639,44 +4626,44 @@ color@^5.0.2: colorette@2.0.19: version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" comma-separated-tokens@^1.0.0: version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== comma-separated-tokens@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== commander@^10.0.0: version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^12.1.0: version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== compress-commons@^5.0.1: version "5.0.3" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-5.0.3.tgz#36b6572fdfc220c88c9c939b48667818806667e9" + resolved "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.3.tgz" integrity sha512-/UIcLWvwAQyVibgpQDPtfNM3SvqN7G9elAPAV7GM0L53EbNWwWiCsWtK8Fwed/APEbptPHXs5PuW+y8Bq8lFTA== dependencies: crc-32 "^1.2.0" @@ -4686,14 +4673,14 @@ compress-commons@^5.0.1: compressible@~2.0.18: version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" compression@^1.7.4: version "1.8.1" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" + resolved "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz" integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== dependencies: bytes "3.1.2" @@ -4706,7 +4693,7 @@ compression@^1.7.4: compute-gcd@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/compute-gcd/-/compute-gcd-1.2.1.tgz#34d639f3825625e1357ce81f0e456a6249d8c77f" + resolved "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz" integrity sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg== dependencies: validate.io-array "^1.0.3" @@ -4715,7 +4702,7 @@ compute-gcd@^1.2.1: compute-lcm@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/compute-lcm/-/compute-lcm-1.1.2.tgz#9107c66b9dca28cefb22b4ab4545caac4034af23" + resolved "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz" integrity sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ== dependencies: compute-gcd "^1.2.1" @@ -4725,12 +4712,12 @@ compute-lcm@^1.1.2: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz" integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== dependencies: buffer-from "^1.0.0" @@ -4740,76 +4727,71 @@ concat-stream@^2.0.0: confbox@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + resolved "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz" integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== content-disposition@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.1.0.tgz#f3db789c752d45564cc7e9e1e0b31790d4a38e17" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz" integrity sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g== content-disposition@~0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== content-type@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-2.0.0.tgz#2fb3ede69dffa0af78ca7c4ce7589680638b56df" + resolved "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz" integrity sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ== convert-source-map@^1.5.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz" integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== cookie-signature@~1.0.6: version "1.0.7" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz" integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== cookie@^0.7.1, cookie@~0.7.1: version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== copy-to-clipboard@^3.3.1: version "3.3.3" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== dependencies: toggle-selection "^1.0.6" -core-util-is@1.0.2: +core-util-is@~1.0.0, core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - cors@^2.8.5: version "2.8.6" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.6.tgz#ff5dd69bd95e547503820d29aba4f8faf8dfec96" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz" integrity sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw== dependencies: object-assign "^4" @@ -4817,7 +4799,7 @@ cors@^2.8.5: cosmiconfig@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -4828,7 +4810,7 @@ cosmiconfig@^7.0.0: cpu-features@~0.0.10: version "0.0.10" - resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.10.tgz#9aae536db2710c7254d7ed67cb3cbc7d29ad79c5" + resolved "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz" integrity sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA== dependencies: buildcheck "~0.0.6" @@ -4836,12 +4818,12 @@ cpu-features@~0.0.10: crc-32@^1.2.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== crc32-stream@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-5.0.1.tgz#bc1581c9a9022a9242605dc91b14e069e3aa87a5" + resolved "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.1.tgz" integrity sha512-lO1dFui+CEUh/ztYIpgpKItKW9Bb4NWakCRJrnqAbFIYD+OZAwb2VfD5T5eXMw2FNcsDHkQcNl/Wh3iVXYwU6g== dependencies: crc-32 "^1.2.0" @@ -4849,19 +4831,19 @@ crc32-stream@^5.0.0: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-fetch@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.1.0.tgz#8f69355007ee182e47fa692ecbaa37a52e43c3d2" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz" integrity sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw== dependencies: node-fetch "^2.7.0" cross-spawn@^7.0.3, cross-spawn@^7.0.5, cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -4870,21 +4852,21 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.5, cross-spawn@^7.0.6: css-box-model@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" + resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz" integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== dependencies: tiny-invariant "^1.0.6" css-in-js-utils@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" + resolved "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz" integrity sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== dependencies: hyphenate-style-name "^1.0.3" css-tree@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" @@ -4892,7 +4874,7 @@ css-tree@^1.1.2: css-tree@^3.0.0, css-tree@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.2.1.tgz#86cac7011561272b30e6b1e042ba6ce047aa7518" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz" integrity sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA== dependencies: mdn-data "2.27.1" @@ -4900,7 +4882,7 @@ css-tree@^3.0.0, css-tree@^3.2.1: css-vendor@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + resolved "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz" integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== dependencies: "@babel/runtime" "^7.8.3" @@ -4908,27 +4890,27 @@ css-vendor@^2.0.8: csstype@^2.5.2: version "2.6.21" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" + resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz" integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== -csstype@^3.0.2, csstype@^3.1.2, csstype@^3.1.3, csstype@^3.2.2: +csstype@^3.0.2, csstype@^3.1.2, csstype@^3.1.3, csstype@^3.2.2, csstype@^3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== "d3-color@1 - 3": version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== "d3-dispatch@1 - 3": version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== "d3-drag@2 - 3": version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== dependencies: d3-dispatch "1 - 3" @@ -4936,41 +4918,41 @@ csstype@^3.0.2, csstype@^3.1.2, csstype@^3.1.3, csstype@^3.2.2: "d3-ease@1 - 3": version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== "d3-interpolate@1 - 3": version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: d3-color "1 - 3" d3-path@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== -"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: +d3-selection@^3.0.0, "d3-selection@2 - 3", d3-selection@3: version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== d3-shape@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== dependencies: d3-path "^3.1.0" "d3-timer@1 - 3": version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== "d3-transition@2 - 3": version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz" integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== dependencies: d3-color "1 - 3" @@ -4981,7 +4963,7 @@ d3-shape@^3.0.0: d3-zoom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz" integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== dependencies: d3-dispatch "1 - 3" @@ -4992,7 +4974,7 @@ d3-zoom@^3.0.0: dagre@^0.8.5: version "0.8.5" - resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee" + resolved "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz" integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw== dependencies: graphlib "^2.1.8" @@ -5000,14 +4982,14 @@ dagre@^0.8.5: dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" data-urls@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-7.0.0.tgz#6dce8b63226a1ecfdd907ce18a8ccfb1eee506d3" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz" integrity sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA== dependencies: whatwg-mimetype "^5.0.0" @@ -5015,7 +4997,7 @@ data-urls@^7.0.0: data-view-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: call-bound "^1.0.3" @@ -5024,7 +5006,7 @@ data-view-buffer@^1.0.2: data-view-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: call-bound "^1.0.3" @@ -5033,7 +5015,7 @@ data-view-byte-length@^1.0.2: data-view-byte-offset@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: call-bound "^1.0.2" @@ -5042,81 +5024,81 @@ data-view-byte-offset@^1.0.1: dataloader@^2.0.0: version "2.2.3" - resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.3.tgz#42d10b4913515f5b37c6acedcb4960d6ae1b1517" + resolved "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz" integrity sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA== -date-fns@^2.16.1: +date-fns@^2.0.0, date-fns@^2.16.1: version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== dependencies: "@babel/runtime" "^7.21.0" debounce@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3, debug@4, debug@4.4.3: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + debug@2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@4.4.3, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - debug@4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" decimal.js@^10.6.0: version "10.6.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz" integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== decode-named-character-reference@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz#3e40603760874c2e5867691b599d73a7da25b53f" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz" integrity sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q== dependencies: character-entities "^2.0.0" decompress-response@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: mimic-response "^3.1.0" deep-eql@^4.1.3: version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz" integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== dependencies: type-detect "^4.0.0" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-browser-id@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.1.tgz#f7a7ccb8f5104bf8e0f71ba3b1ccfa5eafdb21e8" + resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz" integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== default-browser@^5.2.1: version "5.5.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976" + resolved "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz" integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== dependencies: bundle-name "^4.1.0" @@ -5124,7 +5106,7 @@ default-browser@^5.2.1: define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -5133,12 +5115,12 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: define-lazy-prop@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -5147,74 +5129,74 @@ define-properties@^1.2.1: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -denque@2.1.0, denque@^2.1.0: +denque@^2.1.0, denque@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + resolved "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz" integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== -depd@2.0.0, depd@^2.0.0, depd@~2.0.0: +depd@^2.0.0, depd@~2.0.0, depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -dependency-graph@0.11.0, dependency-graph@~0.11.0: +dependency-graph@~0.11.0, dependency-graph@0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -destroy@1.2.0, destroy@~1.2.0: +destroy@~1.2.0, destroy@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-node@^2.0.4: version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== diff-sequences@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -diff3@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/diff3/-/diff3-0.0.3.tgz#d4e5c3a4cdf4e5fe1211ab42e693fcb4321580fc" - integrity sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g== - diff@^4.0.1: version "4.0.4" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.4.tgz#7a6dbfda325f25f07517e9b518f897c08332e07d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz" integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== diff@^5.0.0: version "5.2.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.2.tgz#0a4742797281d09cfa699b79ea32d27723623bad" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz" integrity sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A== +diff3@0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz" + integrity sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g== + dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" docker-modem@^5.0.7: version "5.0.7" - resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-5.0.7.tgz#57f3f0e2c7a893e66a0d4a626f9cbc933d77157b" + resolved "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.7.tgz" integrity sha512-XJgGhoR/CLpqshm4d3L7rzH6t8NgDFUIIpztYlLHIApeJjMZKYJMz2zxPsYxnejq5h3ELYSw/RBsi3t5h7gNTA== dependencies: debug "^4.1.1" @@ -5224,7 +5206,7 @@ docker-modem@^5.0.7: dockerode@^4.0.0: version "4.0.12" - resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-4.0.12.tgz#de286934fbcd801b5034d8169379033d6de14bf3" + resolved "https://registry.npmjs.org/dockerode/-/dockerode-4.0.12.tgz" integrity sha512-/bCZd6KlGcjZO8Buqmi/vXuqEGVEZ0PNjx/biBNqJD3MhK9DmdiAuKxqfNhflgDESDIiBz3qF+0e55+CpnrUcw== dependencies: "@balena/dockerignore" "^1.0.2" @@ -5237,12 +5219,12 @@ dockerode@^4.0.0: dom-accessibility-api@^0.5.9: version "0.5.16" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-helpers@^5.0.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" @@ -5250,7 +5232,7 @@ dom-helpers@^5.0.1: dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -5259,7 +5241,7 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: duplexify@^4.1.3: version "4.1.3" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz" integrity sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA== dependencies: end-of-stream "^1.4.1" @@ -5269,88 +5251,78 @@ duplexify@^4.1.3: ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" -ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: +ecdsa-sig-formatter@^1.0.11, ecdsa-sig-formatter@1.0.11: version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== dependencies: safe-buffer "^5.0.1" ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.328: - version "1.5.375" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.375.tgz#54a9a616dc2b3765e7263d98d14c2135408954d9" - integrity sha512-ZWP5eB4BVPW/ZYo9252hQZHZ5XavtsTgpbhcmMmRwymavC5AsLWQWBPaKMeNd2LW0KGby5HPXvj7+sr4ta5j/Q== + version "1.5.376" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.376.tgz" + integrity sha512-cUVA7/RvbFTEuw/i3obUwDTRIXojaxkResf+ibByPFxjc6XK3VNtcQXV0NSbAlJ0FMjcJGgftVVB4Qo184EXvA== emoji-regex@^10.3.0: version "10.6.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz" integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== enabled@2.0.x: version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== encodeurl@^2.0.0, encodeurl@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz" integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== dependencies: once "^1.4.0" entities@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-8.0.0.tgz#c1df5fe3602429747fa233d0dd26f142f0ce4743" + resolved "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz" integrity sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA== error-ex@^1.3.1: version "1.3.4" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz" integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== dependencies: is-arrayish "^0.2.1" error-stack-parser@^2.0.6: version "2.1.4" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz" integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== dependencies: stackframe "^1.3.4" -es-abstract-get@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-abstract-get/-/es-abstract-get-1.0.0.tgz#1eae87101f42bedeb6a740e8c5051271aef89088" - integrity sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg== - dependencies: - es-errors "^1.3.0" - es-object-atoms "^1.1.2" - is-callable "^1.2.7" - object-inspect "^1.13.4" - es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0, es-abstract@^1.24.2: version "1.24.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.2.tgz#2dbd38c180735ee983f77585140a2706a963ed9a" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz" integrity sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg== dependencies: array-buffer-byte-length "^1.0.2" @@ -5410,7 +5382,7 @@ es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0, es-abstract@^1.24 es-aggregate-error@^1.0.7: version "1.0.14" - resolved "https://registry.yarnpkg.com/es-aggregate-error/-/es-aggregate-error-1.0.14.tgz#f1a24f833d25056c2ebc92a8c04449374f8f9f65" + resolved "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.14.tgz" integrity sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA== dependencies: define-data-property "^1.1.4" @@ -5424,24 +5396,24 @@ es-aggregate-error@^1.0.7: es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1, es-object-atoms@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz" integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -5450,24 +5422,22 @@ es-set-tostringtag@^2.1.0: hasown "^2.0.2" es-to-primitive@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.1.tgz#abd6ef5b12d7c25bcd9eb3a7ef63e568b451ba4a" - integrity sha512-CxN9N56HYfd2m/acc/NOFrZQsN9kU4eh+2kk6A707Kz1krH8tKmfrs5RnftB8WNX80T0NS7vSQsDOlg23diR2g== + version "1.3.0" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - es-abstract-get "^1.0.0" - es-errors "^1.3.0" is-callable "^1.2.7" - is-date-object "^1.1.0" - is-symbol "^1.1.1" + is-date-object "^1.0.5" + is-symbol "^1.0.4" es6-error@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== esbuild@^0.21.3: version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: "@esbuild/aix-ppc64" "0.21.5" @@ -5496,27 +5466,27 @@ esbuild@^0.21.3: escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escape-string-regexp@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== eslint-scope@^9.1.2: version "9.1.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.2.tgz#b9de6ace2fab1cff24d2e58d85b74c8fcea39802" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz" integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== dependencies: "@types/esrecurse" "^4.3.1" @@ -5526,17 +5496,17 @@ eslint-scope@^9.1.2: eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-visitor-keys@^5.0.0, eslint-visitor-keys@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz" integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== -eslint@^10.5.0: +eslint@^10.0.0, eslint@^10.5.0, "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0 || ^10.0.0": version "10.5.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.5.0.tgz#5fca69d6b41fe7e00ba22d4100b2e44efe439ad5" + resolved "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz" integrity sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ== dependencies: "@eslint-community/eslint-utils" "^4.8.0" @@ -5572,12 +5542,12 @@ eslint@^10.5.0: esm@^3.2.25: version "3.2.25" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + resolved "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== espree@^11.2.0: version "11.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-11.2.0.tgz#01d5e47dc332aaba3059008362454a8cc34ccaa5" + resolved "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz" integrity sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw== dependencies: acorn "^8.16.0" @@ -5586,87 +5556,87 @@ espree@^11.2.0: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz" integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== estree-walker@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== estree-walker@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== dependencies: "@types/estree" "^1.0.0" esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@^1.8.1, etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== events-universal@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6" + resolved "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz" integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw== dependencies: bare-events "^2.7.0" events@^3.0.0, events@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== eventsource-parser@^3.0.0, eventsource-parser@^3.0.1: version "3.1.0" - resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-3.1.0.tgz#4e198eb91cd333d0a8ddcc036502b3618a25f449" + resolved "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz" integrity sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg== eventsource@^3.0.2: version "3.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-3.0.7.tgz#1157622e2f5377bb6aef2114372728ba0c156989" + resolved "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz" integrity sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA== dependencies: eventsource-parser "^3.0.1" execa@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: cross-spawn "^7.0.3" @@ -5681,12 +5651,12 @@ execa@^8.0.1: expr-eval-fork@^3.0.1: version "3.0.3" - resolved "https://registry.yarnpkg.com/expr-eval-fork/-/expr-eval-fork-3.0.3.tgz#82a3291db3835af9dfe05f519e4901f2b72219fb" + resolved "https://registry.npmjs.org/expr-eval-fork/-/expr-eval-fork-3.0.3.tgz" integrity sha512-BhC+hbc5lIVjygr840n5DEkW3MQq7H9o+mc1/N7Z5uIiCFVyESLL5DIE7LNq4CYUNxy+XjA+3jRrL/h0Kt2xcg== express-promise-router@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/express-promise-router/-/express-promise-router-4.1.1.tgz#8fac102060b9bcc868f84d34fbb12fd8fa494291" + resolved "https://registry.npmjs.org/express-promise-router/-/express-promise-router-4.1.1.tgz" integrity sha512-Lkvcy/ZGrBhzkl3y7uYBHLMtLI4D6XQ2kiFg9dq7fbktBch5gjqJ0+KovX0cvCAvTJw92raWunRLM/OM+5l4fA== dependencies: is-promise "^4.0.0" @@ -5695,14 +5665,14 @@ express-promise-router@^4.1.0: express-rate-limit@^8.2.1: version "8.5.2" - resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-8.5.2.tgz#5922dbf76df2124611cea955d93432b37514b2f3" + resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz" integrity sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A== dependencies: ip-address "^10.2.0" -express@^4.17.1, express@^4.18.0: +express@^4.0.0, express@^4.17.1, express@^4.18.0, "express@>= 4.11": version "4.22.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.22.2.tgz#c17ae0981e5efc24b22272f0e041c4662503b700" + resolved "https://registry.npmjs.org/express/-/express-4.22.2.tgz" integrity sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q== dependencies: accepts "~1.3.8" @@ -5739,7 +5709,7 @@ express@^4.17.1, express@^4.18.0: express@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/express/-/express-5.2.1.tgz#8f21d15b6d327f92b4794ecf8cb08a72f956ac04" + resolved "https://registry.npmjs.org/express/-/express-5.2.1.tgz" integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== dependencies: accepts "^2.0.0" @@ -5773,32 +5743,27 @@ express@^5.2.1: extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extsprintf@1.3.0: +extsprintf@^1.2.0, extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-fifo@^1.2.0, fast-fifo@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-glob@^3.2.9: version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -5809,40 +5774,40 @@ fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-memoize@^2.5.2: version "2.5.2" - resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" + resolved "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz" integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== fast-shallow-equal@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz#d4dcaf6472440dcefa6f88b98e3251e27f25628b" + resolved "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz" integrity sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw== fast-uri@^3.0.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz" integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== -fast-xml-builder@^1.1.7, fast-xml-builder@^1.2.0: +fast-xml-builder@^1.1.7: version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz#abd2363145a7625d9789ad96da375fabe3cff28c" + resolved "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz" integrity sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q== dependencies: path-expression-matcher "^1.5.0" xml-naming "^0.1.0" -fast-xml-parser@5.7.3: +fast-xml-parser@^5.3.4, fast-xml-parser@^5.5.9, fast-xml-parser@5.7.3: version "5.7.3" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz#309b04b08d835defc62ab657a0bb340c0e0fbe6a" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz" integrity sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg== dependencies: "@nodable/entities" "^2.1.0" @@ -5850,64 +5815,52 @@ fast-xml-parser@5.7.3: path-expression-matcher "^1.5.0" strnum "^2.2.3" -fast-xml-parser@^5.3.4, fast-xml-parser@^5.5.9: - version "5.9.0" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.9.0.tgz#25d54dbb841ad630e8810b343a6ce76d6044c04d" - integrity sha512-duBuXbyIhEeNO4GjFuVqr0nF047oNwr18aum+zJyqo0MUG/n7Afgs3Qv3D6VN3ONedUKxiuFlPiMGIa0Z11chA== - dependencies: - "@nodable/entities" "^2.2.0" - fast-xml-builder "^1.2.0" - is-unsafe "^1.0.1" - path-expression-matcher "^1.5.0" - strnum "^2.4.0" - xml-naming "^0.1.0" - fastest-stable-stringify@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz#3757a6774f6ec8de40c4e86ec28ea02417214c76" + resolved "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz" integrity sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q== fastq@^1.6.0: version "1.20.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz" integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== dependencies: reusify "^1.0.4" fault@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + resolved "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz" integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== dependencies: format "^0.2.0" fdir@^6.5.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== fecha@^4.2.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== file-entry-cache@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: flat-cache "^4.0.0" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" finalhandler@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.1.tgz#a2c517a6559852bcdb06d1f8bd7f51b68fad8099" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz" integrity sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== dependencies: debug "^4.4.0" @@ -5919,7 +5872,7 @@ finalhandler@^2.1.0: finalhandler@~1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz" integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== dependencies: debug "2.6.9" @@ -5932,12 +5885,12 @@ finalhandler@~1.3.1: find-root@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -5945,7 +5898,7 @@ find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -5953,7 +5906,7 @@ find-up@^5.0.0: flat-cache@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" @@ -5961,29 +5914,29 @@ flat-cache@^4.0.0: flatted@^3.2.9: version "3.4.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz" integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== fn.name@1.x.x: version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== for-each@^0.3.3, for-each@^0.3.5: version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: is-callable "^1.2.7" forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@^2.5.5: version "2.5.6" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.6.tgz#ef39b3d99e2fc9f25420c0db7962fe36cafcd244" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.6.tgz" integrity sha512-Ogz/E85h9tlfJzpI6TuFpGcHZFhLrb9Gw8wq9v40CxSCPnv7ahKr6Xgtkn0KYCDQJ8DNn5VoMO8EXr9V5PadyA== dependencies: asynckit "^0.4.0" @@ -5995,7 +5948,7 @@ form-data@^2.5.5: form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -6004,32 +5957,32 @@ form-data@~2.3.2: format@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz" integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" + resolved "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz" integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== fresh@~0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-extra@^11.2.0: version "11.3.5" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.5.tgz#07a44eff40bea53e719909a532f91a23bf0769ff" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz" integrity sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg== dependencies: graceful-fs "^4.2.0" @@ -6038,7 +5991,7 @@ fs-extra@^11.2.0: fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -6047,34 +6000,34 @@ fs-extra@^8.1.0: fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fscreen@^1.0.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/fscreen/-/fscreen-1.2.0.tgz#1a8c88e06bc16a07b473ad96196fb06d6657f59e" + resolved "https://registry.npmjs.org/fscreen/-/fscreen-1.2.0.tgz" integrity sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg== fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: version "1.2.0" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.2.0.tgz#758f3e84fa542672454bd5e14cb081a5ce07f70c" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz" integrity sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew== dependencies: call-bind "^1.0.9" @@ -6089,12 +6042,12 @@ function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gaxios@^6.0.0, gaxios@^6.0.2, gaxios@^6.1.1: version "6.7.1" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.7.1.tgz#ebd9f7093ede3ba502685e73390248bb5b7f71fb" + resolved "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz" integrity sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ== dependencies: extend "^3.0.2" @@ -6105,7 +6058,7 @@ gaxios@^6.0.0, gaxios@^6.0.2, gaxios@^6.1.1: gcp-metadata@^6.1.0: version "6.1.1" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.1.tgz#f65aa69f546bc56e116061d137d3f5f90bdec494" + resolved "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz" integrity sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A== dependencies: gaxios "^6.1.1" @@ -6114,39 +6067,39 @@ gcp-metadata@^6.1.0: generate-function@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + resolved "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz" integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== dependencies: is-property "^1.0.2" generator-function@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" + resolved "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz" integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-east-asian-width@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz#216900f91df11a8b2c198c3e1d93d6c035a776b9" + resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz" integrity sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA== get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -6162,12 +6115,12 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@ get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -6175,12 +6128,12 @@ get-proto@^1.0.1: get-stream@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== get-symbol-description@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: call-bound "^1.0.3" @@ -6189,19 +6142,19 @@ get-symbol-description@^1.1.0: getopts@2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" + resolved "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz" integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" git-up@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" + resolved "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz" integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== dependencies: is-ssh "^1.4.0" @@ -6209,35 +6162,35 @@ git-up@^7.0.0: git-url-parse@^14.0.0: version "14.1.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-14.1.0.tgz#01cb70000666c11a7230aceec1fd518c416c224c" + resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.1.0.tgz" integrity sha512-8xg65dTxGHST3+zGpycMMFZcoTzAdZ2dOtu4vmgIfkTFnVHBxHMzBC2L1k8To7EmrSiHesT8JgPLT91VKw1B5g== dependencies: git-up "^7.0.0" git-url-parse@^15.0.0: version "15.0.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-15.0.0.tgz#207b74d8eb888955b1aaf5dfc5f5778084fa9fa9" + resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-15.0.0.tgz" integrity sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ== dependencies: git-up "^7.0.0" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob@^13.0.6: version "13.0.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" + resolved "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz" integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== dependencies: minimatch "^10.2.2" @@ -6246,7 +6199,7 @@ glob@^13.0.6: glob@^7.1.4, glob@^7.1.6: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -6258,7 +6211,7 @@ glob@^7.1.4, glob@^7.1.6: glob@^8.0.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" @@ -6269,7 +6222,7 @@ glob@^8.0.0: global-agent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + resolved "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz" integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== dependencies: boolean "^3.0.1" @@ -6281,7 +6234,7 @@ global-agent@^3.0.0: globalthis@^1.0.1, globalthis@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: define-properties "^1.2.1" @@ -6289,7 +6242,7 @@ globalthis@^1.0.1, globalthis@^1.0.4: globby@^11.0.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -6301,7 +6254,7 @@ globby@^11.0.0: google-auth-library@^9.6.3: version "9.15.1" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.1.tgz#0c5d84ed1890b2375f1cd74f03ac7b806b392928" + resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz" integrity sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng== dependencies: base64-js "^1.3.0" @@ -6313,29 +6266,29 @@ google-auth-library@^9.6.3: google-logging-utils@^0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/google-logging-utils/-/google-logging-utils-0.0.2.tgz#5fd837e06fa334da450433b9e3e1870c1594466a" + resolved "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz" integrity sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ== gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphlib@^2.1.8: version "2.1.8" - resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" + resolved "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz" integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== dependencies: lodash "^4.17.15" gtoken@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.1.0.tgz#d61b4ebd10132222817f7222b1e6064bd463fc26" + resolved "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz" integrity sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw== dependencies: gaxios "^6.0.0" @@ -6343,12 +6296,12 @@ gtoken@^7.0.0: har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: ajv "^6.12.3" @@ -6356,50 +6309,50 @@ har-validator@~5.1.3: has-bigints@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== dependencies: dunder-proto "^1.0.0" has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" hasown@^2.0.2, hasown@^2.0.3, hasown@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz" integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== dependencies: function-bind "^1.1.2" hast-util-from-parse5@^7.0.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz" integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== dependencies: "@types/hast" "^2.0.0" @@ -6412,19 +6365,19 @@ hast-util-from-parse5@^7.0.0: hast-util-parse-selector@^2.0.0: version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== hast-util-parse-selector@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz" integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== dependencies: "@types/hast" "^2.0.0" hast-util-raw@^7.2.0: version "7.2.3" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz" integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== dependencies: "@types/hast" "^2.0.0" @@ -6441,14 +6394,14 @@ hast-util-raw@^7.2.0: hast-util-sanitize@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-4.1.0.tgz#d90f8521f5083547095c5c63a7e03150303e0286" + resolved "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-4.1.0.tgz" integrity sha512-Hd9tU0ltknMGRDv+d6Ro/4XKzBqQnP/EZrpiTbpFYfXv/uOhWeKc+2uajcbEvAEH98VZd7eII2PiXm13RihnLw== dependencies: "@types/hast" "^2.0.0" hast-util-to-parse5@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz" integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== dependencies: "@types/hast" "^2.0.0" @@ -6460,12 +6413,12 @@ hast-util-to-parse5@^7.0.0: hast-util-whitespace@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== hastscript@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz" integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== dependencies: "@types/hast" "^2.0.0" @@ -6476,7 +6429,7 @@ hastscript@^6.0.0: hastscript@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz" integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== dependencies: "@types/hast" "^2.0.0" @@ -6487,63 +6440,63 @@ hastscript@^7.0.0: helmet@^6.0.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/helmet/-/helmet-6.2.0.tgz#c29d62014be4c70b8ef092c9c5e54c8c26b8e16e" + resolved "https://registry.npmjs.org/helmet/-/helmet-6.2.0.tgz" integrity sha512-DWlwuXLLqbrIOltR6tFQXShj/+7Cyp0gLi6uAb8qMdFh/YBBFbKSgQ6nbXmScYd8emMctuthmgIa7tUfo9Rtyg== highlight.js@^10.4.1, highlight.js@~10.7.0: version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== highlightjs-vue@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz#fdfe97fbea6354e70ee44e3a955875e114db086d" + resolved "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz" integrity sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA== history@^5.0.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" + resolved "https://registry.npmjs.org/history/-/history-5.3.0.tgz" integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== dependencies: "@babel/runtime" "^7.7.6" hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" -hono@^4.11.4: +hono@^4, hono@^4.11.4: version "4.12.26" - resolved "https://registry.yarnpkg.com/hono/-/hono-4.12.26.tgz#450edfd64aad96cccc36829d63ec1430272e3ef8" + resolved "https://registry.npmjs.org/hono/-/hono-4.12.26.tgz" integrity sha512-uyZtpnYxM9CmQ7QsQknM4zN8EftNqhON1qYeIKM0Se67CCEe2c44xyGURwB0axX2fBDu1dqHrHAc1hmNT8ITkw== html-encoding-sniffer@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz#f8d9390b3b348b50d4f61c16dd2ef5c05980a882" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz" integrity sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg== dependencies: "@exodus/bytes" "^1.6.0" html-entities@^2.5.2: version "2.6.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.6.0.tgz#7c64f1ea3b36818ccae3d3fb48b6974208e984f8" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz" integrity sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-void-elements@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz" integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.0, http-errors@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz" integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== dependencies: depd "~2.0.0" @@ -6554,7 +6507,7 @@ http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.0, http-errors@~2.0.1: http-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: "@tootallnate/once" "2" @@ -6563,7 +6516,7 @@ http-proxy-agent@^5.0.0: http-proxy-agent@^7.0.0: version "7.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" @@ -6571,7 +6524,7 @@ http-proxy-agent@^7.0.0: http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" @@ -6580,7 +6533,7 @@ http-signature@~1.2.0: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -6588,7 +6541,7 @@ https-proxy-agent@^5.0.0: https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1: version "7.0.6" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: agent-base "^7.1.2" @@ -6596,58 +6549,58 @@ https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1: human-signals@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== hyphenate-style-name@^1.0.3: version "1.1.0" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz#1797bf50369588b47b72ca6d5e65374607cf4436" + resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz" integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw== i18next@^22.4.15: version "22.5.1" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.5.1.tgz#99df0b318741a506000c243429a7352e5f44d424" + resolved "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz" integrity sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA== dependencies: "@babel/runtime" "^7.20.6" iconv-lite@^0.7.2, iconv-lite@~0.7.0: version "0.7.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz" integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" iconv-lite@~0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.1.4, ignore@^5.2.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== ignore@^7.0.5: version "7.0.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== immer@^9.0.6: version "9.0.21" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== import-fresh@^3.2.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" @@ -6655,37 +6608,37 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4, inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inline-style-parser@0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== inline-style-prefixer@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz#9310f3cfa2c6f3901d1480f373981c02691781e8" + resolved "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz" integrity sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw== dependencies: css-in-js-utils "^3.1.0" internal-slot@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" @@ -6694,12 +6647,12 @@ internal-slot@^1.1.0: interpret@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== ioredis@^5.4.1: version "5.11.1" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.11.1.tgz#2d1e52e350a79ee3b00883f3681a410427b49f28" + resolved "https://registry.npmjs.org/ioredis/-/ioredis-5.11.1.tgz" integrity sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A== dependencies: "@ioredis/commands" "1.10.0" @@ -6712,22 +6665,22 @@ ioredis@^5.4.1: ip-address@^10.2.0: version "10.2.0" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.2.0.tgz#805fc178b20c518bd4c8548b24fe30892d7f3206" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz" integrity sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA== ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-alphabetical@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== is-alphanumerical@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== dependencies: is-alphabetical "^1.0.0" @@ -6735,7 +6688,7 @@ is-alphanumerical@^1.0.0: is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: call-bind "^1.0.8" @@ -6744,12 +6697,12 @@ is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-async-function@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz" integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: async-function "^1.0.0" @@ -6760,21 +6713,21 @@ is-async-function@^2.0.0: is-bigint@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: call-bound "^1.0.3" @@ -6782,33 +6735,33 @@ is-boolean-object@^1.2.1: is-buffer@^2.0.0: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.16.1: version "2.16.2" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz" integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA== dependencies: hasown "^2.0.3" is-data-view@^1.0.1, is-data-view@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: call-bound "^1.0.2" get-intrinsic "^1.2.6" is-typed-array "^1.1.13" -is-date-object@^1.1.0: +is-date-object@^1.0.5, is-date-object@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: call-bound "^1.0.2" @@ -6816,41 +6769,41 @@ is-date-object@^1.1.0: is-decimal@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== is-docker@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== is-document.all@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-document.all/-/is-document.all-1.0.0.tgz#163a4bfb362c6ed7b118ce46cdecc4e37dee3195" + resolved "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz" integrity sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g== dependencies: call-bound "^1.0.4" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== dependencies: call-bound "^1.0.3" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.10: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz" integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== dependencies: call-bound "^1.0.4" @@ -6861,41 +6814,41 @@ is-generator-function@^1.0.10: is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hexadecimal@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== is-in-browser@^1.0.2, is-in-browser@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + resolved "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz" integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== is-inside-container@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== dependencies: is-docker "^3.0.0" is-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-negative-zero@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: call-bound "^1.0.3" @@ -6903,44 +6856,44 @@ is-number-object@^1.1.1: is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== is-plain-object@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-promise@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== is-property@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + resolved "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== is-reference@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + resolved "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz" integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== dependencies: "@types/estree" "*" is-regex@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: call-bound "^1.0.2" @@ -6950,44 +6903,44 @@ is-regex@^1.2.1: is-set@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: call-bound "^1.0.3" is-ssh@^1.4.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.1.tgz#76de1cdbe8f92a8b905d1a172b6bc09704c20396" + resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz" integrity sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg== dependencies: protocols "^2.0.1" is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== is-string@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: call-bound "^1.0.3" has-tostringtag "^1.0.2" -is-symbol@^1.1.1: +is-symbol@^1.0.4, is-symbol@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: call-bound "^1.0.2" @@ -6996,36 +6949,31 @@ is-symbol@^1.1.1: is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: which-typed-array "^1.1.16" is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-unsafe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-unsafe/-/is-unsafe-1.0.1.tgz#ce89b55dec0034364f5beda41e10481efa8fa317" - integrity sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA== - is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2, is-weakref@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: call-bound "^1.0.3" is-weakset@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: call-bound "^1.0.3" @@ -7033,30 +6981,30 @@ is-weakset@^2.0.3: is-wsl@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.1.tgz#327897b26832a3eb117da6c27492d04ca132594f" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz" integrity sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw== dependencies: is-inside-container "^1.0.0" isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isomorphic-git@^1.23.0: - version "1.38.5" - resolved "https://registry.yarnpkg.com/isomorphic-git/-/isomorphic-git-1.38.5.tgz#958ab2a79e044108f3a4d55c6055fa8f85140bc9" - integrity sha512-4HBmx1UB+SdRaQh7+zN7lvFQxc4zl7s0oIM/1+5xveu6+QrOeFfx5QDeRNpqCzFHICISEdbK7GilsTsrgE006Q== + version "1.38.4" + resolved "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.38.4.tgz" + integrity sha512-Ud5vs6Ac+ET+iOZWZB1j2RruVeGQSQc7U7QUhPq6iGqzifaqOVHCgRpG/8c0LwIP39R+Mr+lzR4escmCuhjONQ== dependencies: async-lock "^1.4.1" clean-git-ref "^2.0.1" @@ -7072,22 +7020,22 @@ isomorphic-git@^1.23.0: isomorphic-ws@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" + resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz" integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.2: version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -7096,7 +7044,7 @@ istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: istanbul-lib-source-maps@^5.0.4: version "5.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz#acaef948df7747c8eb5fbf1265cb980f6353a441" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz" integrity sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== dependencies: "@jridgewell/trace-mapping" "^0.3.23" @@ -7105,7 +7053,7 @@ istanbul-lib-source-maps@^5.0.4: istanbul-reports@^3.1.6: version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz" integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== dependencies: html-escaper "^2.0.0" @@ -7113,37 +7061,42 @@ istanbul-reports@^3.1.6: jose@^4.15.9: version "4.15.9" - resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.9.tgz#9b68eda29e9a0614c042fa29387196c7dd800100" + resolved "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz" integrity sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA== jose@^5.0.0: version "5.10.0" - resolved "https://registry.yarnpkg.com/jose/-/jose-5.10.0.tgz#c37346a099d6467c401351a9a0c2161e0f52c4be" + resolved "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz" integrity sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg== jose@^6.1.3: version "6.2.3" - resolved "https://registry.yarnpkg.com/jose/-/jose-6.2.3.tgz#0975197ad973251221c658a3cddc4b951a250c2d" + resolved "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz" integrity sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw== -js-cookie@^3.0.0: +js-cookie@^3.0.0, js-cookie@^3.0.5: version "3.0.8" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.8.tgz#444e6f4b27a5d844594fef61c9d6bca5f0787688" + resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz" integrity sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-tokens@^9.0.1: version "9.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz" integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== js-yaml@^3.6.1: version "3.14.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz" integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== dependencies: argparse "^1.0.7" @@ -7151,19 +7104,19 @@ js-yaml@^3.6.1: js-yaml@^4.1.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.2.0.tgz#2bd9e85682dd91bd469afb809d816043b3d49524" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz" integrity sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw== dependencies: argparse "^2.0.1" jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdom@^29.1.1: +jsdom@*, jsdom@^29.1.1: version "29.1.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-29.1.1.tgz#5b9704906f3cd510c34aa941ae2f8f7f8179df01" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz" integrity sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q== dependencies: "@asamuzakjp/css-color" "^5.1.11" @@ -7188,43 +7141,43 @@ jsdom@^29.1.1: whatwg-url "^16.0.1" xml-name-validator "^5.0.0" -jsep@^1.2.0, jsep@^1.4.0: +jsep@^0.4.0||^1.0.0, jsep@^1.2.0, jsep@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/jsep/-/jsep-1.4.0.tgz#19feccbfa51d8a79f72480b4b8e40ce2e17152f0" + resolved "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz" integrity sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw== jsesc@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-bigint@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== dependencies: bignumber.js "^9.0.0" -json-buffer@3.0.1, json-buffer@^3.0.1: +json-buffer@^3.0.1, json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-compare@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/json-schema-compare/-/json-schema-compare-0.2.2.tgz#dd601508335a90c7f4cfadb6b2e397225c908e56" + resolved "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz" integrity sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ== dependencies: lodash "^4.17.4" json-schema-merge-allof@^0.8.1: version "0.8.1" - resolved "https://registry.yarnpkg.com/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz#ed2828cdd958616ff74f932830a26291789eaaf2" + resolved "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz" integrity sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w== dependencies: compute-lcm "^1.1.2" @@ -7233,54 +7186,54 @@ json-schema-merge-allof@^0.8.1: json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-schema-typed@^8.0.2: version "8.0.2" - resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-8.0.2.tgz#e98ee7b1899ff4a184534d1f167c288c66bbeff4" + resolved "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz" integrity sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA== -json-schema@0.4.0: +json-schema@^0.4.0, json-schema@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@~2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.2.1.tgz#db73cd59d78cce28723199466b2a03d1be1df2bc" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz" integrity sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w== jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.1.tgz#b6e31717f22cc37330b081ce0051ed5de53af2f6" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz" integrity sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q== dependencies: universalify "^2.0.0" @@ -7289,7 +7242,7 @@ jsonfile@^6.0.1: jsonpath-plus@^10.3.0, "jsonpath-plus@^6.0.1 || ^10.1.0": version "10.4.0" - resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz#73cf545c231afda21452150b7a2a58e48e109702" + resolved "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz" integrity sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA== dependencies: "@jsep-plugin/assignment" "^1.3.0" @@ -7298,17 +7251,17 @@ jsonpath-plus@^10.3.0, "jsonpath-plus@^6.0.1 || ^10.1.0": jsonpath-plus@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz#7ad94e147b3ed42f7939c315d2b9ce490c5a3899" + resolved "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz" integrity sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA== jsonpointer@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== jsonwebtoken@^9.0.0, jsonwebtoken@^9.0.2: version "9.0.3" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz#6cd57ab01e9b0ac07cb847d53d3c9b6ee31f7ae2" + resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz" integrity sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g== dependencies: jws "^4.0.1" @@ -7324,7 +7277,7 @@ jsonwebtoken@^9.0.0, jsonwebtoken@^9.0.2: jsprim@^1.2.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" @@ -7334,7 +7287,7 @@ jsprim@^1.2.2: jss-plugin-camel-case@^10.5.1: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz#27ea159bab67eb4837fa0260204eb7925d4daa1c" + resolved "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz" integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== dependencies: "@babel/runtime" "^7.3.1" @@ -7343,7 +7296,7 @@ jss-plugin-camel-case@^10.5.1: jss-plugin-default-unit@^10.5.1: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz#db3925cf6a07f8e1dd459549d9c8aadff9804293" + resolved "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz" integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== dependencies: "@babel/runtime" "^7.3.1" @@ -7351,7 +7304,7 @@ jss-plugin-default-unit@^10.5.1: jss-plugin-global@^10.5.1: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz#1c55d3c35821fab67a538a38918292fc9c567efd" + resolved "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz" integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== dependencies: "@babel/runtime" "^7.3.1" @@ -7359,7 +7312,7 @@ jss-plugin-global@^10.5.1: jss-plugin-nested@^10.5.1: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz#db872ed8925688806e77f1fc87f6e62264513219" + resolved "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz" integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== dependencies: "@babel/runtime" "^7.3.1" @@ -7368,7 +7321,7 @@ jss-plugin-nested@^10.5.1: jss-plugin-props-sort@^10.5.1: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz#67f4dd4c70830c126f4ec49b4b37ccddb680a5d7" + resolved "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz" integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== dependencies: "@babel/runtime" "^7.3.1" @@ -7376,7 +7329,7 @@ jss-plugin-props-sort@^10.5.1: jss-plugin-rule-value-function@^10.5.1: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz#7d99e3229e78a3712f78ba50ab342e881d26a24b" + resolved "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz" integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== dependencies: "@babel/runtime" "^7.3.1" @@ -7385,16 +7338,16 @@ jss-plugin-rule-value-function@^10.5.1: jss-plugin-vendor-prefixer@^10.5.1: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz#c01428ef5a89f2b128ec0af87a314d0c767931c7" + resolved "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz" integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== dependencies: "@babel/runtime" "^7.3.1" css-vendor "^2.0.8" jss "10.10.0" -jss@10.10.0, jss@^10.5.1: +jss@^10.5.1, jss@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.10.0.tgz#a75cc85b0108c7ac8c7b7d296c520a3e4fbc6ccc" + resolved "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz" integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== dependencies: "@babel/runtime" "^7.3.1" @@ -7404,7 +7357,7 @@ jss@10.10.0, jss@^10.5.1: jwa@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" + resolved "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz" integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== dependencies: buffer-equal-constant-time "^1.0.1" @@ -7413,7 +7366,7 @@ jwa@^2.0.1: jws@^4.0.0, jws@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.1.tgz#07edc1be8fac20e677b283ece261498bd38f0690" + resolved "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz" integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA== dependencies: jwa "^2.0.1" @@ -7421,19 +7374,19 @@ jws@^4.0.0, jws@^4.0.1: keyv@^4.5.2, keyv@^4.5.4: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" kleur@^4.0.3: version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== knex@^3.0.0: version "3.2.10" - resolved "https://registry.yarnpkg.com/knex/-/knex-3.2.10.tgz#ca8f77a10851b1e18b26463a6dc995e563c3b165" + resolved "https://registry.npmjs.org/knex/-/knex-3.2.10.tgz" integrity sha512-oypTHfrc9i72iyxaUQBKHOxhcr0xM65MPf6FpN02nimsftXwzXprIkLjfXdubvhbu4PMWLp023q8o8CYvHSuZw== dependencies: colorette "2.0.19" @@ -7453,24 +7406,24 @@ knex@^3.0.0: kuler@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== lazystream@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" + resolved "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz" integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== dependencies: readable-stream "^2.0.5" -leven@3.1.0, leven@^3.1.0: +leven@^3.1.0, leven@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -7478,32 +7431,32 @@ levn@^0.4.1: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== linkify-react@4.1.3: version "4.1.3" - resolved "https://registry.yarnpkg.com/linkify-react/-/linkify-react-4.1.3.tgz#461d348b4bdab3fcd0452ae1b5bbc22536395b97" + resolved "https://registry.npmjs.org/linkify-react/-/linkify-react-4.1.3.tgz" integrity sha512-rhI3zM/fxn5BfRPHfi4r9N7zgac4vOIxub1wHIWXLA5ENTMs+BGaIaFO1D1PhmxgwhIKmJz3H7uCP0Dg5JwSlA== linkify-react@4.3.2: version "4.3.2" - resolved "https://registry.yarnpkg.com/linkify-react/-/linkify-react-4.3.2.tgz#8d47fb0ad96ab5b38c07bfbebdcbc57794430693" + resolved "https://registry.npmjs.org/linkify-react/-/linkify-react-4.3.2.tgz" integrity sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ== +linkifyjs@^4.0.0, linkifyjs@4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.2.tgz" + integrity sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA== + linkifyjs@4.1.3: version "4.1.3" - resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.1.3.tgz#0edbc346428a7390a23ea2e5939f76112c9ae07f" + resolved "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz" integrity sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg== -linkifyjs@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.3.2.tgz#d97eb45419aabf97ceb4b05a7adeb7b8c8ade2b1" - integrity sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA== - local-pkg@^0.5.0: version "0.5.1" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" + resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz" integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== dependencies: mlly "^1.7.3" @@ -7511,76 +7464,76 @@ local-pkg@^0.5.0: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.flattendeep@^4.0.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz" integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== lodash.includes@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== lodash.isboolean@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== lodash.isinteger@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== lodash.isnumber@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== lodash.isplainobject@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== lodash.isstring@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== lodash.once@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== lodash.topath@^4.5.2: version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" + resolved "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz" integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg== lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.18.1: version "4.18.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== logform@^2.3.2, logform@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + resolved "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz" integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== dependencies: "@colors/colors" "1.6.0" @@ -7592,92 +7545,97 @@ logform@^2.3.2, logform@^2.7.0: long@^5.0.0, long@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + resolved "https://registry.npmjs.org/long/-/long-5.3.2.tgz" integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== longest-streak@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.6, loupe@^2.3.7: version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz" integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: get-func-name "^2.0.1" lowlight@^1.17.0: version "1.20.0" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" + resolved "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz" integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== dependencies: fault "^1.0.0" highlight.js "~10.7.0" -lru-cache@^11.0.0, lru-cache@^11.3.5: +lru-cache@^11.0.0: + version "11.5.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz" + integrity sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A== + +lru-cache@^11.3.5: version "11.5.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.1.tgz#f3daa3540847b9737ebc02499ddb36765e54db4a" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz" integrity sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A== lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lru-cache@^9.0.0: version "9.1.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.2.tgz#255fdbc14b75589d6d0e73644ca167a8db506835" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz" integrity sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ== lru.min@^1.1.0, lru.min@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.4.tgz#6ea1737a8c1ba2300cc87ad46910a4bdffa0117b" + resolved "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz" integrity sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA== luxon@^3.0.0: version "3.7.2" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.2.tgz#d697e48f478553cca187a0f8436aff468e3ba0ba" + resolved "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz" integrity sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew== lz-string@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== magic-string@^0.25.7: version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: sourcemap-codec "^1.4.8" magic-string@^0.30.5: version "0.30.21" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz" integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" magicast@^0.3.3: version "0.3.5" - resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.3.5.tgz#8301c3c7d66704a0771eb1bad74274f0ec036739" + resolved "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz" integrity sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ== dependencies: "@babel/parser" "^7.25.4" @@ -7686,36 +7644,36 @@ magicast@^0.3.3: make-dir@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: semver "^7.5.3" make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== markdown-table@^3.0.0: version "3.0.4" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz" integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== marked@^15.0.12: version "15.0.12" - resolved "https://registry.yarnpkg.com/marked/-/marked-15.0.12.tgz#30722c7346e12d0a2d0207ab9b0c4f0102d86c4e" + resolved "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz" integrity sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA== matcher@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + resolved "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz" integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== dependencies: escape-string-regexp "^4.0.0" material-ui-popup-state@^5.3.6: version "5.3.7" - resolved "https://registry.yarnpkg.com/material-ui-popup-state/-/material-ui-popup-state-5.3.7.tgz#dddb75194db390cce1684f4f39d83b5be9fb77ae" + resolved "https://registry.npmjs.org/material-ui-popup-state/-/material-ui-popup-state-5.3.7.tgz" integrity sha512-3ppRgNEfJ4pSEmVnRYeDDi/8L6RSGnsBrCP+WikozCeF7E21DyKAm80EOtBbeiOTooPCEQoeqrQ32uDKW2VYcw== dependencies: "@babel/runtime" "^7.26.0" @@ -7725,12 +7683,12 @@ material-ui-popup-state@^5.3.6: math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== mdast-util-definitions@^5.0.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz" integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== dependencies: "@types/mdast" "^3.0.0" @@ -7739,7 +7697,7 @@ mdast-util-definitions@^5.0.0: mdast-util-find-and-replace@^2.0.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz" integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== dependencies: "@types/mdast" "^3.0.0" @@ -7749,7 +7707,7 @@ mdast-util-find-and-replace@^2.0.0: mdast-util-from-markdown@^1.0.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz" integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== dependencies: "@types/mdast" "^3.0.0" @@ -7767,7 +7725,7 @@ mdast-util-from-markdown@^1.0.0: mdast-util-gfm-autolink-literal@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz" integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== dependencies: "@types/mdast" "^3.0.0" @@ -7777,7 +7735,7 @@ mdast-util-gfm-autolink-literal@^1.0.0: mdast-util-gfm-footnote@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz" integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== dependencies: "@types/mdast" "^3.0.0" @@ -7786,7 +7744,7 @@ mdast-util-gfm-footnote@^1.0.0: mdast-util-gfm-strikethrough@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz" integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== dependencies: "@types/mdast" "^3.0.0" @@ -7794,7 +7752,7 @@ mdast-util-gfm-strikethrough@^1.0.0: mdast-util-gfm-table@^1.0.0: version "1.0.7" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz" integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== dependencies: "@types/mdast" "^3.0.0" @@ -7804,7 +7762,7 @@ mdast-util-gfm-table@^1.0.0: mdast-util-gfm-task-list-item@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz" integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== dependencies: "@types/mdast" "^3.0.0" @@ -7812,7 +7770,7 @@ mdast-util-gfm-task-list-item@^1.0.0: mdast-util-gfm@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz" integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== dependencies: mdast-util-from-markdown "^1.0.0" @@ -7825,7 +7783,7 @@ mdast-util-gfm@^2.0.0: mdast-util-phrasing@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz" integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== dependencies: "@types/mdast" "^3.0.0" @@ -7833,7 +7791,7 @@ mdast-util-phrasing@^3.0.0: mdast-util-to-hast@^12.1.0: version "12.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz" integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== dependencies: "@types/hast" "^2.0.0" @@ -7847,7 +7805,7 @@ mdast-util-to-hast@^12.1.0: mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz" integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== dependencies: "@types/mdast" "^3.0.0" @@ -7861,69 +7819,69 @@ mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz" integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== dependencies: "@types/mdast" "^3.0.0" mdn-data@2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== mdn-data@2.27.1: version "2.27.1" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.27.1.tgz#e37b9c50880b75366c4d40ac63d9bbcacdb61f0e" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz" integrity sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ== -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - media-typer@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + memjs@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/memjs/-/memjs-1.3.2.tgz#0b6229bddba00162d1e281ed454217435c4968b3" + resolved "https://registry.npmjs.org/memjs/-/memjs-1.3.2.tgz" integrity sha512-qUEg2g8vxPe+zPn09KidjIStHPtoBO8Cttm8bgJFWWabbsjQ9Av9Ky+6UcvKx6ue0LLb/LEhtcyQpRyKfzeXcg== -"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: +memoize-one@^5.1.1, "memoize-one@>=3.1.1 <6": version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - merge-descriptors@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz" integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@^1.0.0, methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz" integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== dependencies: decode-named-character-reference "^1.0.0" @@ -7945,7 +7903,7 @@ micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: micromark-extension-gfm-autolink-literal@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz" integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== dependencies: micromark-util-character "^1.0.0" @@ -7955,7 +7913,7 @@ micromark-extension-gfm-autolink-literal@^1.0.0: micromark-extension-gfm-footnote@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz" integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== dependencies: micromark-core-commonmark "^1.0.0" @@ -7969,7 +7927,7 @@ micromark-extension-gfm-footnote@^1.0.0: micromark-extension-gfm-strikethrough@^1.0.0: version "1.0.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz" integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== dependencies: micromark-util-chunked "^1.0.0" @@ -7981,7 +7939,7 @@ micromark-extension-gfm-strikethrough@^1.0.0: micromark-extension-gfm-table@^1.0.0: version "1.0.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz" integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== dependencies: micromark-factory-space "^1.0.0" @@ -7992,14 +7950,14 @@ micromark-extension-gfm-table@^1.0.0: micromark-extension-gfm-tagfilter@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz" integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== dependencies: micromark-util-types "^1.0.0" micromark-extension-gfm-task-list-item@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz" integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== dependencies: micromark-factory-space "^1.0.0" @@ -8010,7 +7968,7 @@ micromark-extension-gfm-task-list-item@^1.0.0: micromark-extension-gfm@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz#e517e8579949a5024a493e49204e884aa74f5acf" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz" integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== dependencies: micromark-extension-gfm-autolink-literal "^1.0.0" @@ -8024,7 +7982,7 @@ micromark-extension-gfm@^2.0.0: micromark-factory-destination@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz" integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== dependencies: micromark-util-character "^1.0.0" @@ -8033,7 +7991,7 @@ micromark-factory-destination@^1.0.0: micromark-factory-label@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz" integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== dependencies: micromark-util-character "^1.0.0" @@ -8043,7 +8001,7 @@ micromark-factory-label@^1.0.0: micromark-factory-space@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz" integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== dependencies: micromark-util-character "^1.0.0" @@ -8051,7 +8009,7 @@ micromark-factory-space@^1.0.0: micromark-factory-title@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz" integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== dependencies: micromark-factory-space "^1.0.0" @@ -8061,7 +8019,7 @@ micromark-factory-title@^1.0.0: micromark-factory-whitespace@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz" integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== dependencies: micromark-factory-space "^1.0.0" @@ -8071,7 +8029,7 @@ micromark-factory-whitespace@^1.0.0: micromark-util-character@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz" integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== dependencies: micromark-util-symbol "^1.0.0" @@ -8079,14 +8037,14 @@ micromark-util-character@^1.0.0: micromark-util-chunked@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz" integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== dependencies: micromark-util-symbol "^1.0.0" micromark-util-classify-character@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz" integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== dependencies: micromark-util-character "^1.0.0" @@ -8095,7 +8053,7 @@ micromark-util-classify-character@^1.0.0: micromark-util-combine-extensions@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz" integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== dependencies: micromark-util-chunked "^1.0.0" @@ -8103,14 +8061,14 @@ micromark-util-combine-extensions@^1.0.0: micromark-util-decode-numeric-character-reference@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz" integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== dependencies: micromark-util-symbol "^1.0.0" micromark-util-decode-string@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz" integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== dependencies: decode-named-character-reference "^1.0.0" @@ -8120,31 +8078,31 @@ micromark-util-decode-string@^1.0.0: micromark-util-encode@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz" integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== micromark-util-html-tag-name@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz" integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== micromark-util-normalize-identifier@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz" integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== dependencies: micromark-util-symbol "^1.0.0" micromark-util-resolve-all@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz" integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== dependencies: micromark-util-types "^1.0.0" micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz" integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== dependencies: micromark-util-character "^1.0.0" @@ -8153,7 +8111,7 @@ micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: micromark-util-subtokenize@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz" integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== dependencies: micromark-util-chunked "^1.0.0" @@ -8163,17 +8121,17 @@ micromark-util-subtokenize@^1.0.0: micromark-util-symbol@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz" integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz" integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== micromark@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + resolved "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz" integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== dependencies: "@types/debug" "^4.0.0" @@ -8196,116 +8154,135 @@ micromark@^3.0.0: micromatch@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" +mime-db@^1.54.0, "mime-db@>= 1.43.0 < 2": + version "1.54.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0: - version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - mime-types@^2.1.12, mime-types@^2.1.35, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime-types@^3.0.0, mime-types@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz" integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== dependencies: mime-db "^1.54.0" -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mime@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz" integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== mimic-response@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@^10.2.2, minimatch@^10.2.4: +minimatch@^10.2.2: + version "10.2.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz" + integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== + dependencies: + brace-expansion "^5.0.5" + +minimatch@^10.2.4: version "10.2.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz" integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== dependencies: brace-expansion "^5.0.5" minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.4: version "3.1.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1, minimatch@^5.1.0: +minimatch@^5.0.1: version "5.1.9" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.9.tgz#1293ef15db0098b394540e8f9f744f9fda8dee4b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz" + integrity sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^5.1.0: + version "5.1.9" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz" integrity sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw== dependencies: brace-expansion "^2.0.1" minimatch@^9.0.0: version "9.0.9" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz" integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== dependencies: brace-expansion "^2.0.2" minimist@^1.2.5: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minimisted@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/minimisted/-/minimisted-2.0.1.tgz#d059fb905beecf0774bc3b308468699709805cb1" + resolved "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz" integrity sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA== dependencies: minimist "^1.2.5" minipass@^3.0.0: version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" minipass@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -minipass@^7.1.2, minipass@^7.1.3: +minipass@^7.1.2: + version "7.1.3" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== + +minipass@^7.1.3: version "7.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz" integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -8313,17 +8290,17 @@ minizlib@^2.1.1: mkdirp-classic@^0.5.2: version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== mkdirp@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mlly@^1.7.3, mlly@^1.7.4: version "1.8.2" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.8.2.tgz#e7f7919a82d13b174405613117249a3f449d78bb" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz" integrity sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA== dependencies: acorn "^8.16.0" @@ -8333,7 +8310,7 @@ mlly@^1.7.3, mlly@^1.7.4: morgan@^1.10.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.11.0.tgz#98464b8538802f14e9e5374ebe23ac364cd617e8" + resolved "https://registry.npmjs.org/morgan/-/morgan-1.11.0.tgz" integrity sha512-zSkVu3t18r39pw4ixfBKvfZi3y2UOqr7d4WYwcj3m8nXpEQK4rPO6GLzs/CExoRgmX3y9EjmmcXqv6jq0SK46g== dependencies: basic-auth "~2.0.1" @@ -8344,27 +8321,27 @@ morgan@^1.10.0: mri@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +ms@^2.1.1, ms@^2.1.3, ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - mysql2@^3.0.0: version "3.22.5" - resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.22.5.tgz#26c51c035ac577579ad239168015ad1eec321679" + resolved "https://registry.npmjs.org/mysql2/-/mysql2-3.22.5.tgz" integrity sha512-95uZ2TrPWAZdwpB3vvvDbmEMcNG8yIeNCyu6GUcr/QnWEE/wXm7+mhOCsdQfWQDTV7qYT/PDUZ4U4UPP4AsXqQ== dependencies: aws-ssl-profiles "^1.1.2" @@ -8378,19 +8355,19 @@ mysql2@^3.0.0: named-placeholders@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.6.tgz#c50c6920b43f258f59c16add1e56654f5cc02bb5" + resolved "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz" integrity sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w== dependencies: lru.min "^1.1.0" nan@^2.19.0, nan@^2.23.0: version "2.27.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.27.0.tgz#804e389f4c0e39b729a17eca85c80ebc4355c4c4" + resolved "https://registry.npmjs.org/nan/-/nan-2.27.0.tgz" integrity sha512-hC+0LidcL3XE4rp1C4H54KujgXKzbfyTngZTwBByQxsOxCEKZT0MPQ4hOKUH2jU1OYstqdDH4onyHPDzcV0XdQ== nano-css@^5.6.2: version "5.6.2" - resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.6.2.tgz#584884ddd7547278f6d6915b6805069742679a32" + resolved "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz" integrity sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -8404,32 +8381,32 @@ nano-css@^5.6.2: nanoid@^3.3.12: version "3.3.12" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.12.tgz#ab3d912e217a6d0a514f00a72a16543a28982c05" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz" integrity sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - negotiator@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz" integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== negotiator@~0.6.4: version "0.6.4" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + nimma@0.2.3: version "0.2.3" - resolved "https://registry.yarnpkg.com/nimma/-/nimma-0.2.3.tgz#33cd6244ede857d9c8ac45b9d1aad07091559e45" + resolved "https://registry.npmjs.org/nimma/-/nimma-0.2.3.tgz" integrity sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA== dependencies: "@jsep-plugin/regex" "^1.0.1" @@ -8442,61 +8419,61 @@ nimma@0.2.3: node-fetch@^2.6.0, node-fetch@^2.6.7, node-fetch@^2.6.9, node-fetch@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-forge@^1, node-forge@^1.3.1: version "1.4.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.4.0.tgz#1c7b7d8bdc2d078739f58287d589d903a11b2fc2" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz" integrity sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ== node-releases@^2.0.36: - version "2.0.47" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.47.tgz#521bb2786da8eb140b748841c0b3b3a75334ffc4" - integrity sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og== + version "2.0.48" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz" + integrity sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^5.1.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-hash@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== object-inspect@^1.13.3, object-inspect@^1.13.4: version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.7: version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: call-bind "^1.0.8" @@ -8508,45 +8485,45 @@ object.assign@^4.1.7: oidc-token-hash@^5.0.3: version "5.2.0" - resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.2.0.tgz#be8a8885c7e2478d21a674e15afa31f1bcc4a61f" + resolved "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.2.0.tgz" integrity sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw== on-finished@^2.4.1, on-finished@~2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" on-headers@~1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz" integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" one-time@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== dependencies: fn.name "1.x.x" onetime@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" open@^10.1.0: version "10.2.0" - resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" + resolved "https://registry.npmjs.org/open/-/open-10.2.0.tgz" integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== dependencies: default-browser "^5.2.1" @@ -8556,7 +8533,7 @@ open@^10.1.0: openid-client@^5.3.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.7.1.tgz#34cace862a3e6472ed7d0a8616ef73b7fb85a9c3" + resolved "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz" integrity sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew== dependencies: jose "^4.15.9" @@ -8566,7 +8543,7 @@ openid-client@^5.3.0: optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -8578,7 +8555,7 @@ optionator@^0.9.3: own-keys@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== dependencies: get-intrinsic "^1.2.6" @@ -8587,64 +8564,78 @@ own-keys@^1.0.1: p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-limit@^3.0.1, p-limit@^3.0.2, p-limit@^3.1.0: +p-limit@^3.0.1: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-limit@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz" integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== dependencies: yocto-queue "^1.0.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-throttle@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/p-throttle/-/p-throttle-4.1.1.tgz#80b1fbd358af40a8bfa1667f9dc8b72b714ad692" + resolved "https://registry.npmjs.org/p-throttle/-/p-throttle-4.1.1.tgz" integrity sha512-TuU8Ato+pRTPJoDzYD4s7ocJYcNSEZRvlxoq3hcPI2kZDZ49IQ1Wkj7/gDJc3X7XiEAAvRGtDzdXJI0tC3IL1g== p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@^1.0.10: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-entities@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== dependencies: character-entities "^1.0.0" @@ -8656,7 +8647,7 @@ parse-entities@^2.0.0: parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -8666,43 +8657,43 @@ parse-json@^5.0.0: parse-path@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.1.0.tgz#41fb513cb122831807a4c7b29c8727947a09d8c6" + resolved "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz" integrity sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw== dependencies: protocols "^2.0.0" parse-url@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" + resolved "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz" integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== dependencies: parse-path "^7.0.0" parse5@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parse5@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-8.0.1.tgz#f43bcd2cd683efe084075333e9ce0da7d06da31e" + resolved "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz" integrity sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw== dependencies: entities "^8.0.0" parseurl@^1.3.3, parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== passport-strategy@1.x.x: version "1.0.0" - resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + resolved "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz" integrity sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA== passport@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/passport/-/passport-0.7.0.tgz#3688415a59a48cf8068417a8a8092d4492ca3a05" + resolved "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz" integrity sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ== dependencies: passport-strategy "1.x.x" @@ -8711,42 +8702,42 @@ passport@^0.7.0: path-equal@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/path-equal/-/path-equal-1.2.5.tgz#9fcbdd5e5daee448e96f43f3bac06c666b5e982a" + resolved "https://registry.npmjs.org/path-equal/-/path-equal-1.2.5.tgz" integrity sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-expression-matcher@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz#3b98545dc88ffebb593e2d8458d0929da9275f4a" + resolved "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz" integrity sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz" integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== dependencies: lru-cache "^11.0.0" @@ -8754,92 +8745,97 @@ path-scurry@^2.0.2: path-to-regexp@^6.2.1: version "6.3.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz" integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== path-to-regexp@^8.0.0: version "8.4.2" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz#795c420c4f7ca45c5b887366f622ee0c9852cccd" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz" integrity sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA== path-to-regexp@~0.1.12: version "0.1.13" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz" integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathe@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== -pathe@^2.0.1, pathe@^2.0.3: +pathe@^2.0.1: version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pause@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + resolved "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== pct-encode@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/pct-encode/-/pct-encode-1.0.3.tgz#27c35c1e7b009ac30fff4c487aae93ed6ca372d0" + resolved "https://registry.npmjs.org/pct-encode/-/pct-encode-1.0.3.tgz" integrity sha512-+ojEvSHApoLWF2YYxwnOM4N9DPn5e5fG+j0YJ9drKNaYtrZYOq5M9ESOaBYqOHCXOAALODJJ4wkqHAXEuLpwMw== pend@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== pg-cloudflare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz#4b4c20e6d8ae531d400730f4804571a8d62f1497" + resolved "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz" integrity sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A== -pg-connection-string@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" - integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== - pg-connection-string@^2.13.0: version "2.13.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.13.0.tgz#8678113465a5af3cc977dcb51eadc847b27aa2de" + resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.13.0.tgz" integrity sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig== +pg-connection-string@^2.3.0, pg-connection-string@2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz" + integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== + pg-int8@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + resolved "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== pg-pool@^3.14.0: version "3.14.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.14.0.tgz#f35ae4eb846780cad71af24099b3edfa9781ad90" + resolved "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz" integrity sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw== pg-protocol@^1.14.0: version "1.14.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.14.0.tgz#c1f045b74274b007078c687147141f785f59b8de" + resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz" integrity sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA== pg-types@2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + resolved "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz" integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== dependencies: pg-int8 "1.0.1" @@ -8848,9 +8844,9 @@ pg-types@2.2.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^8.11.3: +pg@^8.11.3, pg@>=8.0: version "8.21.0" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.21.0.tgz#d7fa2118d960cec5cc7d2b24525f9850dd5932b0" + resolved "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz" integrity sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA== dependencies: pg-connection-string "^2.13.0" @@ -8863,39 +8859,39 @@ pg@^8.11.3: pgpass@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + resolved "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz" integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== dependencies: split2 "^4.1.0" -picocolors@1.1.1, picocolors@^1.0.0, picocolors@^1.1.1: +picocolors@^1.0.0, picocolors@^1.1.1, picocolors@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz" integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== -picomatch@^4.0.4: +"picomatch@^3 || ^4", picomatch@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pkce-challenge@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/pkce-challenge/-/pkce-challenge-5.0.1.tgz#3b4446865b17b1745e9ace2016a31f48ddf6230d" + resolved "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz" integrity sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ== pkg-types@^1.2.1, pkg-types@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz" integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== dependencies: confbox "^0.1.8" @@ -8904,27 +8900,27 @@ pkg-types@^1.2.1, pkg-types@^1.3.1: pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -pony-cause@1.1.1, pony-cause@^1.1.1: +pony-cause@^1.1.1, pony-cause@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-1.1.1.tgz#f795524f83bebbf1878bd3587b45f69143cbf3f9" + resolved "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz" integrity sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g== popper.js@1.16.1-lts: version "1.16.1-lts" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz" integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== possible-typed-array-names@^1.0.0, possible-typed-array-names@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== postcss@^8.4.43: version "8.5.15" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.15.tgz#d1eaf677a324e9ec02196da2d3fecf4a0b9a735c" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz" integrity sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A== dependencies: nanoid "^3.3.12" @@ -8933,34 +8929,34 @@ postcss@^8.4.43: postgres-array@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== postgres-bytea@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.1.tgz#c40b3da0222c500ff1e51c5d7014b60b79697c7a" + resolved "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz" integrity sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ== postgres-date@~1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + resolved "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz" integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== postgres-interval@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + resolved "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz" integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== dependencies: xtend "^4.0.0" prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== pretty-format@^27.0.2: version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: ansi-regex "^5.0.1" @@ -8969,7 +8965,7 @@ pretty-format@^27.0.2: pretty-format@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" @@ -8978,27 +8974,27 @@ pretty-format@^29.7.0: prismjs@^1.30.0: version "1.30.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz" integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== prismjs@~1.27.0: version "1.27.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz" integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.10: version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -9007,19 +9003,19 @@ prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2, property-information@^5.0.0: version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz" integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== dependencies: xtend "^4.0.0" property-information@^6.0.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz" integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== protobufjs@^7.2.5, protobufjs@^7.3.2, protobufjs@^7.5.5: version "7.6.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.6.4.tgz#8bb000300026efd63eb7951d26e5dbb38f5658f2" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz" integrity sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw== dependencies: "@protobufjs/aspromise" "^1.1.2" @@ -9036,12 +9032,12 @@ protobufjs@^7.2.5, protobufjs@^7.3.2, protobufjs@^7.5.5: protocols@^2.0.0, protocols@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.2.tgz#822e8fcdcb3df5356538b3e91bfd890b067fd0a4" + resolved "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz" integrity sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ== proxy-addr@^2.0.7, proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -9049,14 +9045,14 @@ proxy-addr@^2.0.7, proxy-addr@~2.0.7: psl@^1.1.28: version "1.15.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + resolved "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz" integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== dependencies: punycode "^2.3.1" pump@^3.0.0: version "3.0.4" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz" integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA== dependencies: end-of-stream "^1.1.0" @@ -9064,39 +9060,39 @@ pump@^3.0.0: punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@^6.14.0, qs@^6.15.2, qs@^6.9.4, qs@~6.15.1: version "6.15.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.2.tgz#fd55426d710403ddccc45e0f9eab16db7727ece9" + resolved "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz" integrity sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw== dependencies: side-channel "^1.1.0" qs@~6.5.2: version "6.5.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.5.tgz#7c9442fc3f1c58bb52ac57ad09db63ba68916395" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz" integrity sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== raf-schd@^4.0.2: version "4.0.3" - resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" + resolved "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz" integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@^2.4.1, raw-body@~2.5.3: version "2.5.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz" integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== dependencies: bytes "~3.1.2" @@ -9106,7 +9102,7 @@ raw-body@^2.4.1, raw-body@~2.5.3: raw-body@^3.0.0, raw-body@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.2.tgz#3e3ada5ae5568f9095d84376fd3a49b8fb000a51" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz" integrity sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== dependencies: bytes "~3.1.2" @@ -9116,7 +9112,7 @@ raw-body@^3.0.0, raw-body@^3.0.2: rc-progress@3.5.1: version "3.5.1" - resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.5.1.tgz#a3cdfd2fe04eb5c3d43fa1c69e7dd70c73b102ae" + resolved "https://registry.npmjs.org/rc-progress/-/rc-progress-3.5.1.tgz" integrity sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw== dependencies: "@babel/runtime" "^7.10.1" @@ -9125,7 +9121,7 @@ rc-progress@3.5.1: rc-util@^5.16.1: version "5.44.4" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.44.4.tgz#89ee9037683cca01cd60f1a6bbda761457dd6ba5" + resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz" integrity sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w== dependencies: "@babel/runtime" "^7.18.3" @@ -9133,7 +9129,7 @@ rc-util@^5.16.1: react-aria-components@~1.17.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/react-aria-components/-/react-aria-components-1.17.0.tgz#7fd5c9b6c575b3353a5bf9996dbdc39c1ccc211e" + resolved "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.17.0.tgz" integrity sha512-0EyisMgvsFJ2aML3crDYv2tW5vT2Ryf8PGzY/g63JjDdCbLshlwazhS8JNtPF1vkTkungJJ6sVJbKyX+YKSoFA== dependencies: "@internationalized/date" "^3.12.1" @@ -9143,9 +9139,9 @@ react-aria-components@~1.17.0: react-aria "3.48.0" react-stately "3.46.0" -react-aria@3.48.0, react-aria@~3.48.0: +react-aria@~3.48.0, react-aria@3.48.0: version "3.48.0" - resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.48.0.tgz#ede91d3b247d34ea35216e246f0cb7de074303bd" + resolved "https://registry.npmjs.org/react-aria/-/react-aria-3.48.0.tgz" integrity sha512-jQjd4rBEIMqecBaAKYJbVGK6EqIHLa5znVQ7jwFyK5vCyljoj6KhgtiahmcIPsG5vG5vEDLw+ba+bEWn6A2P4w== dependencies: "@internationalized/date" "^3.12.1" @@ -9160,7 +9156,7 @@ react-aria@3.48.0, react-aria@~3.48.0: react-beautiful-dnd@^13.0.0: version "13.1.1" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" + resolved "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz" integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ== dependencies: "@babel/runtime" "^7.9.2" @@ -9171,9 +9167,9 @@ react-beautiful-dnd@^13.0.0: redux "^4.0.4" use-memo-one "^1.1.1" -react-dom@^18: +react-dom@*, "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom@^16.8 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0", "react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", react-dom@^18, react-dom@^18.0.0, "react-dom@^18.0.0 || ^19.0.0", react-dom@>=16, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=16.9.0: version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" @@ -9181,24 +9177,24 @@ react-dom@^18: react-double-scrollbar@0.0.15: version "0.0.15" - resolved "https://registry.yarnpkg.com/react-double-scrollbar/-/react-double-scrollbar-0.0.15.tgz#e915ab8cb3b959877075f49436debfdb04288fe4" + resolved "https://registry.npmjs.org/react-double-scrollbar/-/react-double-scrollbar-0.0.15.tgz" integrity sha512-dLz3/WBIpgFnzFY0Kb4aIYBMT2BWomHuW2DH6/9jXfS6/zxRRBUFQ04My4HIB7Ma7QoRBpcy8NtkPeFgcGBpgg== react-fast-compare@^3.1.1: version "3.2.2" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== react-full-screen@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/react-full-screen/-/react-full-screen-1.1.1.tgz#b707d56891015a71c503a65dbab3086d75be97d7" + resolved "https://registry.npmjs.org/react-full-screen/-/react-full-screen-1.1.1.tgz" integrity sha512-xoEgkoTiN0dw9cjYYGViiMCBYbkS97BYb4bHPhQVWXj1UnOs8PZ1rPzpX+2HMhuvQV1jA5AF9GaRbO3fA5aZtg== dependencies: fscreen "^1.0.2" react-helmet@6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + resolved "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz" integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== dependencies: object-assign "^4.1.1" @@ -9208,37 +9204,57 @@ react-helmet@6.1.0: react-hook-form@^7.12.2: version "7.79.0" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.79.0.tgz#dc965ecb161e67ea91ee46f00d870ea35871b26a" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.79.0.tgz" integrity sha512-mhYp/MTmXvzYX6AJcJVko0rktoIhhmRnEouObj4wF5i/tCttgJvnp1+9wRkpITZjDTqpo4IOSJqu0dBlPlV/Lw== react-idle-timer@5.7.2: version "5.7.2" - resolved "https://registry.yarnpkg.com/react-idle-timer/-/react-idle-timer-5.7.2.tgz#f506db28a86645dd1b87987116501703e512142b" + resolved "https://registry.npmjs.org/react-idle-timer/-/react-idle-timer-5.7.2.tgz" integrity sha512-+BaPfc7XEUU5JFkwZCx6fO1bLVK+RBlFH+iY4X34urvIzZiZINP6v2orePx3E6pAztJGE7t4DzvL7if2SL/0GQ== -react-is@^16.13.1, react-is@^16.7.0: +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^16.7.0: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: +"react-is@^16.8.0 || ^17.0.0": + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^18.0.0, react-is@^18.2.0: version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-is@^19.0.0: version "19.2.7" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.2.7.tgz#57668ee86a78574a542b0a539455212b2c086df2" + resolved "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz" + integrity sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A== + +react-is@^19.2.6: + version "19.2.7" + resolved "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz" integrity sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A== react-markdown@^8.0.0: version "8.0.7" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.7.tgz#c8dbd1b9ba5f1c5e7e5f2a44de465a3caafdf89b" + resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz" integrity sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ== dependencies: "@types/hast" "^2.0.0" @@ -9259,7 +9275,7 @@ react-markdown@^8.0.0: react-redux@^7.2.0: version "7.2.9" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz" integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== dependencies: "@babel/runtime" "^7.15.4" @@ -9271,24 +9287,39 @@ react-redux@^7.2.0: react-refresh@^0.17.0: version "0.17.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz" integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== +react-router-dom@^6.3.0, react-router-dom@^6.30.2, "react-router-dom@6.0.0-beta.0 || ^6.3.0": + version "6.30.4" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz" + integrity sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q== + dependencies: + "@remix-run/router" "1.23.3" + react-router "6.30.4" + +react-router@6.30.4: + version "6.30.4" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz" + integrity sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA== + dependencies: + "@remix-run/router" "1.23.3" + react-side-effect@^2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" + resolved "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz" integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw== react-sparklines@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/react-sparklines/-/react-sparklines-1.7.0.tgz#9b1d97e8c8610095eeb2ad658d2e1fcf91f91a60" + resolved "https://registry.npmjs.org/react-sparklines/-/react-sparklines-1.7.0.tgz" integrity sha512-bJFt9K4c5Z0k44G8KtxIhbG+iyxrKjBZhdW6afP+R7EnIq+iKjbWbEFISrf3WKNFsda+C46XAfnX0StS5fbDcg== dependencies: prop-types "^15.5.10" -react-stately@3.46.0, react-stately@~3.46.0: +react-stately@~3.46.0, react-stately@3.46.0: version "3.46.0" - resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.46.0.tgz#9ce293b765c246c398a1765d6290acd0a77caa49" + resolved "https://registry.npmjs.org/react-stately/-/react-stately-3.46.0.tgz" integrity sha512-OdxhWvHgs2L4OJGIs7hnuTr5WjjMM6enhNEAMRqiekhF8+ITvA2LRwNftOZwcogaoCslGYq5S2VQTQwnm0GbCA== dependencies: "@internationalized/date" "^3.12.1" @@ -9300,7 +9331,7 @@ react-stately@3.46.0, react-stately@~3.46.0: react-syntax-highlighter@^15.4.5: version "15.6.6" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.6.6.tgz#77417c81ebdc554300d0332800a2e1efe5b1190b" + resolved "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.6.tgz" integrity sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw== dependencies: "@babel/runtime" "^7.3.1" @@ -9312,7 +9343,7 @@ react-syntax-highlighter@^15.4.5: react-transition-group@^4.0.0, react-transition-group@^4.4.0, react-transition-group@^4.4.5: version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" @@ -9322,12 +9353,12 @@ react-transition-group@^4.0.0, react-transition-group@^4.4.0, react-transition-g react-universal-interface@^0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/react-universal-interface/-/react-universal-interface-0.6.2.tgz#5e8d438a01729a4dbbcbeeceb0b86be146fe2b3b" + resolved "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz" integrity sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw== react-use@^17.2.4, react-use@^17.3.2: version "17.6.1" - resolved "https://registry.yarnpkg.com/react-use/-/react-use-17.6.1.tgz#c9692540f2230b763e42076fbf350e7e33ec2e21" + resolved "https://registry.npmjs.org/react-use/-/react-use-17.6.1.tgz" integrity sha512-uibb3pgzV4LFsYPHyXYGu7dD2+pyk/ZJlPH+AizBR3zolqPWyCleKcWWbUQaKSKfydwgnQ3ymGm1Ab3/saGHCA== dependencies: "@types/js-cookie" "^3.0.0" @@ -9347,27 +9378,27 @@ react-use@^17.2.4, react-use@^17.3.2: react-virtualized-auto-sizer@^1.0.11: version "1.0.26" - resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz#e9470ef6a778dc4f1d5fd76305fa2d8b610c357a" + resolved "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz" integrity sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A== react-window@^1.8.6: version "1.8.11" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.11.tgz#a857b48fa85bd77042d59cc460964ff2e0648525" + resolved "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz" integrity sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ== dependencies: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -react@^18: +react@*, "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.13.1 || ^17.0.0 || ^18.0.0", "react@^16.3.0 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17 || ^18", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react@^16.8.3 || ^17 || ^18", "react@^16.8.5 || ^17.0.0 || ^18.0.0", "react@^17.0.0 || ^18.0.0", "react@^17.0.0 || ^18.0.0 || ^19.0.0", react@^18, react@^18.0.0, "react@^18.0.0 || ^19.0.0", react@^18.3.1, "react@>= 0.14.0", "react@>= 0.14.7", "react@>= 15.0.0", "react@>= 16.8.0", react@>=16, react@>=16.3.0, react@>=16.6.0, react@>=16.8, react@>=16.8.0, "react@>=16.8.0 <20", react@>=16.9.0, react@>=18.2.0: version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" read-yaml-file@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" + resolved "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz" integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== dependencies: graceful-fs "^4.1.5" @@ -9377,7 +9408,7 @@ read-yaml-file@^1.1.0: readable-stream@^2.0.5: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -9390,7 +9421,7 @@ readable-stream@^2.0.5: readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -9399,7 +9430,7 @@ readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable readable-stream@^4.0.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz" integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== dependencies: abort-controller "^3.0.0" @@ -9410,47 +9441,47 @@ readable-stream@^4.0.0: readdir-glob@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584" + resolved "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz" integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== dependencies: minimatch "^5.1.0" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" rechoir@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: resolve "^1.20.0" -redis-errors@1.2.0, redis-errors@^1.0.0: +redis-errors@^1.0.0, redis-errors@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" + resolved "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz" integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w== redis-parser@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + resolved "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz" integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A== dependencies: redis-errors "^1.0.0" redux@^4.0.0, redux@^4.0.4: version "4.2.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" + resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== dependencies: "@babel/runtime" "^7.9.2" reflect.getprototypeof@^1.0.10, reflect.getprototypeof@^1.0.9: version "1.0.10" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: call-bind "^1.0.8" @@ -9464,7 +9495,7 @@ reflect.getprototypeof@^1.0.10, reflect.getprototypeof@^1.0.9: refractor@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" + resolved "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz" integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== dependencies: hastscript "^6.0.0" @@ -9473,7 +9504,7 @@ refractor@^3.6.0: regexp.prototype.flags@^1.5.4: version "1.5.4" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: call-bind "^1.0.8" @@ -9485,7 +9516,7 @@ regexp.prototype.flags@^1.5.4: rehype-raw@^6.0.0: version "6.1.1" - resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-6.1.1.tgz#81bbef3793bd7abacc6bf8335879d1b6c868c9d4" + resolved "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz" integrity sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ== dependencies: "@types/hast" "^2.0.0" @@ -9494,7 +9525,7 @@ rehype-raw@^6.0.0: rehype-sanitize@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/rehype-sanitize/-/rehype-sanitize-5.0.1.tgz#dac01a7417bdd329260c74c74449697b4be5eb56" + resolved "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-5.0.1.tgz" integrity sha512-da/jIOjq8eYt/1r9GN6GwxIR3gde7OZ+WV8pheu1tL8K0D9KxM2AyMh+UEfke+FfdM3PvGHeYJU0Td5OWa7L5A== dependencies: "@types/hast" "^2.0.0" @@ -9503,7 +9534,7 @@ rehype-sanitize@^5.0.0: remark-gfm@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz" integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== dependencies: "@types/mdast" "^3.0.0" @@ -9513,7 +9544,7 @@ remark-gfm@^3.0.1: remark-parse@^10.0.0: version "10.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz" integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== dependencies: "@types/mdast" "^3.0.0" @@ -9522,7 +9553,7 @@ remark-parse@^10.0.0: remark-rehype@^10.0.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz" integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== dependencies: "@types/hast" "^2.0.0" @@ -9532,7 +9563,7 @@ remark-rehype@^10.0.0: request@^2.88.0: version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" @@ -9558,37 +9589,37 @@ request@^2.88.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== reserved@0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/reserved/-/reserved-0.1.2.tgz#707b1246a3269f755da7cfcf9af6f4983bef105c" + resolved "https://registry.npmjs.org/reserved/-/reserved-0.1.2.tgz" integrity sha512-/qO54MWj5L8WCBP9/UNe2iefJc+L9yETbH32xO/ft/EYPOTCR5k+azvDUgdCOKwZH8hXwPd0b8XBL78Nn2U69g== resize-observer-polyfill@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: version "1.22.12" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz" integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== dependencies: es-errors "^1.3.0" @@ -9598,7 +9629,7 @@ resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: retry-request@^7.0.0: version "7.0.2" - resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-7.0.2.tgz#60bf48cfb424ec01b03fca6665dee91d06dd95f3" + resolved "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz" integrity sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w== dependencies: "@types/request" "^2.48.8" @@ -9607,29 +9638,29 @@ retry-request@^7.0.0: retry@0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rfc4648@^1.3.0: version "1.5.4" - resolved "https://registry.yarnpkg.com/rfc4648/-/rfc4648-1.5.4.tgz#1174c0afba72423a0b70c386ecfeb80aa61b05ca" + resolved "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.4.tgz" integrity sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg== rifm@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/rifm/-/rifm-0.7.0.tgz#debe951a9c83549ca6b33e5919f716044c2230be" + resolved "https://registry.npmjs.org/rifm/-/rifm-0.7.0.tgz" integrity sha512-DSOJTWHD67860I5ojetXdEQRIBvF6YcpNe53j0vn1vp9EUb9N80EiZTxgP+FkDKorWC8PZw052kTF4C1GOivCQ== dependencies: "@babel/runtime" "^7.3.1" roarr@^2.15.3: version "2.15.4" - resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + resolved "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz" integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== dependencies: boolean "^3.0.1" @@ -9639,50 +9670,50 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" -rollup@^4.20.0: - version "4.62.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.62.0.tgz#f68956c966f3c4a51dafbafc5d5388553244191b" - integrity sha512-nc72Wgq62I7rtDV4izT5/aaS0zxy3kttkinf9586ApknY3jZO9NYsmtc24fUckA0X7Q2v+ML4a15pdUlV5V/jA== - dependencies: - "@types/estree" "1.0.9" +rollup@^1.20.0||^2.0.0, rollup@^2.68.0, rollup@~2.80.0: + version "2.80.0" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.80.0.tgz" + integrity sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ== optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.62.0" - "@rollup/rollup-android-arm64" "4.62.0" - "@rollup/rollup-darwin-arm64" "4.62.0" - "@rollup/rollup-darwin-x64" "4.62.0" - "@rollup/rollup-freebsd-arm64" "4.62.0" - "@rollup/rollup-freebsd-x64" "4.62.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.62.0" - "@rollup/rollup-linux-arm-musleabihf" "4.62.0" - "@rollup/rollup-linux-arm64-gnu" "4.62.0" - "@rollup/rollup-linux-arm64-musl" "4.62.0" - "@rollup/rollup-linux-loong64-gnu" "4.62.0" - "@rollup/rollup-linux-loong64-musl" "4.62.0" - "@rollup/rollup-linux-ppc64-gnu" "4.62.0" - "@rollup/rollup-linux-ppc64-musl" "4.62.0" - "@rollup/rollup-linux-riscv64-gnu" "4.62.0" - "@rollup/rollup-linux-riscv64-musl" "4.62.0" - "@rollup/rollup-linux-s390x-gnu" "4.62.0" - "@rollup/rollup-linux-x64-gnu" "4.62.0" - "@rollup/rollup-linux-x64-musl" "4.62.0" - "@rollup/rollup-openbsd-x64" "4.62.0" - "@rollup/rollup-openharmony-arm64" "4.62.0" - "@rollup/rollup-win32-arm64-msvc" "4.62.0" - "@rollup/rollup-win32-ia32-msvc" "4.62.0" - "@rollup/rollup-win32-x64-gnu" "4.62.0" - "@rollup/rollup-win32-x64-msvc" "4.62.0" fsevents "~2.3.2" -rollup@~2.80.0: - version "2.80.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.80.0.tgz#a82efc15b748e986a7c76f0f771221b1fa108a2c" - integrity sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ== +rollup@^4.20.0: + version "4.61.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz" + integrity sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA== + dependencies: + "@types/estree" "1.0.9" optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.61.1" + "@rollup/rollup-android-arm64" "4.61.1" + "@rollup/rollup-darwin-arm64" "4.61.1" + "@rollup/rollup-darwin-x64" "4.61.1" + "@rollup/rollup-freebsd-arm64" "4.61.1" + "@rollup/rollup-freebsd-x64" "4.61.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.61.1" + "@rollup/rollup-linux-arm-musleabihf" "4.61.1" + "@rollup/rollup-linux-arm64-gnu" "4.61.1" + "@rollup/rollup-linux-arm64-musl" "4.61.1" + "@rollup/rollup-linux-loong64-gnu" "4.61.1" + "@rollup/rollup-linux-loong64-musl" "4.61.1" + "@rollup/rollup-linux-ppc64-gnu" "4.61.1" + "@rollup/rollup-linux-ppc64-musl" "4.61.1" + "@rollup/rollup-linux-riscv64-gnu" "4.61.1" + "@rollup/rollup-linux-riscv64-musl" "4.61.1" + "@rollup/rollup-linux-s390x-gnu" "4.61.1" + "@rollup/rollup-linux-x64-gnu" "4.61.1" + "@rollup/rollup-linux-x64-musl" "4.61.1" + "@rollup/rollup-openbsd-x64" "4.61.1" + "@rollup/rollup-openharmony-arm64" "4.61.1" + "@rollup/rollup-win32-arm64-msvc" "4.61.1" + "@rollup/rollup-win32-ia32-msvc" "4.61.1" + "@rollup/rollup-win32-x64-gnu" "4.61.1" + "@rollup/rollup-win32-x64-msvc" "4.61.1" fsevents "~2.3.2" router@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" + resolved "https://registry.npmjs.org/router/-/router-2.2.0.tgz" integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== dependencies: debug "^4.4.0" @@ -9693,33 +9724,33 @@ router@^2.2.0: rtl-css-js@^1.16.1: version "1.16.1" - resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" + resolved "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz" integrity sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg== dependencies: "@babel/runtime" "^7.1.2" run-applescript@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" + resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz" integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" sade@^1.7.3: version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" safe-array-concat@^1.1.3: version "1.1.4" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.4.tgz#a54cc9b61a57f33b42abad3cbdda3a2b38cc5719" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz" integrity sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg== dependencies: call-bind "^1.0.9" @@ -9728,19 +9759,24 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0, safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-push-apply@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== dependencies: es-errors "^1.3.0" @@ -9748,7 +9784,7 @@ safe-push-apply@^1.0.0: safe-regex-test@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: call-bound "^1.0.2" @@ -9757,41 +9793,46 @@ safe-regex-test@^1.1.0: safe-stable-stringify@^1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz#c8a220ab525cd94e60ebf47ddc404d610dc5d84a" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz" integrity sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw== -safe-stable-stringify@^2.3.1, safe-stable-stringify@^2.5.0: +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + +safe-stable-stringify@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz" integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== saxes@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + resolved "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz" integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== dependencies: xmlchars "^2.2.0" scheduler@^0.23.2: version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" screenfull@^5.1.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" + resolved "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz" integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== selfsigned@^2.0.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz" integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: "@types/node-forge" "^1.3.0" @@ -9799,22 +9840,22 @@ selfsigned@^2.0.0: semver-compare@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.2, semver@^7.5.3, semver@^7.5.4, semver@^7.7.3: version "7.8.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.4.tgz#c73eceebae0616934be8dff28a7fd70757c8e696" + resolved "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz" integrity sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA== send@^1.1.0, send@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/send/-/send-1.2.1.tgz#9eab743b874f3550f40a26867bf286ad60d3f3ed" + resolved "https://registry.npmjs.org/send/-/send-1.2.1.tgz" integrity sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== dependencies: debug "^4.4.3" @@ -9831,7 +9872,7 @@ send@^1.1.0, send@^1.2.0: send@~0.19.0, send@~0.19.1: version "0.19.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" + resolved "https://registry.npmjs.org/send/-/send-0.19.2.tgz" integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== dependencies: debug "2.6.9" @@ -9850,21 +9891,21 @@ send@~0.19.0, send@~0.19.1: serialize-error@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz" integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== dependencies: type-fest "^0.13.1" serialize-error@^8.0.1: version "8.1.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" + resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz" integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ== dependencies: type-fest "^0.20.2" serve-static@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.1.tgz#7f186a4a4e5f5b663ad7a4294ff1bf37cf0e98a9" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz" integrity sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== dependencies: encodeurl "^2.0.0" @@ -9874,7 +9915,7 @@ serve-static@^2.2.0: serve-static@~1.16.2: version "1.16.3" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz" integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== dependencies: encodeurl "~2.0.0" @@ -9884,7 +9925,7 @@ serve-static@~1.16.2: set-function-length@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -9896,7 +9937,7 @@ set-function-length@^1.2.2: set-function-name@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -9906,26 +9947,26 @@ set-function-name@^2.0.2: set-harmonic-interval@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249" + resolved "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz" integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g== set-proto@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== dependencies: dunder-proto "^1.0.1" es-errors "^1.3.0" es-object-atoms "^1.0.0" -setprototypeof@1.2.0, setprototypeof@~1.2.0: +setprototypeof@~1.2.0, setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.12: version "2.4.12" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz" integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== dependencies: inherits "^2.0.4" @@ -9934,19 +9975,19 @@ sha.js@^2.4.12: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel-list@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz" integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== dependencies: es-errors "^1.3.0" @@ -9954,7 +9995,7 @@ side-channel-list@^1.0.1: side-channel-map@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: call-bound "^1.0.2" @@ -9964,7 +10005,7 @@ side-channel-map@^1.0.1: side-channel-weakmap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: call-bound "^1.0.2" @@ -9975,7 +10016,7 @@ side-channel-weakmap@^1.0.2: side-channel@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz" integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== dependencies: es-errors "^1.3.0" @@ -9986,22 +10027,22 @@ side-channel@^1.1.0: siginfo@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== signal-exit@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== simple-concat@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== dependencies: decompress-response "^6.0.0" @@ -10010,72 +10051,72 @@ simple-get@^4.0.1: slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map@0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== - source-map@^0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== + sourcemap-codec@^1.4.8: version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== space-separated-tokens@^1.0.0: version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== split-ca@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" + resolved "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz" integrity sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ== split2@^4.1.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== sprintf-js@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sql-escaper@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/sql-escaper/-/sql-escaper-1.3.3.tgz#65faf89f048d26bb9a75566b82b5990ddf8a5b7f" + resolved "https://registry.npmjs.org/sql-escaper/-/sql-escaper-1.3.3.tgz" integrity sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw== ssh2@^1.15.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.17.0.tgz#dc686e8e3abdbd4ad95d46fa139615903c12258c" + resolved "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz" integrity sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ== dependencies: asn1 "^0.2.6" @@ -10086,7 +10127,7 @@ ssh2@^1.15.0: sshpk@^1.7.0: version "1.18.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz" integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" @@ -10101,29 +10142,29 @@ sshpk@^1.7.0: stack-generator@^2.0.5: version "2.0.10" - resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.10.tgz#8ae171e985ed62287d4f1ed55a1633b3fb53bb4d" + resolved "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz" integrity sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ== dependencies: stackframe "^1.3.4" stack-trace@0.0.x: version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== stackback@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== stackframe@^1.3.4: version "1.3.4" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== stacktrace-gps@^3.0.4: version "3.1.2" - resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz#0c40b24a9b119b20da4525c398795338966a2fb0" + resolved "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz" integrity sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ== dependencies: source-map "0.5.6" @@ -10131,7 +10172,7 @@ stacktrace-gps@^3.0.4: stacktrace-js@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b" + resolved "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz" integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg== dependencies: error-stack-parser "^2.0.6" @@ -10140,22 +10181,22 @@ stacktrace-js@^2.0.2: standard-as-callback@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" + resolved "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz" integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.1, statuses@~2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== std-env@^3.5.0: version "3.10.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz" integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== stop-iteration-iterator@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== dependencies: es-errors "^1.3.0" @@ -10163,38 +10204,52 @@ stop-iteration-iterator@^1.1.0: stoppable@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" + resolved "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz" integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== stream-buffers@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-3.0.3.tgz#9fc6ae267d9c4df1190a781e011634cac58af3cd" + resolved "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz" integrity sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw== stream-events@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" + resolved "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz" integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== dependencies: stubs "^3.0.0" stream-shift@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz" integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== streamx@^2.12.5, streamx@^2.15.0, streamx@^2.25.0: version "2.28.0" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.28.0.tgz#035ab56057b7ed2211b51d532e6973f0f99fbf11" + resolved "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz" integrity sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw== dependencies: events-universal "^1.0.0" fast-fifo "^1.3.2" text-decoder "^1.1.0" +string_decoder@^1.1.1, string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -10203,7 +10258,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string-width@^7.0.0, string-width@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: emoji-regex "^10.3.0" @@ -10212,7 +10267,7 @@ string-width@^7.0.0, string-width@^7.2.0: string.prototype.trim@^1.2.10: version "1.2.11" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz#e6bd19cda3985d05a42dda31f3ddf4d35d3430e3" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz" integrity sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w== dependencies: call-bind "^1.0.9" @@ -10226,7 +10281,7 @@ string.prototype.trim@^1.2.10: string.prototype.trimend@^1.0.9: version "1.0.10" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz#be6bcf4f3fe0460bdeccdb2cf4f971b310f8346e" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz" integrity sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw== dependencies: call-bind "^1.0.9" @@ -10236,102 +10291,88 @@ string.prototype.trimend@^1.0.9: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1, string_decoder@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz" integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== dependencies: ansi-regex "^6.2.2" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== strip-literal@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.1.tgz#26906e65f606d49f748454a08084e94190c2e5ad" + resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz" integrity sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q== dependencies: js-tokens "^9.0.1" -strnum@^2.2.3, strnum@^2.4.0: +strnum@^2.2.3: version "2.4.0" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.4.0.tgz#304881c3299b017855f1934a4ce85bfb60b1ca2a" + resolved "https://registry.npmjs.org/strnum/-/strnum-2.4.0.tgz" integrity sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg== dependencies: anynum "^1.0.0" stubs@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" + resolved "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz" integrity sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw== style-to-object@^0.4.0: version "0.4.4" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz" integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" -stylis@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" - integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== - stylis@^4.3.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.4.0.tgz#c5846c9345f4bfc51bd0cbd7ca35a0744f485a5d" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz" integrity sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA== +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== swr@^2.0.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/swr/-/swr-2.4.1.tgz#c9e48abff6bf4b04846342e2f1f6be108a078cf6" + resolved "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz" integrity sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA== dependencies: dequal "^2.0.3" @@ -10339,12 +10380,12 @@ swr@^2.0.0: symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tar-fs@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.4.tgz#800824dbf4ef06ded9afea4acafe71c67c76b930" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz" integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ== dependencies: chownr "^1.1.1" @@ -10354,7 +10395,7 @@ tar-fs@^2.1.4: tar-stream@^2.1.4: version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -10365,7 +10406,7 @@ tar-stream@^2.1.4: tar-stream@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.2.0.tgz#0d0064d9b67ea3c9f5abde155e35faab0df37591" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz" integrity sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg== dependencies: b4a "^1.6.4" @@ -10375,7 +10416,7 @@ tar-stream@^3.0.0: tar@^6.1.11, tar@^6.1.12: version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" @@ -10387,12 +10428,12 @@ tar@^6.1.11, tar@^6.1.12: tarn@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" + resolved "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz" integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== teeny-request@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-9.0.0.tgz#18140de2eb6595771b1b02203312dfad79a4716d" + resolved "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz" integrity sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g== dependencies: http-proxy-agent "^5.0.0" @@ -10403,14 +10444,14 @@ teeny-request@^9.0.0: teex@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/teex/-/teex-1.0.1.tgz#b8fa7245ef8e8effa8078281946c85ab780a0b12" + resolved "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz" integrity sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg== dependencies: streamx "^2.12.5" test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -10419,44 +10460,44 @@ test-exclude@^6.0.0: text-decoder@^1.1.0: version "1.2.7" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.7.tgz#5d073a9a74b9c0a9d28dfadcab96b604af57d8ba" + resolved "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz" integrity sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ== dependencies: b4a "^1.6.4" text-hex@1.0.x: version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== throttle-debounce@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" + resolved "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz" integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== tildify@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" + resolved "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz" integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== tiny-invariant@^1.0.6: version "1.3.3" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz" integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== tiny-warning@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== tinybench@^2.5.1: version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz" integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== tinyglobby@^0.2.15: version "0.2.17" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz" integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== dependencies: fdir "^6.5.0" @@ -10464,29 +10505,29 @@ tinyglobby@^0.2.15: tinypool@^0.8.3: version "0.8.4" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz" integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== tinyspy@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz" integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== -tldts-core@^7.4.3: - version "7.4.3" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.4.3.tgz#d43401c0499cd884eeaf1ccf073df841a1e4e2dd" - integrity sha512-27ep5H9PzdBrNd5OFM/j3WCU8F3kPwM9D0BOaOf7uYfxMJfyr0K5Tjj69Gri+sZlh2WXd5buIm47NuPF29CDiw== +tldts-core@^7.4.2: + version "7.4.2" + resolved "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.2.tgz" + integrity sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA== tldts@^7.0.5: - version "7.4.3" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.4.3.tgz#536c93aecffc96d41ce5627a4b7e12f9c2cfceb5" - integrity sha512-A3BDQBeeukYPzB4QdQ1DtdlUmp4x2OCH8n5UVhEWbyANxNep8GavottKzd1xYKFJKjUgMyPT7EzOfnBO55s8Sg== + version "7.4.2" + resolved "https://registry.npmjs.org/tldts/-/tldts-7.4.2.tgz" + integrity sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw== dependencies: - tldts-core "^7.4.3" + tldts-core "^7.4.2" to-buffer@^1.2.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.2.tgz#ffe59ef7522ada0a2d1cb5dfe03bb8abc3cdc133" + resolved "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz" integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw== dependencies: isarray "^2.0.5" @@ -10495,31 +10536,31 @@ to-buffer@^1.2.0: to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toggle-selection@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== toidentifier@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-6.0.1.tgz#a495f833836609ed983c19bc65639cfbceb54c76" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz" integrity sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw== dependencies: tldts "^7.0.5" tough-cookie@~2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" @@ -10527,44 +10568,44 @@ tough-cookie@~2.5.0: tr46@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-6.0.0.tgz#f5a1ae546a0adb32a277a2278d0d17fa2f9093e6" + resolved "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz" integrity sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw== dependencies: punycode "^2.3.1" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-lines@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== triple-beam@^1.3.0, triple-beam@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== trough@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + resolved "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== ts-api-utils@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz" integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== ts-easing@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" + resolved "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz" integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ== ts-node@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -10581,53 +10622,53 @@ ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +tslib@*, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.6.0, tslib@^2.6.2, tslib@^2.8.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tslib@^1.14.1: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.6.0, tslib@^2.6.2, tslib@^2.8.0, tslib@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-detect@^4.0.0, type-detect@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz" integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== type-fest@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-is@^2.0.1, type-is@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.1.0.tgz#71d1a7053293582e16ac9f3ebaf1ab9aa49e5570" + resolved "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz" integrity sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA== dependencies: content-type "^2.0.0" @@ -10636,7 +10677,7 @@ type-is@^2.0.1, type-is@^2.1.0: type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -10644,7 +10685,7 @@ type-is@~1.6.18: typed-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: call-bound "^1.0.3" @@ -10653,7 +10694,7 @@ typed-array-buffer@^1.0.3: typed-array-byte-length@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: call-bind "^1.0.8" @@ -10664,7 +10705,7 @@ typed-array-byte-length@^1.0.3: typed-array-byte-offset@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: available-typed-arrays "^1.0.7" @@ -10677,7 +10718,7 @@ typed-array-byte-offset@^1.0.4: typed-array-length@^1.0.7: version "1.0.8" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.8.tgz#0b70e982c9e9dafe2def6d6458ff4b3f2d2b6d70" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz" integrity sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g== dependencies: call-bind "^1.0.9" @@ -10689,12 +10730,12 @@ typed-array-length@^1.0.7: typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript-eslint@^8.61.1: version "8.61.1" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.61.1.tgz#7c224a9a643b7f42d295c67a75c1e30fee8c3eaa" + resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.1.tgz" integrity sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw== dependencies: "@typescript-eslint/eslint-plugin" "8.61.1" @@ -10704,7 +10745,7 @@ typescript-eslint@^8.61.1: typescript-json-schema@^0.67.0: version "0.67.4" - resolved "https://registry.yarnpkg.com/typescript-json-schema/-/typescript-json-schema-0.67.4.tgz#068ee06f3e0f54f486cfabab9da972a900116816" + resolved "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.67.4.tgz" integrity sha512-BhDCVfwGtPKKt9JOBvh6ocmSbEk7ftx7dpqqIpvGNrjzYcUKm8pnYwKSFfNJwqcp/qNTfZr9sKtVyTxx4V9iRA== dependencies: "@types/json-schema" "^7.0.15" @@ -10717,19 +10758,19 @@ typescript-json-schema@^0.67.0: vm2 "^3.11.3" yargs "^18.0.0" -typescript@^5.4.5, typescript@~5.9.3: +typescript@^5.4.5, typescript@>=2.7, typescript@>=4.8.4, "typescript@>=4.8.4 <6.1.0", typescript@~5.9.3: version "5.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== ufo@^1.6.3: version "1.6.4" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.4.tgz#7a8fb875fcc6382d2c7d0b3692738b0500a92467" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz" integrity sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA== unbox-primitive@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: call-bound "^1.0.3" @@ -10737,34 +10778,29 @@ unbox-primitive@^1.1.0: has-symbols "^1.1.0" which-boxed-primitive "^1.1.1" -"undici-types@>=7.24.0 <7.24.7": - version "7.24.6" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91" - integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg== - undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici-types@~6.21.0: version "6.21.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== undici-types@~7.18.0: version "7.18.2" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz" integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== undici@^7.2.3, undici@^7.24.5, undici@^7.25.0: - version "7.28.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-7.28.0.tgz#97d64564198b285bc281f0e8e29597e3d11fe7ec" - integrity sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA== + version "7.27.2" + resolved "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz" + integrity sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA== unified@^10.0.0: version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + resolved "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz" integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== dependencies: "@types/unist" "^2.0.0" @@ -10777,33 +10813,33 @@ unified@^10.0.0: unist-util-generated@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz" integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== unist-util-is@^5.0.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz" integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== dependencies: "@types/unist" "^2.0.0" unist-util-position@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz" integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz" integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== dependencies: "@types/unist" "^2.0.0" unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: version "5.1.3" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== dependencies: "@types/unist" "^2.0.0" @@ -10811,7 +10847,7 @@ unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: unist-util-visit@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz" integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== dependencies: "@types/unist" "^2.0.0" @@ -10820,7 +10856,7 @@ unist-util-visit@^4.0.0: universal-github-app-jwt@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz#1314cf2b2aff69d7ae998e8bff90d55a651d2949" + resolved "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz" integrity sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g== dependencies: "@types/jsonwebtoken" "^9.0.0" @@ -10828,27 +10864,27 @@ universal-github-app-jwt@^1.1.1: universal-user-agent@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz" integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-browserslist-db@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz" integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== dependencies: escalade "^3.2.0" @@ -10856,71 +10892,81 @@ update-browserslist-db@^1.2.3: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" uri-template@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/uri-template/-/uri-template-2.0.0.tgz#0ed7b34f8dd6f48b9774048336d2bcf2b7f55724" + resolved "https://registry.npmjs.org/uri-template/-/uri-template-2.0.0.tgz" integrity sha512-r/i44nPoo0ktEZDjx+hxp9PSjQuBBfsd6RgCRuuMqCP0FZEp+YE0SpihThI4UGc5ePqQEFsdyZc7UVlowp+LLw== dependencies: pct-encode "~1.0.0" urijs@^1.19.11: version "1.19.11" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" + resolved "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz" integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== use-memo-one@^1.1.1: version "1.1.3" - resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" + resolved "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz" integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== use-sync-external-store@^1.4.0, use-sync-external-store@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz" integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== utility-types@^3.10.0: version "3.11.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz" integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== -utils-merge@1.0.1, utils-merge@^1.0.1: +utils-merge@^1.0.1, utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + resolved "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz" integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== uuid@^11.0.0: version "11.1.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.1.tgz#f6d81d2e1c65d00762e5e29b16c5d2d995e208ad" + resolved "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz" integrity sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ== -uuid@^3.3.2, uuid@^3.4.0: +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== uvu@^0.5.0: version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz" integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: dequal "^2.0.0" @@ -10930,29 +10976,29 @@ uvu@^0.5.0: v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== validate-npm-package-name@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz" integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== dependencies: builtins "^1.0.3" validate.io-array@^1.0.3: version "1.0.6" - resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + resolved "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz" integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== validate.io-function@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" + resolved "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz" integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== validate.io-integer-array@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz#2cabde033293a6bcbe063feafe91eaf46b13a089" + resolved "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz" integrity sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA== dependencies: validate.io-array "^1.0.3" @@ -10960,24 +11006,24 @@ validate.io-integer-array@^1.0.0: validate.io-integer@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" + resolved "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz" integrity sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ== dependencies: validate.io-number "^1.0.3" validate.io-number@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" + resolved "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== vary@^1, vary@^1.1.2, vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" @@ -10986,7 +11032,7 @@ verror@1.10.0: vfile-location@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz" integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== dependencies: "@types/unist" "^2.0.0" @@ -10994,7 +11040,7 @@ vfile-location@^4.0.0: vfile-message@^3.0.0: version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz" integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== dependencies: "@types/unist" "^2.0.0" @@ -11002,7 +11048,7 @@ vfile-message@^3.0.0: vfile@^5.0.0: version "5.3.7" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== dependencies: "@types/unist" "^2.0.0" @@ -11012,7 +11058,7 @@ vfile@^5.0.0: vite-node@1.6.1: version "1.6.1" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.1.tgz#fff3ef309296ea03ceaa6ca4bb660922f5416c57" + resolved "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz" integrity sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA== dependencies: cac "^6.7.14" @@ -11021,9 +11067,9 @@ vite-node@1.6.1: picocolors "^1.0.0" vite "^5.0.0" -vite@^5.0.0: +"vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", vite@^5.0.0: version "5.4.21" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027" + resolved "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz" integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw== dependencies: esbuild "^0.21.3" @@ -11032,9 +11078,9 @@ vite@^5.0.0: optionalDependencies: fsevents "~2.3.3" -vitest@^1.6.0: +vitest@^1.6.0, vitest@1.6.1: version "1.6.1" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.1.tgz#b4a3097adf8f79ac18bc2e2e0024c534a7a78d2f" + resolved "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz" integrity sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag== dependencies: "@vitest/expect" "1.6.1" @@ -11060,7 +11106,7 @@ vitest@^1.6.0: vm2@^3.11.3: version "3.11.5" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.11.5.tgz#6dcebf22c7bf77acf80571f26f1040ee626a97d0" + resolved "https://registry.npmjs.org/vm2/-/vm2-3.11.5.tgz" integrity sha512-RSrkBiwrj6FRU+QdqNs6KG0XdlvJCjpQ4GXiqmMbrhmwfu5k/XIMpAer0L8f6iuf0uJ3a4T1xJN126Q8yf0VIA== dependencies: acorn "^8.15.0" @@ -11068,34 +11114,43 @@ vm2@^3.11.3: w3c-xmlserializer@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz" integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== dependencies: xml-name-validator "^5.0.0" web-namespaces@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-8.0.1.tgz#0657e571fe6f06fcb15ca50ed1fdbcb495cd1686" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz" integrity sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ== whatwg-mimetype@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz#d8232895dbd527ceaee74efd4162008fb8a8cf48" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz" integrity sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw== -whatwg-url@^16.0.0, whatwg-url@^16.0.1: +whatwg-url@^16.0.0: + version "16.0.1" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz" + integrity sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw== + dependencies: + "@exodus/bytes" "^1.11.0" + tr46 "^6.0.0" + webidl-conversions "^8.0.1" + +whatwg-url@^16.0.1: version "16.0.1" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-16.0.1.tgz#047f7f4bd36ef76b7198c172d1b1cebc66f764dd" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz" integrity sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw== dependencies: "@exodus/bytes" "^1.11.0" @@ -11104,7 +11159,7 @@ whatwg-url@^16.0.0, whatwg-url@^16.0.1: whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -11112,7 +11167,7 @@ whatwg-url@^5.0.0: which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: is-bigint "^1.1.0" @@ -11123,7 +11178,7 @@ which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: which-builtin-type@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: call-bound "^1.0.2" @@ -11142,7 +11197,7 @@ which-builtin-type@^1.2.1: which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -11152,7 +11207,7 @@ which-collection@^1.0.2: which-typed-array@^1.1.16, which-typed-array@^1.1.19: version "1.1.22" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.22.tgz#8f3cc78aefb40b437346dd40a1dbfa5d1da43fe9" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz" integrity sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw== dependencies: available-typed-arrays "^1.0.7" @@ -11165,14 +11220,14 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.19: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" why-is-node-running@^2.2.2: version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz" integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== dependencies: siginfo "^2.0.0" @@ -11180,7 +11235,7 @@ why-is-node-running@^2.2.2: winston-transport@^4.5.0, winston-transport@^4.9.0: version "4.9.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz" integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== dependencies: logform "^2.7.0" @@ -11189,7 +11244,7 @@ winston-transport@^4.5.0, winston-transport@^4.9.0: winston@^3.2.1: version "3.19.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.19.0.tgz#cc1d1262f5f45946904085cfffe73efb4b7a581d" + resolved "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz" integrity sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA== dependencies: "@colors/colors" "^1.6.0" @@ -11206,12 +11261,12 @@ winston@^3.2.1: word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -11220,7 +11275,7 @@ wrap-ansi@^7.0.0: wrap-ansi@^9.0.0: version "9.0.2" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz" integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== dependencies: ansi-styles "^6.2.1" @@ -11229,79 +11284,79 @@ wrap-ansi@^9.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^8.11.0: +ws@*, ws@^8.11.0: version "8.21.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.0.tgz#012e413fc07429945121b0c153158c4343086951" + resolved "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz" integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== wsl-utils@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" + resolved "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz" integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== dependencies: is-wsl "^3.1.0" xml-name-validator@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz" integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== xml-naming@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/xml-naming/-/xml-naming-0.1.0.tgz#8ab7106c5b8d23caa2fabac1cadf17136379fbd8" + resolved "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz" integrity sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw== xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xtend@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0: version "1.10.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.3.tgz#76e407ed95c42684fb8e14641e5de62fe65bbcb3" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz" integrity sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA== yaml@^2.0.0: version "2.9.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.9.0.tgz#78274afd93598a1dfdd6130df6a566defcbf9aa4" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz" integrity sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs-parser@^22.0.0: version "22.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-22.0.0.tgz#87b82094051b0567717346ecd00fd14804b357c8" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz" integrity sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw== yargs@^17.7.2: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -11314,7 +11369,7 @@ yargs@^17.7.2: yargs@^18.0.0: version "18.0.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-18.0.0.tgz#6c84259806273a746b09f579087b68a3c2d25bd1" + resolved "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz" integrity sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg== dependencies: cliui "^9.0.1" @@ -11326,39 +11381,39 @@ yargs@^18.0.0: yauzl@^3.0.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-3.4.0.tgz#88b2a21455f37ca7dccf2eeb33bacb4392322719" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz" integrity sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw== dependencies: pend "~1.2.0" -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - yn@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-4.0.0.tgz#611480051ea43b510da1dfdbe177ed159f00a979" + resolved "https://registry.npmjs.org/yn/-/yn-4.0.0.tgz" integrity sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg== +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yocto-queue@^1.0.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.2.tgz#3e09c95d3f1aa89a58c114c99223edf639152c00" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz" integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== zen-observable@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.10.0.tgz#ee10eba75272897dbee5f152ab26bb5e0107f0c8" + resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.10.0.tgz" integrity sha512-iI3lT0iojZhKwT5DaFy2Ce42n3yFcLdFyOh01G7H0flMY60P8MJuVFEoJoNwXlmAyQ45GrjL6AcZmmlv8A5rbw== zip-stream@^5.0.1: version "5.0.2" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-5.0.2.tgz#77b1dce7af291482d368a9203c9029f4eb52e12e" + resolved "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.2.tgz" integrity sha512-LfOdrUvPB8ZoXtvOBz6DlNClfvi//b5d56mSWyJi7XbH/HfhOHfUhOqxhT/rUiR7yiktlunqRo+jY6y/cWC/5g== dependencies: archiver-utils "^4.0.1" @@ -11367,25 +11422,25 @@ zip-stream@^5.0.1: zod-to-json-schema@^3.20.4, zod-to-json-schema@^3.21.4, zod-to-json-schema@^3.25.1: version "3.25.2" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz#3fa799a7badd554541472fb65843fdc460b2e5aa" + resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz" integrity sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA== zod-validation-error@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz#bc605eba49ce0fcd598c127fee1c236be3f22918" + resolved "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz" integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== -zod@^3.22.0, zod@^3.22.4, zod@^3.25.76: +zod@^3.22.0, zod@^3.22.4, "zod@^3.25 || ^4.0", "zod@^3.25.0 || ^4.0.0", "zod@^3.25.28 || ^4", zod@^3.25.76, "zod@^3.25.76 || ^4.0.0": version "3.25.76" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" + resolved "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz" integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== -"zod@^3.25 || ^4.0", "zod@^3.25.76 || ^4.0.0", zod@^4.0.0: +zod@^4.0.0: version "4.4.3" - resolved "https://registry.yarnpkg.com/zod/-/zod-4.4.3.tgz#b680f172885d18bbebf21a834ea25e55a1bbf356" + resolved "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz" integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== zwitch@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From 96e81fdbbee7bf126abf24fcc13815ee289bb734 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Fri, 19 Jun 2026 16:54:30 +1000 Subject: [PATCH 10/20] Deferred Copilot Studio support to feature 8 --- .specify/memory/constitution.md | 8 ++++---- GOAL.md | 12 +++++++++--- docs/mcp/README.md | 2 +- docs/mcp/quick-start.md | 14 -------------- specs/007-ai-support/contracts/mcp-tools.md | 2 -- specs/007-ai-support/plan.md | 6 +++--- specs/007-ai-support/quickstart.md | 16 ---------------- specs/007-ai-support/research.md | 2 +- specs/007-ai-support/spec.md | 14 +++++++------- specs/007-ai-support/tasks.md | 4 ++-- 10 files changed, 27 insertions(+), 53 deletions(-) diff --git a/.specify/memory/constitution.md b/.specify/memory/constitution.md index 0656ab4..58b4dcd 100644 --- a/.specify/memory/constitution.md +++ b/.specify/memory/constitution.md @@ -8,8 +8,8 @@ Principles modified: none Sections added: - AI Integration Requirements: new top-level section (parallel to CI/CD Integration Requirements) that requires any AI tooling integration to explicitly verify - compatibility with Claude Code, GitHub Copilot (VS Code Agent mode), and GitHub - Copilot Studio. Single-host implementations do not satisfy this requirement. + compatibility with Claude Code and GitHub Copilot (VS Code Agent mode). + Single-host implementations do not satisfy this requirement. Sections removed: none @@ -117,8 +117,8 @@ help developers improve their practice. The following constraints apply to any feature that delivers AI tooling integration: -- Any AI integration capability MUST be explicitly verified to function with **Claude Code**, **GitHub Copilot (VS Code Agent mode)**, and **GitHub Copilot Studio** as the three primary supported targets. -- An implementation that functions in only a subset of these three environments does not satisfy this requirement. +- Any AI integration capability MUST be explicitly verified to function with **Claude Code** and **GitHub Copilot (VS Code Agent mode)** as the two primary supported targets. +- An implementation that functions in only one of these environments does not satisfy this requirement. - MCP tool definitions MUST be self-describing: any capable MCP host MUST be able to discover and invoke all tools using only the tool definitions, with no additional documentation or configuration required beyond registering the server. - All prerequisites for AI integration MUST have zero monetary cost, consistent with Principle V. diff --git a/GOAL.md b/GOAL.md index b842cd2..3c3b63d 100644 --- a/GOAL.md +++ b/GOAL.md @@ -57,13 +57,19 @@ Feature 6 - npmjs - Make sure the GitHub release description reflects the changes in the release. Gather this information from commit descriptions included in the release, ignoring any commit that only includes a release tag. - Update documentation to cover npmjs. Includes both the user oriented documentation and the contribution guide -Feature 7 - AI support +Feature 7 - Local AI support -- Allow API grading to be performed directly from LLMs and agentic AI tooling +- Allow API grading to be performed directly (locally) from LLMs and agentic AI tooling - Support all of the standard functions of the api-grade CLI, including: grading an API (both overall and detailed levels), and asserting whether an API is at or above a particular grade (e.g. >= C) - Use the api-grade's JSON format output so the AI is able to process and reformat the information in a way that suits its requirements - Leverage the AI support to not just grade the API, but also resolve the "non-breaking change" issues highlighted by the grading that are bringing down the result -- Any AI tooling support must explicitly include Claude Code, GitHub Copilot and Copilot Studio +- Any local AI tooling support must explicitly include Claude Code and GitHub Copilot + +Feature 8 - Remote AI support + +- Allow API grading to be performed directly (remotely) from LLMs and agentic AI tooling +- Update AI support to include remote access via streamable/HTTP transport +- Any remote AI tooling support must explicitly include Claude Code, GitHub Copilot and Copilot Studio ## Constitution diff --git a/docs/mcp/README.md b/docs/mcp/README.md index acb01bd..5c3ed36 100644 --- a/docs/mcp/README.md +++ b/docs/mcp/README.md @@ -45,7 +45,7 @@ AI tool (Claude Code, Copilot, etc.) ## Prerequisites - Node.js ≥ 20 -- An MCP-compatible AI host (Claude Code, Claude Desktop, GitHub Copilot VS Code Agent mode, GitHub Copilot Studio, Cursor, Windsurf, or any MCP host) +- An MCP-compatible AI host (Claude Code, Claude Desktop, GitHub Copilot VS Code Agent mode, Cursor, Windsurf, or any MCP host) No global install is required — the server runs on demand via `npx`: diff --git a/docs/mcp/quick-start.md b/docs/mcp/quick-start.md index 949f21b..3fe7c35 100644 --- a/docs/mcp/quick-start.md +++ b/docs/mcp/quick-start.md @@ -98,20 +98,6 @@ Requires VS Code 1.99 or later with the GitHub Copilot extension. 3. The api-grade tools are now available to Copilot in agent mode. -### GitHub Copilot Studio - -1. In your Copilot Studio agent, add a new **Action** of type **MCP Server**. - -2. Configure the action: - - **Name**: `api-grade` - - **Command**: `npx` - - **Arguments**: `-y @dawmatt/api-grade-mcp` - - **Transport**: stdio - -3. Publish the agent. The six tools will be available as callable actions. - -> For air-gapped environments, install `@dawmatt/api-grade-mcp` locally and reference the binary path directly instead of using `npx`. - ### Cursor Create `.cursor/mcp.json` in your project root (or `~/.cursor/mcp.json` for global): diff --git a/specs/007-ai-support/contracts/mcp-tools.md b/specs/007-ai-support/contracts/mcp-tools.md index 27e007d..9bdd848 100644 --- a/specs/007-ai-support/contracts/mcp-tools.md +++ b/specs/007-ai-support/contracts/mcp-tools.md @@ -538,8 +538,6 @@ Or add to `.claude/settings.json`: Tools are available in Copilot Chat **Agent mode** only (not inline completions). -**GitHub Copilot Studio**: Add as a custom MCP Action with command `npx`, arguments `-y @dawmatt/api-grade-mcp`, and transport `stdio`. See the [quickstart](../quickstart.md) for details. - **Cursor** (`.cursor/mcp.json` in project root, or `~/.cursor/mcp.json` globally): ```json diff --git a/specs/007-ai-support/plan.md b/specs/007-ai-support/plan.md index 87dce32..65887b1 100644 --- a/specs/007-ai-support/plan.md +++ b/specs/007-ai-support/plan.md @@ -6,7 +6,7 @@ ## Summary -Deliver a new npm package (`@dawmatt/api-grade-mcp`) that exposes api-grade capabilities as an MCP (Model Context Protocol) server, allowing LLMs and agentic AI tooling to grade API specifications, retrieve detailed diagnostics, assert grade thresholds, and obtain a classified list of non-breaking violations — all by calling the existing `@dawmatt/api-grade-core` package. The three explicitly required and verified target environments are **Claude Code**, **GitHub Copilot (VS Code Agent mode)**, and **GitHub Copilot Studio**. The MCP server runs locally via stdio transport, satisfies the zero-cost prerequisite constraint, and supports concurrent requests without stateful coupling between them. +Deliver a new npm package (`@dawmatt/api-grade-mcp`) that exposes api-grade capabilities as an MCP (Model Context Protocol) server, allowing LLMs and agentic AI tooling to grade API specifications, retrieve detailed diagnostics, assert grade thresholds, and obtain a classified list of non-breaking violations — all by calling the existing `@dawmatt/api-grade-core` package. The two explicitly required and verified target environments are **Claude Code** and **GitHub Copilot (VS Code Agent mode)**. The MCP server runs locally via stdio transport, satisfies the zero-cost prerequisite constraint, and supports concurrent requests without stateful coupling between them. ## Technical Context @@ -36,7 +36,7 @@ Deliver a new npm package (`@dawmatt/api-grade-mcp`) that exposes api-grade capa **Constraints**: All prerequisites free (constitution V); stateless concurrent requests; no outbound network calls from the MCP protocol layer (local stdio transport) -**Verified AI Targets**: Claude Code, GitHub Copilot (VS Code Agent mode), GitHub Copilot Studio — all three must be explicitly verified (FR-014) +**Verified AI Targets**: Claude Code, GitHub Copilot (VS Code Agent mode) — both must be explicitly verified (FR-014) **Scale/Scope**: Local developer tooling; single developer per session; concurrent requests bounded only by available system resources @@ -54,7 +54,7 @@ Deliver a new npm package (`@dawmatt/api-grade-mcp`) that exposes api-grade capa | VI. Educational Excellence | ✅ Pass | FR-010 requires complete tool descriptions so AI tools understand *why* findings matter; SC-006 requires self-describing tool definitions | | CI/CD Integration | ✅ Pass | New package added to existing CI quality gate; coverage threshold applied consistently | | YAGNI | ✅ Pass | No remote URL spec fetching (stretch goal per spec Assumptions); no SSE transport; no resource/prompt MCP surfaces — six tools total (four grading + two configuration); auth limited to GitHub PAT and Entra ID only (other SSO schemes out of scope per spec Assumptions) | -| AI Integration Requirements | ✅ Pass | FR-014 requires explicit verification in Claude Code, GitHub Copilot (VS Code), and Copilot Studio; all three are in-scope targets | +| AI Integration Requirements | ✅ Pass | FR-014 requires explicit verification in Claude Code and GitHub Copilot (VS Code); both are in-scope targets | | Development Workflow | ✅ Pass | Feature branch + PR; new package integrated into quality gate | **Post-Phase-1 re-check** (completed 2026-06-19): diff --git a/specs/007-ai-support/quickstart.md b/specs/007-ai-support/quickstart.md index fb50d56..bb4fe6e 100644 --- a/specs/007-ai-support/quickstart.md +++ b/specs/007-ai-support/quickstart.md @@ -99,22 +99,6 @@ Requires VS Code 1.99 or later with the GitHub Copilot extension. 3. The api-grade tools are now available to Copilot in agent mode. Ask Copilot to grade an API and it will invoke the tools automatically. -### GitHub Copilot Studio - -Copilot Studio supports MCP servers as custom actions. Use this approach to expose api-grade capabilities in a Copilot Studio agent or declarative agent. - -1. In your Copilot Studio agent, add a new **Action** of type **MCP Server**. - -2. Configure the action with: - - **Name**: `api-grade` - - **Command**: `npx` - - **Arguments**: `-y @dawmatt/api-grade-mcp` - - **Transport**: stdio - -3. Publish the agent. The four api-grade tools will be available as callable actions within the agent's skill set. - -> For Copilot Studio agents deployed to Microsoft 365 Copilot, ensure the environment running the agent has Node.js 20+ available and network access to npmjs if using `npx`. For air-gapped environments, install `@dawmatt/api-grade-mcp` locally and reference the binary path directly. - ### Cursor 1. Open Cursor Settings → MCP, or add a file at: diff --git a/specs/007-ai-support/research.md b/specs/007-ai-support/research.md index de4cb30..0872b3c 100644 --- a/specs/007-ai-support/research.md +++ b/specs/007-ai-support/research.md @@ -315,7 +315,7 @@ The `recoveryOption` parameter on grading tools determines which constant is pas **Rationale**: `.api-grade/` follows the convention of tool-specific config directories (`.github/`, `.vscode/`). Using a dedicated directory rather than a root-level dotfile (e.g. `.apigraderc`) allows future keys without polluting the workspace root. `os.homedir()` is the correct cross-platform equivalent of `~` on macOS, Linux, and Windows. -**Workspace root = CWD** (clarified 2026-06-19): All three MCP hosts (Claude Code, VS Code Copilot, Copilot Studio) start the server process with the workspace root as CWD. `process.cwd()` is therefore the workspace root — no `--workspace-root` flag or per-call parameter is needed. +**Workspace root = CWD** (clarified 2026-06-19): Both required MCP hosts (Claude Code, VS Code Copilot) start the server process with the workspace root as CWD. `process.cwd()` is therefore the workspace root — no `--workspace-root` flag or per-call parameter is needed. **Config file schema** (both workspace and global share the same shape): ```json diff --git a/specs/007-ai-support/spec.md b/specs/007-ai-support/spec.md index b3c698f..c0f5c2e 100644 --- a/specs/007-ai-support/spec.md +++ b/specs/007-ai-support/spec.md @@ -20,7 +20,7 @@ ### Session 2026-06-19 -- Q: How does the MCP server determine the workspace root when loading/saving `.api-grade/config.json`? → A: Use the server process's working directory (CWD) — MCP hosts (Claude Code, VS Code Copilot, Copilot Studio) start servers with the workspace root as CWD; no additional configuration required. +- Q: How does the MCP server determine the workspace root when loading/saving `.api-grade/config.json`? → A: Use the server process's working directory (CWD) — MCP hosts (Claude Code, VS Code Copilot) start servers with the workspace root as CWD; no additional configuration required. - Q: Should Entra ID tokens be persisted across MCP server restarts? → A: Yes — cache to disk at `~/.api-grade/entra-token-cache.json` using MSAL Node's `TokenCacheContext` API. Persisted to the user home directory only (never the workspace), consistent with Azure CLI behaviour. - Q: What does a grading tool return when the user selects the `cancel` recovery option? → A: A structured error response with code `REQUEST_CANCELLED` and a human-readable message — consistent with all other terminal error shapes. - Q: What timeout applies when fetching a remote ruleset? → A: 5 seconds on the initial attempt (ensuring the auth-failure recovery response arrives well within SC-001's 10-second budget); 30 seconds when the user explicitly selects the `retry` recovery option (acknowledging they are willing to wait). @@ -32,7 +32,7 @@ ### User Story 1 - Grade an API from an AI Assistant (Priority: P1) -A developer using Claude Code, GitHub Copilot (VS Code), or GitHub Copilot Studio asks their AI tool to grade an API specification file. The AI tool invokes the api-grade capability, receives structured results, and presents a human-readable summary to the user — all without the user needing to leave their AI environment or run CLI commands manually. +A developer using Claude Code or GitHub Copilot (VS Code) asks their AI tool to grade an API specification file. The AI tool invokes the api-grade capability, receives structured results, and presents a human-readable summary to the user — all without the user needing to leave their AI environment or run CLI commands manually. **Why this priority**: This is the core value proposition of the feature. Without the ability to grade an API from an AI context, no other AI-support scenarios are possible. It unblocks all other stories and makes the tool accessible to a new class of users. @@ -43,7 +43,7 @@ A developer using Claude Code, GitHub Copilot (VS Code), or GitHub Copilot Studi 1. **Given** an AI assistant has access to the api-grade capability, **When** it requests an overall grade for a valid OpenAPI specification, **Then** it receives a structured result containing grade letter, numeric percentage, label, and diagnostic summary. 2. **Given** an AI assistant has access to the api-grade capability, **When** it requests a grade for a valid AsyncAPI specification, **Then** it receives equivalent structured results demonstrating multi-format support. 3. **Given** an AI assistant requests a grade for a file path that does not exist, **When** the capability is invoked, **Then** it returns a clear, structured error message the AI can relay to the user. -4. **Given** the MCP server is configured in Claude Code, GitHub Copilot (VS Code Agent mode), or GitHub Copilot Studio, **When** an API specification grade is requested in each tool, **Then** the grading capability is successfully invoked and returns a structured result in all three environments. +4. **Given** the MCP server is configured in Claude Code or GitHub Copilot (VS Code Agent mode), **When** an API specification grade is requested in each tool, **Then** the grading capability is successfully invoked and returns a structured result in both environments. --- @@ -152,7 +152,7 @@ A developer using an AI assistant not only wants to know which issues are affect - **FR-009**: The AI integration MUST leverage the shared core grading package (api-grade-core) and MUST NOT duplicate core grading logic. - **FR-010**: All MCP tool definitions MUST include complete descriptions, parameter documentation, and example invocations so that AI tools can discover and correctly invoke them without additional configuration. - **FR-011**: The MCP server MUST operate entirely locally (no outbound network calls required for the MCP protocol layer itself) to satisfy the zero-cost prerequisite constraint. -- **FR-014**: The MCP server MUST be explicitly verified to function correctly with Claude Code, GitHub Copilot (VS Code Agent mode), and GitHub Copilot Studio as primary supported AI tool targets. An implementation that functions in only a subset of these three environments does not satisfy this requirement. +- **FR-014**: The MCP server MUST be explicitly verified to function correctly with Claude Code and GitHub Copilot (VS Code Agent mode) as primary supported AI tool targets. An implementation that functions in only one of these environments does not satisfy this requirement. ### Key Entities @@ -172,7 +172,7 @@ A developer using an AI assistant not only wants to know which issues are affect ### Measurable Outcomes - **SC-001**: An AI tool can complete an end-to-end API grading request (from invocation to structured result) in under 10 seconds for a typical API specification. When a remote ruleset fetch fails, the auth-failure recovery response (not a grade result) MUST also arrive within 10 seconds; the 5-second fetch timeout ensures this. Retry attempts (user-initiated, 30-second timeout) are exempt from this bound. -- **SC-002**: All three grading functions (overall grade, detailed diagnostics, grade assertion) are accessible from Claude Code, GitHub Copilot (VS Code), and GitHub Copilot Studio without any additional configuration beyond supplying the API specification path. +- **SC-002**: All three grading functions (overall grade, detailed diagnostics, grade assertion) are accessible from Claude Code and GitHub Copilot (VS Code) without any additional configuration beyond supplying the API specification path. - **SC-003**: 100% of supported API specification formats (OpenAPI and AsyncAPI) can be graded successfully when invoked from an AI context. - **SC-004**: Grade assertion correctly identifies pass/fail for all valid grade levels (A through F) with 100% accuracy. - **SC-005**: An AI tool applying quick fixes produces a corrected specification where all targeted violations are resolved and no breaking changes are introduced, as verified by re-grading. @@ -183,12 +183,12 @@ A developer using an AI assistant not only wants to know which issues are affect ## Assumptions -- The AI integration is delivered as an MCP (Model Context Protocol) server. The three explicitly required and verified target environments are Claude Code, GitHub Copilot (VS Code Agent mode), and GitHub Copilot Studio. The server is expected to work with other MCP-compatible hosts, but only these three are required for acceptance. +- The AI integration is delivered as an MCP (Model Context Protocol) server. The two explicitly required and verified target environments are Claude Code and GitHub Copilot (VS Code Agent mode). The server is expected to work with other MCP-compatible hosts, but only these two are required for acceptance. - Remote URL-based API specification fetching is treated as a stretch goal; the primary supported input is a local file path. - The AI tool is responsible for presenting the structured JSON output to its end user in a human-readable form; api-grade provides the data, not the final presentation. - The quick-fix capability is a two-step workflow: the `grade-api-quick-fixes-only` tool identifies, classifies, and returns quick fixes as a structured list; the calling AI model uses that list to generate the corrected specification content. The MCP server does not generate specification content. - Default ruleset configuration is specific to the MCP server; the CLI continues to accept `--ruleset` on each invocation without persistent configuration. Parity between CLI and MCP ruleset configuration is not a goal of this feature. -- The MCP server's working directory (CWD) is treated as the workspace root for resolving `.api-grade/config.json`. All three required MCP hosts (Claude Code, VS Code Copilot, Copilot Studio) start server processes with the workspace root as CWD; no `--workspace-root` argument or per-call parameter is needed. +- The MCP server's working directory (CWD) is treated as the workspace root for resolving `.api-grade/config.json`. Both required MCP hosts (Claude Code, VS Code Copilot) start server processes with the workspace root as CWD; no `--workspace-root` argument or per-call parameter is needed. - Supported authentication mechanisms for secured rulesets are GitHub Enterprise PAT (token-based) and Microsoft Entra ID (OAuth 2.0 device-code flow). Other SSO or authentication schemes (NTLM, Kerberos, custom OAuth providers) are out of scope. - The device-code flow for Entra ID requires the user to complete authentication in a browser; the MCP server surfaces the device code URL and user code but does not open a browser directly. The AI mediates this interaction. - All prerequisites for AI integration (e.g., tool registration, model access) have zero monetary cost, consistent with the project's cross-platform zero-cost prerequisite principle. diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index ad531f7..511e435 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -161,7 +161,7 @@ **Purpose**: Documentation, monorepo updates, and explicit AI environment verification across all three required targets. -- [X] T035 [P] Create `docs/mcp/quick-start.md` user-facing installation and host configuration guide covering Claude Code (`claude mcp add` command + `.claude/settings.json`), GitHub Copilot in VS Code (`.vscode/mcp.json`, Agent mode requirement), and GitHub Copilot Studio (custom MCP Action setup) per quickstart.md design reference (FR-025) +- [X] T035 [P] Create `docs/mcp/quick-start.md` user-facing installation and host configuration guide covering Claude Code (`claude mcp add` command + `.claude/settings.json`) and GitHub Copilot in VS Code (`.vscode/mcp.json`, Agent mode requirement) per quickstart.md design reference (FR-025) - [X] T036 [P] Create `docs/mcp/configuration.md` reference covering all three default ruleset scopes (session/workspace/global), `.api-grade/config.json` file format, `~/.api-grade/config.json` global path, GitHub Enterprise PAT auth (env var `GITHUB_TOKEN`, config `auth.type: "github-pat"`), Entra ID device-code flow (`tenantId`/`clientId`, `~/.api-grade/entra-token-cache.json` persistence), precedence order diagram (FR-025) - [X] T037 [P] Create `docs/mcp/troubleshooting.md` covering auth failure recovery (the four options: retry/use-builtin-once/use-builtin-session/cancel), token expiry (`GITHUB_TOKEN` rotation, Entra token cache), network failures (VPN disconnect, corporate firewall), tools not appearing in AI tool (Node 20+, valid JSON config, restart), `SPEC_NOT_FOUND` (use absolute paths), large spec warning (FR-025) - [X] T038 [P] Create `docs/package/api-grade-mcp.md` package documentation page listing all six tools with purpose and input/output summary, configuration overview (three scopes), link to `docs/mcp/` for full reference @@ -170,7 +170,7 @@ - [X] T041 [P] Update `docs/index.md` to add MCP Server rows (overview, configuration reference, troubleshooting, quick-start) alongside the existing CLI and Backstage integration rows - [X] T042 [P] Update `docs/getting-started.md` to extend the MCP section to mention default ruleset configuration capability and link to `docs/mcp/configuration.md` - [X] T043 [P] Update `docs/package/README.md` to add `@dawmatt/api-grade-mcp` to the monorepo packages table -- [ ] T044 Verify all six MCP tools function correctly in all three required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `grade-api-quick-fixes-only`, `set-ruleset-config`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work; (3) GitHub Copilot Studio — configure as custom MCP Action and confirm grading succeeds (FR-014, SC-002, SC-006) — **see [`checklists/t044-verification.md`](checklists/t044-verification.md) for step-by-step verification checklist per environment** +- [ ] T044 Verify all six MCP tools function correctly in both required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `grade-api-quick-fixes-only`, `set-ruleset-config`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work (FR-014, SC-002, SC-006) — **see [`checklists/t044-verification.md`](checklists/t044-verification.md) for step-by-step verification checklist per environment** --- From a686af95357ab8c2bd50c73d03a19ac74a53bf27 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Fri, 19 Jun 2026 20:16:46 +1000 Subject: [PATCH 11/20] Resolved issue with MPC install via npx -y --- packages/api-grade-mcp/package.json | 2 +- packages/api-grade-mcp/src/index.ts | 1 + .../tests/unit/index-shebang.test.ts | 13 ++++ specs/007-ai-support/checklists/issues.md | 19 +++++ .../checklists/t044-verification.md | 77 +++++++------------ 5 files changed, 61 insertions(+), 51 deletions(-) create mode 100644 packages/api-grade-mcp/tests/unit/index-shebang.test.ts create mode 100644 specs/007-ai-support/checklists/issues.md diff --git a/packages/api-grade-mcp/package.json b/packages/api-grade-mcp/package.json index 139a783..30b14ac 100644 --- a/packages/api-grade-mcp/package.json +++ b/packages/api-grade-mcp/package.json @@ -1,6 +1,6 @@ { "name": "@dawmatt/api-grade-mcp", - "version": "0.1.0", + "version": "0.1.1", "description": "MCP server exposing api-grade capabilities for LLMs and agentic AI tooling", "keywords": [ "api", diff --git a/packages/api-grade-mcp/src/index.ts b/packages/api-grade-mcp/src/index.ts index 7ab9681..330b582 100644 --- a/packages/api-grade-mcp/src/index.ts +++ b/packages/api-grade-mcp/src/index.ts @@ -1,3 +1,4 @@ +#!/usr/bin/env node import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { createServer } from './server.js'; diff --git a/packages/api-grade-mcp/tests/unit/index-shebang.test.ts b/packages/api-grade-mcp/tests/unit/index-shebang.test.ts new file mode 100644 index 0000000..31a57cf --- /dev/null +++ b/packages/api-grade-mcp/tests/unit/index-shebang.test.ts @@ -0,0 +1,13 @@ +import { describe, it, expect } from 'vitest'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; + +const indexPath = path.join(path.dirname(fileURLToPath(import.meta.url)), '../../src/index.ts'); + +describe('src/index.ts shebang', () => { + it('starts with #!/usr/bin/env node so the npx bin entry runs as Node, not sh', () => { + const firstLine = readFileSync(indexPath, 'utf-8').split('\n')[0]; + expect(firstLine).toBe('#!/usr/bin/env node'); + }); +}); diff --git a/specs/007-ai-support/checklists/issues.md b/specs/007-ai-support/checklists/issues.md new file mode 100644 index 0000000..c6e24cd --- /dev/null +++ b/specs/007-ai-support/checklists/issues.md @@ -0,0 +1,19 @@ +# Issues + +## Run 1 - 2026/06/19 + +- [x] MCP documentation advises to use the command `npx -y @dawmatt/api-grade-mcp` when registering the MCP server with AI tools. This currently isn't working (tested with Claude Code). Running the command at the command line returned the following errors and output: + +``` +% npx -y @dawmatt/api-grade-mcp +npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. +npm warn deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me +npm warn deprecated sourcemap-codec@1.4.8: Please use @jridgewell/sourcemap-codec instead +npm warn deprecated uuid@8.3.2: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). +/Users/matt/.npm/_npx/abd1f839bfc3fabe/node_modules/.bin/api-grade-mcp: line 1: import: command not found +/Users/matt/.npm/_npx/abd1f839bfc3fabe/node_modules/.bin/api-grade-mcp: line 2: import: command not found +/Users/matt/.npm/_npx/abd1f839bfc3fabe/node_modules/.bin/api-grade-mcp: line 3: syntax error near unexpected token `(' +/Users/matt/.npm/_npx/abd1f839bfc3fabe/node_modules/.bin/api-grade-mcp: line 3: `const server = createServer();' +``` + +**Resolved** (`specs/007-ai-support/tasks.md` T045–T047): `src/index.ts` had no `#!/usr/bin/env node` shebang, so the compiled `dist/index.js` bin entry had none either; without a shebang, npx's `bin` symlink falls back to executing the file as a POSIX shell script, and the `import` statements get parsed as shell commands. Fix: added the shebang as the first line of `src/index.ts`, confirmed it survives the `tsc` build, and verified with `npm pack` + `npx ./dawmatt-api-grade-mcp-*.tgz` that the server now starts cleanly. \ No newline at end of file diff --git a/specs/007-ai-support/checklists/t044-verification.md b/specs/007-ai-support/checklists/t044-verification.md index fcdac76..6ed7f33 100644 --- a/specs/007-ai-support/checklists/t044-verification.md +++ b/specs/007-ai-support/checklists/t044-verification.md @@ -1,4 +1,4 @@ -# T044 — Three-Environment Verification Checklist +# T044 — Two-Environment Verification Checklist **Satisfies**: FR-014, SC-002, constitution AI Integration Requirements (MUST) @@ -29,18 +29,18 @@ Or add to `.claude/settings.json`: **Checklist:** -- [ ] All six tools discoverable (`grade-api`, `grade-api-detailed`, `assert-api-grade`, `get-non-breaking-violations`, `configure-ruleset`, `get-ruleset-config`) -- [ ] `grade-api` with a valid OpenAPI spec → response includes `letterGrade`, `numericScore`, `gradeLabel`, `summary` -- [ ] `grade-api` with a valid AsyncAPI spec → equivalent structured result (SC-003) -- [ ] `assert-api-grade` with `minimumGrade: "C"` on a passing spec → `passed: true` with `actual` grade -- [ ] `assert-api-grade` with `minimumGrade: "A"` on a low-quality spec → `passed: false` with `actual` grade -- [ ] `grade-api-detailed` on a low-quality spec → `diagnostics[]` with `ruleId`, `message`, `severity`, `path` on each entry -- [ ] `get-non-breaking-violations` on a spec with known non-breaking issues → `nonBreakingViolations[]` with `ruleId`, `location`, `currentValue`, `expectedImprovement` -- [ ] `configure-ruleset` with `scope: "session"` and a local ruleset path → confirmation returned -- [ ] `get-ruleset-config` after above → session scope shown as effective +- [x] All six tools discoverable (`grade-api`, `grade-api-detailed`, `assert-api-grade`, `grade-api-quick-fixes-only`, `set-ruleset-config`, `get-ruleset-config`) +- [x] `grade-api` with a valid OpenAPI spec → response includes `letterGrade`, `numericScore`, `gradeLabel`, `summary` +- [x] `grade-api` with a valid AsyncAPI spec → equivalent structured result (SC-003) +- [x] `assert-api-grade` with `minimumGrade: "C"` on a passing spec → `passed: true` with `actual` grade +- [x] `assert-api-grade` with `minimumGrade: "A"` on a low-quality spec → `passed: false` with `actual` grade +- [x] `grade-api-detailed` on a low-quality spec → `diagnostics[]` with `ruleId`, `message`, `severity`, `path` on each entry +- [x] `grade-api-quick-fixes-only` on a spec with known quick-fix opportunities → `quickFixes[]` with `ruleId`, `location`, `currentValue`, `expectedImprovement` +- [x] `set-ruleset-config` with `scope: "session"` and a local ruleset path → confirmation returned +- [x] `get-ruleset-config` after above → session scope shown as effective -**Verification date**: ___________ -**Claude Code version**: ___________ +**Verification date**:2026/06/19 +**Claude Code version**: v2.1.178 --- @@ -64,49 +64,26 @@ Or add to `.claude/settings.json`: **Checklist:** -- [ ] Open Copilot Chat → switch to Agent mode -- [ ] All six tools visible to the agent -- [ ] `grade-api` with a valid OpenAPI spec → structured grade result returned -- [ ] `grade-api` with a valid AsyncAPI spec → equivalent structured result (SC-003) -- [ ] `assert-api-grade` → pass/fail result with actual grade -- [ ] `grade-api-detailed` → `diagnostics[]` populated with correct shape -- [ ] `get-non-breaking-violations` → classified violation list returned -- [ ] `get-ruleset-config` → scope information returned +- [x] Open Copilot Chat → switch to Agent mode +- [x] All six tools visible to the agent +- [x] `grade-api` with a valid OpenAPI spec → structured grade result returned +- [x] `grade-api` with a valid AsyncAPI spec → equivalent structured result (SC-003) +- [x] `assert-api-grade` → pass/fail result with actual grade +- [x] `grade-api-detailed` → `diagnostics[]` populated with correct shape +- [x] `grade-api-quick-fixes-only` → `quickFixes[]` list returned +- [x] `get-ruleset-config` → scope information returned -**Verification date**: ___________ -**VS Code version**: ___________ -**GitHub Copilot extension version**: ___________ - ---- - -## Environment 3: GitHub Copilot Studio - -> ⚠️ **Blocked on npm publication.** Copilot Studio is cloud-hosted and cannot reach a local binary. Complete this environment after `@dawmatt/api-grade-mcp` is published to npmjs. - -**After publication — configure as MCP Action:** - -1. In your Copilot Studio agent, add a new **Action** → **MCP Server** -2. Set: **Command** = `npx`, **Arguments** = `-y @dawmatt/api-grade-mcp`, **Transport** = `stdio` -3. Publish the agent - -**Checklist:** - -- [ ] All six tools discoverable in the Copilot Studio action catalogue (SC-006) -- [ ] `grade-api` with a valid OpenAPI spec → structured grade result returned -- [ ] `assert-api-grade` → pass/fail result with actual grade -- [ ] At least one additional tool (`grade-api-detailed` or `get-non-breaking-violations`) invoked successfully - -**Verification date**: ___________ -**Copilot Studio agent version / environment**: ___________ +**Verification date**:2026/06/19 +**VS Code version**: 1.124.2 (Windows) +**GitHub Copilot extension version**: 0.41 (Chat) --- ## Sign-off -All three environments verified: +Both environments verified: -- [ ] Environment 1: Claude Code ✅ -- [ ] Environment 2: GitHub Copilot (VS Code Agent mode) ✅ -- [ ] Environment 3: GitHub Copilot Studio ✅ +- [x] Environment 1: Claude Code ✅ +- [x] Environment 2: GitHub Copilot (VS Code Agent mode) ✅ -Mark T044 `[X]` in `tasks.md` once all three are checked. +Mark T044 `[X]` in `tasks.md` once both are checked. From 734fe49b1ece230327a6fef6b8a90d0d113ac19e Mon Sep 17 00:00:00 2001 From: DawMatt Date: Sat, 20 Jun 2026 06:31:14 +1000 Subject: [PATCH 12/20] Authorisation docs clarified --- docs/index.md | 2 +- docs/mcp/configuration.md | 12 +++++++----- specs/007-ai-support/quickstart.md | 10 ++++++---- specs/007-ai-support/tasks.md | 15 ++++++++++++++- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/docs/index.md b/docs/index.md index 7273109..04ede7d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -43,7 +43,7 @@ The grading algorithm is error-first: a single error outweighs many warnings. It - **I want to grade a spec from the command line** → [CLI Tool](cli/README.md) - **I want to use grading in my own code or tooling** → [Core Package](package/README.md) -- **I want to grade specs from an AI assistant** → [MCP Server Quick Start](mcp/README.md) +- **I want to grade specs from an AI assistant** → [MCP Server](mcp/README.md) - **I want grades to appear in my Backstage developer portal** → [Backstage Plugins](backstage-plugins/README.md) - **I'm not sure where to start** → [Getting Started](getting-started.md) diff --git a/docs/mcp/configuration.md b/docs/mcp/configuration.md index ed82825..7fed861 100644 --- a/docs/mcp/configuration.md +++ b/docs/mcp/configuration.md @@ -79,6 +79,8 @@ Or for a local file: ## Authentication +GitHub PAT and Entra ID use different storage mechanisms because the credentials behave differently, not out of inconsistency: a GitHub PAT is a static secret you provide once, while an Entra ID token is dynamically issued and refreshed by Microsoft and must survive server restarts without you re-entering anything. + ### No Authentication (Public URLs) For publicly accessible ruleset URLs, no auth configuration is needed: @@ -90,7 +92,7 @@ For publicly accessible ruleset URLs, no auth configuration is needed: } ``` -### GitHub Enterprise (Personal Access Token) +### GitHub Enterprise (Personal Access Token) — you supply a token via an environment variable Set the `GITHUB_TOKEN` environment variable before starting your AI tool, or configure the auth type in the ruleset config: @@ -103,7 +105,7 @@ Set the `GITHUB_TOKEN` environment variable before starting your AI tool, or con } ``` -At runtime, the server reads the token from the `GITHUB_TOKEN` environment variable. The token requires read access to the repository containing the ruleset. +At runtime, the server reads the token from the `GITHUB_TOKEN` environment variable — the same convention used by the `gh` CLI and most CI systems. The token requires read access to the repository containing the ruleset, and is never written to a config file (see `auth.githubToken` note above), so workspace config files stay safe to commit. Setting `GITHUB_TOKEN` in the environment: @@ -111,7 +113,7 @@ Setting `GITHUB_TOKEN` in the environment: export GITHUB_TOKEN=ghp_xxxx # then start your AI tool ``` -### Microsoft Entra ID (Device Code Flow) +### Microsoft Entra ID (Device Code Flow) — the server handles tokens for you, no env var needed For rulesets hosted on SharePoint or other Entra ID-protected sites: @@ -132,9 +134,9 @@ On the first grading request after configuration, the server initiates a **devic 2. Visit the URI and enter the code to authenticate (typically 15-minute window). 3. Retry the grading request — the token is now cached. -**Token cache location**: `~/.api-grade/entra-token-cache.json` +**Token cache location**: `~/.api-grade/entra-token-cache.json` — the same pattern Azure CLI uses at `~/.azure`. Written to the user home directory only, never the workspace. -Cached tokens are reused on subsequent requests. If the token expires, the device code flow restarts automatically on the next grading request. +Cached tokens are reused on subsequent requests, including after restarting the MCP server, with no further action from you. If the token expires, the device code flow restarts automatically on the next grading request. --- diff --git a/specs/007-ai-support/quickstart.md b/specs/007-ai-support/quickstart.md index bb4fe6e..9626aa2 100644 --- a/specs/007-ai-support/quickstart.md +++ b/specs/007-ai-support/quickstart.md @@ -219,19 +219,21 @@ Per-request `rulesetPath` → session default → workspace default → global d ## Configuring Authentication for Secured Rulesets -### GitHub Enterprise (PAT) +Auth setup differs by type because the credentials themselves behave differently — a GitHub PAT is a static secret you provide once, while an Entra ID token is dynamically issued and refreshed by Microsoft. There's nothing further to configure in either case beyond the one-time setup below. + +### GitHub Enterprise (PAT) — you supply a token via an environment variable Set the `GITHUB_TOKEN` environment variable before starting the AI tool, or ask the AI to configure it for the session: > Set the workspace default ruleset to `https://github.example.com/org/standards/raw/main/ruleset.yaml` with GitHub PAT authentication -The AI calls `set-ruleset-config` with `auth: { type: "github-pat" }`. At runtime the server reads the token from the `GITHUB_TOKEN` environment variable. +The AI calls `set-ruleset-config` with `auth: { type: "github-pat" }`. At runtime the server reads the token from the `GITHUB_TOKEN` environment variable — the same convention used by the `gh` CLI and most CI systems. The PAT itself is never written to a config file (FR-021), so workspace config files stay safe to commit. -### Microsoft Entra ID (SharePoint / enterprise sites) +### Microsoft Entra ID (SharePoint / enterprise sites) — the server handles tokens for you, no env var needed > Set the workspace default ruleset to `https://mycompany.sharepoint.com/sites/api-standards/ruleset.yaml` with Entra ID authentication, tenant ID `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` and client ID `yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy` -The AI calls `set-ruleset-config` with `auth: { type: "entra-id", tenantId: "...", clientId: "..." }`. On the next grading request the server will initiate the device-code flow and return a code for you to enter at `https://microsoft.com/devicelogin`. Once authenticated, the token is cached to `~/.api-grade/entra-token-cache.json` and reused on subsequent requests. +The AI calls `set-ruleset-config` with `auth: { type: "entra-id", tenantId: "...", clientId: "..." }`. On the next grading request the server will initiate the device-code flow and return a code for you to enter at `https://microsoft.com/devicelogin`. Once authenticated, the access and refresh tokens are cached automatically to `~/.api-grade/entra-token-cache.json` (the same pattern Azure CLI uses at `~/.azure`) and reused on subsequent requests — including after restarting the MCP server — with no further action from you. ### When authentication fails diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index 511e435..aff0cc0 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -170,7 +170,19 @@ - [X] T041 [P] Update `docs/index.md` to add MCP Server rows (overview, configuration reference, troubleshooting, quick-start) alongside the existing CLI and Backstage integration rows - [X] T042 [P] Update `docs/getting-started.md` to extend the MCP section to mention default ruleset configuration capability and link to `docs/mcp/configuration.md` - [X] T043 [P] Update `docs/package/README.md` to add `@dawmatt/api-grade-mcp` to the monorepo packages table -- [ ] T044 Verify all six MCP tools function correctly in both required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `grade-api-quick-fixes-only`, `set-ruleset-config`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work (FR-014, SC-002, SC-006) — **see [`checklists/t044-verification.md`](checklists/t044-verification.md) for step-by-step verification checklist per environment** +- [X] T044 Verify all six MCP tools function correctly in both required AI environments: (1) Claude Code — use `claude mcp add` and confirm `grade-api`, `assert-api-grade`, `grade-api-detailed`, `grade-api-quick-fixes-only`, `set-ruleset-config`, `get-ruleset-config` are discoverable and return correct results for an OpenAPI and AsyncAPI spec; (2) GitHub Copilot in VS Code Agent mode — configure `.vscode/mcp.json` and confirm all six tools work (FR-014, SC-002, SC-006) — **see [`checklists/t044-verification.md`](checklists/t044-verification.md) for step-by-step verification checklist per environment** + +--- + +## Phase 9: Bug Fix — `npx @dawmatt/api-grade-mcp` Invocation Failure + +**Purpose**: Fix the issue logged in [`checklists/issues.md`](checklists/issues.md) (Run 1, 2026/06/19): running `npx -y @dawmatt/api-grade-mcp` fails with `import: command not found` / `syntax error near unexpected token '('`. Root cause: `packages/api-grade-mcp/src/index.ts` has no `#!/usr/bin/env node` shebang, so the compiled `dist/index.js` lacks one too; when npx invokes the `bin` entry without a shebang, the OS falls back to executing it as a POSIX shell script instead of as a Node/ESM module, and the `import` statements are interpreted as shell commands. + +- [X] T045 [P] Create `packages/api-grade-mcp/tests/unit/index-shebang.test.ts` asserting the first line of `packages/api-grade-mcp/src/index.ts` is exactly `#!/usr/bin/env node` (regression test for the npx invocation failure in `checklists/issues.md`); confirm this test fails before T046 +- [X] T046 Add `#!/usr/bin/env node` as the first line of `packages/api-grade-mcp/src/index.ts` (above the existing `import` statements); rebuild with `yarn workspace api-grade-mcp run build` and confirm `dist/index.js` retains the shebang as its first emitted line; confirm T045 now passes +- [X] T047 Verify the fix end-to-end: from `packages/api-grade-mcp`, run `npm pack` to produce a local tarball, then run `npx ./dawmatt-api-grade-mcp-*.tgz` and confirm the server starts cleanly (no shell syntax errors, process waits on stdio) instead of reproducing the original error; update `checklists/issues.md` to check off the Run 1 item and append a one-line resolution note (root cause + fix) + +**Checkpoint**: `npx -y @dawmatt/api-grade-mcp` works as documented in `docs/mcp/quick-start.md`; close out the open item in `checklists/issues.md`. --- @@ -186,6 +198,7 @@ - **US5 (Phase 6)**: Depends on Phase 2; T030 depends on T011/T015/T018 (updates those tool files) - **US4 (Phase 7)**: Depends on Phase 2; T033 depends on T006 (classifier) - **Polish (Phase 8)**: Depends on all story phases completing; T044 depends on all six tools being registered +- **Bug Fix (Phase 9)**: Independent of all story phases (touches only `src/index.ts`); discovered during T044 verification — T045 (test) before T046 (fix) before T047 (end-to-end verification + issue close-out) ### User Story Dependencies From dcc5ddc20cddbc61f8f91cb9d9b820e19268f486 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Sat, 20 Jun 2026 06:46:36 +1000 Subject: [PATCH 13/20] Rulesets for authorisation checks --- tests/fixtures/rulesets/security/remoteEntra.yaml | 8 ++++++++ tests/fixtures/rulesets/security/remotePAT.yaml | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 tests/fixtures/rulesets/security/remoteEntra.yaml create mode 100644 tests/fixtures/rulesets/security/remotePAT.yaml diff --git a/tests/fixtures/rulesets/security/remoteEntra.yaml b/tests/fixtures/rulesets/security/remoteEntra.yaml new file mode 100644 index 0000000..a3ebdad --- /dev/null +++ b/tests/fixtures/rulesets/security/remoteEntra.yaml @@ -0,0 +1,8 @@ +# Minimal local ruleset fixture for loader unit tests — no external URLs +rules: + test-rule-entra: + message: "Test rule for remote Entra ruleset unit tests" + given: "$.info" + severity: warn + then: + function: falsy diff --git a/tests/fixtures/rulesets/security/remotePAT.yaml b/tests/fixtures/rulesets/security/remotePAT.yaml new file mode 100644 index 0000000..48b69b6 --- /dev/null +++ b/tests/fixtures/rulesets/security/remotePAT.yaml @@ -0,0 +1,8 @@ +# Minimal local ruleset fixture for loader unit tests — no external URLs +rules: + test-rule-pat: + message: "Test rule for remote PAT ruleset unit tests" + given: "$.info" + severity: warn + then: + function: falsy From 9830e4d0efc1d46f9360228f912234df134ac1a5 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Sat, 20 Jun 2026 08:03:02 +1000 Subject: [PATCH 14/20] Entra ID setup documented --- docs/index.md | 1 + docs/mcp/README.md | 2 + docs/mcp/configuration.md | 3 +- docs/mcp/entra-id-setup.md | 111 +++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 docs/mcp/entra-id-setup.md diff --git a/docs/index.md b/docs/index.md index 04ede7d..72bf302 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,6 +18,7 @@ | [MCP Server Overview](package/api-grade-mcp.md) | All six MCP tools and their inputs/outputs | | [MCP Quick Start](mcp/quick-start.md) | Install and configure the MCP server in minutes | | [MCP Configuration Reference](mcp/configuration.md) | Default rulesets, auth, and scope precedence | +| [MCP Entra ID Setup](mcp/entra-id-setup.md) | One-time Azure-side app registration for Entra ID auth | | [MCP Troubleshooting](mcp/troubleshooting.md) | Auth failures, missing tools, and common errors | | [Backstage Plugins](backstage-plugins/README.md) | Display grades on Backstage API entity pages | | [Backstage Quick Start](backstage-plugins/quick-start.md) | Get both plugins running in under 30 minutes | diff --git a/docs/mcp/README.md b/docs/mcp/README.md index 5c3ed36..077d704 100644 --- a/docs/mcp/README.md +++ b/docs/mcp/README.md @@ -61,6 +61,7 @@ npx -y @dawmatt/api-grade-mcp |-------|---------| | [Quick Start](./quick-start.md) | Install and configure in minutes — covers Claude Code, Copilot, Claude Desktop | | [Configuration Reference](./configuration.md) | Default rulesets, auth, scope precedence, and config file format | +| [Entra ID Setup](./entra-id-setup.md) | One-time Azure-side app registration required for Entra ID auth | | [Troubleshooting](./troubleshooting.md) | Auth failures, missing tools, and common errors | --- @@ -69,6 +70,7 @@ npx -y @dawmatt/api-grade-mcp - [→ Quick Start](./quick-start.md) — get the MCP server running in your AI tool - [→ Configuration Reference](./configuration.md) — configure a default ruleset and auth +- [→ Entra ID Setup](./entra-id-setup.md) — Azure-side app registration for Entra ID auth - [→ Troubleshooting](./troubleshooting.md) — fix common issues - [→ Package Documentation](../package/api-grade-mcp.md) — full tool reference with all inputs and outputs - [→ Documentation Index](../index.md) — full navigation across all project docs diff --git a/docs/mcp/configuration.md b/docs/mcp/configuration.md index 7fed861..0c60fb6 100644 --- a/docs/mcp/configuration.md +++ b/docs/mcp/configuration.md @@ -115,7 +115,7 @@ export GITHUB_TOKEN=ghp_xxxx # then start your AI tool ### Microsoft Entra ID (Device Code Flow) — the server handles tokens for you, no env var needed -For rulesets hosted on SharePoint or other Entra ID-protected sites: +For rulesets hosted on SharePoint or other Entra ID-protected sites. This requires an Entra ID app registration to already exist in your tenant — see [Entra ID Setup](entra-id-setup.md) for the one-time administrator steps to create it before continuing here. ```json { @@ -190,6 +190,7 @@ Passing `rulesetPath: null` clears the configuration at that scope without affec ## Further Reading - [Quick Start](quick-start.md) — install and configure in minutes +- [Entra ID Setup](entra-id-setup.md) — one-time Azure-side app registration required for Entra ID auth - [Troubleshooting](troubleshooting.md) — auth failures, missing tools, and common errors - [Package Documentation](../package/api-grade-mcp.md) — full tool reference with all parameters - [Documentation Index](../index.md) diff --git a/docs/mcp/entra-id-setup.md b/docs/mcp/entra-id-setup.md new file mode 100644 index 0000000..1760e37 --- /dev/null +++ b/docs/mcp/entra-id-setup.md @@ -0,0 +1,111 @@ +[← Back to Documentation Index](../index.md) + +# Microsoft Entra ID Setup for Secured Rulesets + +> One-time Azure-side setup an Entra ID (Azure AD) administrator must complete before `@dawmatt/api-grade-mcp` can authenticate to an Entra ID-protected ruleset using the device-code flow. + +--- + +## Who Needs This + +[Configuration Reference](configuration.md) and [Quick Start](quick-start.md) describe how to point `api-grade-mcp` at an Entra ID-secured ruleset using `tenantId` and `clientId`. Those values come from an **app registration** that does not exist until someone creates it. + +This page is for the person setting up that app registration — typically an Entra ID administrator, or any user with permission to register applications in the tenant. It only needs to be done **once per tenant** (or once per environment, if you maintain separate dev/prod tenants). End users consuming the ruleset do not need to do any of this — they only complete the device-code sign-in described in [Configuration Reference](configuration.md#microsoft-entra-id-device-code-flow--the-server-handles-tokens-for-you-no-env-var-needed). + +--- + +## What `api-grade-mcp` Expects + +`api-grade-mcp` authenticates using the OAuth 2.0 **device-code flow**, requesting the scope `api:///.default`. This means the app registration must: + +1. Be a **public client** (no client secret — device-code flow does not use one). +2. Have device-code flow explicitly allowed. +3. **Expose an API** under its own Application ID URI (`api://`) with at least one scope, since `api:///.default` is what the server requests. +4. Be granted permission (with admin consent, if your tenant requires it) to call that scope. + +The resource being protected (a SharePoint site, or a custom internal web app/API) must independently be configured to accept tokens issued for this app's audience — that part is outside Entra ID's app registration blade and depends on the resource itself (see [Protecting a Custom Resource](#protecting-a-custom-resource-vs-sharepoint) below). + +--- + +## Step-by-Step: Create the App Registration + +These steps use the [Azure Portal](https://portal.azure.com). You need permission to register applications in the target tenant (the default "App registration" tenant setting allows any member to do this, but your organization may have restricted it). + +### 1. Register the application + +1. In the Azure Portal, go to **Microsoft Entra ID** → **App registrations** → **New registration**. +2. **Name**: something identifiable, e.g. `api-grade-mcp`. +3. **Supported account types**: *Accounts in this organizational directory only (Single tenant)* — unless you specifically need multi-tenant access. +4. **Redirect URI**: leave blank. Device-code flow does not use a redirect URI. +5. Click **Register**. + +### 2. Record the tenant ID and client ID + +On the app's **Overview** page, copy: + +- **Application (client) ID** → this is the `clientId` value for `api-grade-mcp` config. +- **Directory (tenant) ID** → this is the `tenantId` value. + +You'll supply both when running `set-ruleset-config` with `auth.type: "entra-id"`. + +### 3. Allow public client flows (required for device code) + +1. Go to **Authentication** in the left nav. +2. Under **Advanced settings**, set **Allow public client flows** to **Yes**. +3. **Save**. + +Without this, token acquisition via `acquireTokenByDeviceCode` will be rejected by Entra ID. + +### 4. Expose an API + +1. Go to **Expose an API** in the left nav. +2. Next to **Application ID URI**, click **Add** and accept the default (`api://`), then **Save**. +3. Click **Add a scope**. + - **Scope name**: `access_as_user` (or any name — `api-grade-mcp` always requests `.default`, which bundles all consented scopes for this API, so the exact name doesn't matter). + - **Who can consent**: *Admins and users* (or *Admins only*, if your tenant policy requires admin consent for everything). + - **Admin consent display name / description**: e.g. "Access api-grade ruleset resource". + - Click **Add scope**. + +### 5. Grant the app permission to call its own API + +Device-code flow acquires a token *for* this app's own exposed API, so the app needs to be authorized to call itself: + +1. Go to **API permissions** in the left nav. +2. Click **Add a permission** → **My APIs** → select the app you just registered (e.g. `api-grade-mcp`). +3. Choose **Delegated permissions**, select the scope you created (e.g. `access_as_user`), and click **Add permissions**. +4. If your tenant requires admin consent, click **Grant admin consent for ``** and confirm. + +Without admin consent, the first user to authenticate will be prompted to consent themselves (if user consent is permitted by tenant policy) or will be blocked (if it isn't). + +--- + +## Protecting a Custom Resource vs. SharePoint + +The app registration above issues `api-grade-mcp` a token with audience `api://`. Whether that token is actually *accepted* by the place hosting your ruleset depends on what that resource is: + +- **A custom internal web app or API you control**: the resource must be configured to validate bearer tokens issued by your tenant for this specific audience (`api://`). This typically means registering the web app as an Entra ID app itself and configuring its middleware (e.g. `Microsoft.Identity.Web` for .NET, `passport-azure-ad` for Node) to accept that audience. Consult your resource's own Entra ID integration setup — this is independent of the `api-grade-mcp` app registration. +- **SharePoint Online**: SharePoint already trusts your tenant's Entra ID and does not require per-app resource configuration in the same way, but `api-grade-mcp` requests `api:///.default` rather than a SharePoint-specific scope. If your ruleset is hosted on SharePoint and the request is rejected, confirm with your tenant administrator whether a SharePoint-scoped app registration (with `Sites.Read.All` or similar delegated Microsoft Graph/SharePoint permissions, consented) is needed instead, and treat the `api://` scope above as the fallback for custom-hosted rulesets. + +If you're unsure which applies, start with a custom resource you control (an internal site or API gateway serving the ruleset YAML) — it gives you the most direct control over what audience is accepted. + +--- + +## Verifying the Setup + +Once the app registration is complete: + +1. Configure `api-grade-mcp` per [Configuration Reference](configuration.md#microsoft-entra-id-device-code-flow--the-server-handles-tokens-for-you-no-env-var-needed), supplying the `tenantId` and `clientId` recorded above. +2. Trigger a grading request. The server should return `ENTRA_AUTH_REQUIRED` with a device code and verification URL. +3. Visit the URL, sign in, and enter the code. +4. Retry the grading request — it should now succeed and fetch the secured ruleset. + +If you instead get an error referencing `AADSTS` consent or invalid-audience codes, recheck steps 3–5 above (public client flow enabled, API exposed, permission granted and consented). + +--- + +## Further Reading + +- [Configuration Reference](configuration.md) — how `api-grade-mcp` is configured to use this app registration +- [Troubleshooting](troubleshooting.md) — auth failure recovery options and common errors +- [Quick Start](quick-start.md) — install and configure the MCP server +- [Documentation Index](../index.md) From cc8ed19a172d1c35a36f93442bbb4d6cd5b5847a Mon Sep 17 00:00:00 2001 From: DawMatt Date: Sat, 20 Jun 2026 08:15:26 +1000 Subject: [PATCH 15/20] Ruleset now actually included in JSON response --- packages/api-grade-mcp/src/tools/grade-detailed.ts | 1 + packages/api-grade-mcp/src/tools/grade.ts | 1 + .../tests/integration/grade-detailed.test.ts | 13 +++++++++++++ .../api-grade-mcp/tests/integration/grade.test.ts | 13 +++++++++++++ specs/007-ai-support/checklists/issues.md | 12 +++++++++++- specs/007-ai-support/tasks.md | 14 ++++++++++++++ 6 files changed, 53 insertions(+), 1 deletion(-) diff --git a/packages/api-grade-mcp/src/tools/grade-detailed.ts b/packages/api-grade-mcp/src/tools/grade-detailed.ts index 1b658a9..1bbb0d9 100644 --- a/packages/api-grade-mcp/src/tools/grade-detailed.ts +++ b/packages/api-grade-mcp/src/tools/grade-detailed.ts @@ -143,6 +143,7 @@ export function registerGradeDetailedTool(server: McpServer, sessionState: Sessi summary: result.summary, diagnostics, rulesetSource: result.rulesetSource, + ...(result.rulesetPath ? { rulesetPath: result.rulesetPath } : {}), truncated, }; diff --git a/packages/api-grade-mcp/src/tools/grade.ts b/packages/api-grade-mcp/src/tools/grade.ts index e54c4e9..9e53f66 100644 --- a/packages/api-grade-mcp/src/tools/grade.ts +++ b/packages/api-grade-mcp/src/tools/grade.ts @@ -136,6 +136,7 @@ export function registerGradeTool(server: McpServer, sessionState: SessionState) numericScore: result.numericScore, summary: result.summary, rulesetSource: result.rulesetSource, + ...(result.rulesetPath ? { rulesetPath: result.rulesetPath } : {}), }; if (largeSpecWarning) { diff --git a/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts b/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts index aa86835..9e8fb06 100644 --- a/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts +++ b/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts @@ -7,6 +7,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); const FIXTURES = resolve(__dirname, '../../../../tests/fixtures'); const OPENAPI_POOR = resolve(FIXTURES, 'openapi/poor-quality.yaml'); const ASYNCAPI_FIXTURE = resolve(FIXTURES, 'asyncapi/poor-quality.yaml'); +const CUSTOM_RULESET = resolve(FIXTURES, 'rulesets/security/remotePAT.yaml'); type ToolRegistry = Record, extra: unknown) => Promise }>; @@ -59,6 +60,18 @@ describe('grade-api-detailed tool', () => { expect(body.error).toBe('SPEC_NOT_FOUND'); }); + it('returns rulesetSource "custom" with rulesetPath when a custom ruleset is used', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api-detailed', { + specPath: OPENAPI_POOR, + rulesetPath: CUSTOM_RULESET, + }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body.rulesetSource).toBe('custom'); + expect(body.rulesetPath).toBe(CUSTOM_RULESET); + }); + it('grades AsyncAPI spec successfully', async () => { const server = createServer(); const result = await callTool(server, 'grade-api-detailed', { specPath: ASYNCAPI_FIXTURE }); diff --git a/packages/api-grade-mcp/tests/integration/grade.test.ts b/packages/api-grade-mcp/tests/integration/grade.test.ts index 9851011..14a1653 100644 --- a/packages/api-grade-mcp/tests/integration/grade.test.ts +++ b/packages/api-grade-mcp/tests/integration/grade.test.ts @@ -9,6 +9,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); const FIXTURES = resolve(__dirname, '../../../../tests/fixtures'); const OPENAPI_FIXTURE = resolve(FIXTURES, 'openapi/poor-quality.yaml'); const ASYNCAPI_FIXTURE = resolve(FIXTURES, 'asyncapi/poor-quality.yaml'); +const CUSTOM_RULESET = resolve(FIXTURES, 'rulesets/security/remotePAT.yaml'); type ToolRegistry = Record, extra: unknown) => Promise }>; @@ -62,6 +63,18 @@ describe('grade-api tool', () => { expect(body.error).toBe('RULESET_NOT_FOUND'); }); + it('returns rulesetSource "custom" with rulesetPath when a custom ruleset is used', async () => { + const server = createServer(); + const result = await callTool(server, 'grade-api', { + specPath: OPENAPI_FIXTURE, + rulesetPath: CUSTOM_RULESET, + }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body.rulesetSource).toBe('custom'); + expect(body.rulesetPath).toBe(CUSTOM_RULESET); + }); + it('returns largeSpecWarning for spec over 500KB', async () => { const tmp = resolve(tmpdir(), `large-spec-${Date.now()}.yaml`); const bigContent = 'openapi: "3.0.0"\ninfo:\n title: Big\n version: "1.0"\npaths: {}\n' + ' '.repeat(500_001); diff --git a/specs/007-ai-support/checklists/issues.md b/specs/007-ai-support/checklists/issues.md index c6e24cd..5e50314 100644 --- a/specs/007-ai-support/checklists/issues.md +++ b/specs/007-ai-support/checklists/issues.md @@ -16,4 +16,14 @@ npm warn deprecated uuid@8.3.2: uuid@10 and below is no longer supported. For E /Users/matt/.npm/_npx/abd1f839bfc3fabe/node_modules/.bin/api-grade-mcp: line 3: `const server = createServer();' ``` -**Resolved** (`specs/007-ai-support/tasks.md` T045–T047): `src/index.ts` had no `#!/usr/bin/env node` shebang, so the compiled `dist/index.js` bin entry had none either; without a shebang, npx's `bin` symlink falls back to executing the file as a POSIX shell script, and the `import` statements get parsed as shell commands. Fix: added the shebang as the first line of `src/index.ts`, confirmed it survives the `tsc` build, and verified with `npm pack` + `npx ./dawmatt-api-grade-mcp-*.tgz` that the server now starts cleanly. \ No newline at end of file +**Resolved** (`specs/007-ai-support/tasks.md` T045–T047): `src/index.ts` had no `#!/usr/bin/env node` shebang, so the compiled `dist/index.js` bin entry had none either; without a shebang, npx's `bin` symlink falls back to executing the file as a POSIX shell script, and the `import` statements get parsed as shell commands. Fix: added the shebang as the first line of `src/index.ts`, confirmed it survives the `tsc` build, and verified with `npm pack` + `npx ./dawmatt-api-grade-mcp-*.tgz` that the server now starts cleanly. + +## Run 2 - 2026/06/19 + +- [x] Ruleset details returned in grade-api-detail JSON are not as expected. `rulesetSource` value of `custom` gives no detail and relies upon `rulesetPath?`, which was supposed to be set but wasn't. + +``` +{"specPath":"tests/fixtures/openapi/poor-quality.yaml","format":"openapi-3","letterGrade":"A","gradeLabel":"Excellent","numericScore":99,"summary":{"tone":"Excellent","severityLevel":"INFO","errorCount":0,"warnCount":1,"infoCount":0,"hintCount":0,"commentary":"Excellent. 1 warning are affecting the quality. The test category has the most issues.","text":"Excellent. 1 warning are affecting the quality. The test category has the most issues.","focusRules":[{"id":"test-rule-pat","title":"Test Rule Pat","category":"test","count":1,"impact":"LOW","url":null}],"recommendations":["Focus on this rule (highest impact first): test-rule-pat — 1 violations (LOW)","Start with this category test — it has the most impactful issues"]},"diagnostics":[{"ruleId":"test-rule-pat","message":"Test rule for remote PAT ruleset unit tests","severity":"warn","path":["info"],"range":{"start":{"line":1,"character":5},"end":{"line":3,"character":12}},"source":"/Users/matt/Code/DawMatt/api-grade/tests/fixtures/openapi/poor-quality.yaml"}],"rulesetSource":"custom","truncated":false} +``` + +**Resolved** (`specs/007-ai-support/tasks.md` T048–T051): `src/tools/grade.ts` and `src/tools/grade-detailed.ts` copied `result.rulesetSource` into the response but never copied `result.rulesetPath`, even though `GradeEngine.grade()` (via `api-grade-core`'s ruleset loader) populates it correctly whenever a custom ruleset is used. Fix: added `...(result.rulesetPath ? { rulesetPath: result.rulesetPath } : {})` to both response projections, mirroring the existing pattern in `api-grade-core/src/formatter.ts`, and added regression assertions to `tests/integration/grade.test.ts` and `tests/integration/grade-detailed.test.ts`. diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index aff0cc0..a1cd1f4 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -186,6 +186,19 @@ --- +## Phase 10: Bug Fix — `rulesetSource: "custom"` Missing `rulesetPath` in Responses + +**Purpose**: Fix the issue logged in [`checklists/issues.md`](checklists/issues.md) (Run 2, 2026/06/19): `grade-api` and `grade-api-detailed` return `rulesetSource: "custom"` but omit `rulesetPath`, even though `@dawmatt/api-grade-core`'s `GradeResult.rulesetPath` (`packages/api-grade-core/src/grader.ts`) is populated correctly. Root cause: the response-projection object literals in `packages/api-grade-mcp/src/tools/grade.ts` (~line 131) and `packages/api-grade-mcp/src/tools/grade-detailed.ts` (~line 137) copy `result.rulesetSource` but never copy `result.rulesetPath`, so the field is silently dropped before serialisation — contradicting `data-model.md` (`GradeResult.rulesetPath?`) and the example outputs in `contracts/mcp-tools.md`. + +- [X] T048 [P] Extend `packages/api-grade-mcp/tests/integration/grade.test.ts` with a case: call `grade-api` with `rulesetPath` set to a real custom ruleset fixture (e.g. `tests/fixtures/rulesets/security/remotePAT.yaml`) and assert the response has `rulesetSource: "custom"` AND `rulesetPath` equal to the resolved absolute path; confirm this assertion fails before T050 +- [X] T049 [P] Extend `packages/api-grade-mcp/tests/integration/grade-detailed.test.ts` with the same case: custom ruleset → `rulesetSource: "custom"` AND `rulesetPath` present and correct; confirm this assertion fails before T050 +- [X] T050 Fix `packages/api-grade-mcp/src/tools/grade.ts` and `packages/api-grade-mcp/src/tools/grade-detailed.ts`: in each response object literal, add `...(result.rulesetPath ? { rulesetPath: result.rulesetPath } : {})` (matching the existing pattern in `packages/api-grade-core/src/formatter.ts` line 88) immediately after the `rulesetSource` field; confirm T048 and T049 now pass +- [X] T051 Run the full `packages/api-grade-mcp` test suite (`yarn workspace api-grade-mcp run test:coverage`) and confirm no regressions; update `checklists/issues.md` to check off the Run 2 item and append a one-line resolution note (root cause + fix), matching the style of the Run 1 resolution note + +**Checkpoint**: `grade-api` and `grade-api-detailed` correctly echo `rulesetPath` whenever `rulesetSource: "custom"`; close out the open item in `checklists/issues.md`. + +--- + ## Dependencies & Execution Order ### Phase Dependencies @@ -199,6 +212,7 @@ - **US4 (Phase 7)**: Depends on Phase 2; T033 depends on T006 (classifier) - **Polish (Phase 8)**: Depends on all story phases completing; T044 depends on all six tools being registered - **Bug Fix (Phase 9)**: Independent of all story phases (touches only `src/index.ts`); discovered during T044 verification — T045 (test) before T046 (fix) before T047 (end-to-end verification + issue close-out) +- **Bug Fix (Phase 10)**: Independent of all other phases (touches only `src/tools/grade.ts` and `src/tools/grade-detailed.ts`); reported in `checklists/issues.md` Run 2 — T048/T049 (tests, parallel) before T050 (fix) before T051 (full suite + issue close-out) ### User Story Dependencies From 22feeb586ec1760d3ef4b862514d38d6b9d6a41b Mon Sep 17 00:00:00 2001 From: DawMatt Date: Sat, 20 Jun 2026 08:30:06 +1000 Subject: [PATCH 16/20] GitHub PAT setup documented --- docs/index.md | 1 + docs/mcp/README.md | 2 + docs/mcp/configuration.md | 3 + docs/mcp/github-pat-setup.md | 105 +++++++++++++++++++++++++++++++++++ docs/mcp/troubleshooting.md | 3 +- 5 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 docs/mcp/github-pat-setup.md diff --git a/docs/index.md b/docs/index.md index 72bf302..20ecda6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -19,6 +19,7 @@ | [MCP Quick Start](mcp/quick-start.md) | Install and configure the MCP server in minutes | | [MCP Configuration Reference](mcp/configuration.md) | Default rulesets, auth, and scope precedence | | [MCP Entra ID Setup](mcp/entra-id-setup.md) | One-time Azure-side app registration for Entra ID auth | +| [MCP GitHub Token Setup](mcp/github-pat-setup.md) | One-time GitHub PAT creation for `github-pat` ruleset auth | | [MCP Troubleshooting](mcp/troubleshooting.md) | Auth failures, missing tools, and common errors | | [Backstage Plugins](backstage-plugins/README.md) | Display grades on Backstage API entity pages | | [Backstage Quick Start](backstage-plugins/quick-start.md) | Get both plugins running in under 30 minutes | diff --git a/docs/mcp/README.md b/docs/mcp/README.md index 077d704..62e1432 100644 --- a/docs/mcp/README.md +++ b/docs/mcp/README.md @@ -62,6 +62,7 @@ npx -y @dawmatt/api-grade-mcp | [Quick Start](./quick-start.md) | Install and configure in minutes — covers Claude Code, Copilot, Claude Desktop | | [Configuration Reference](./configuration.md) | Default rulesets, auth, scope precedence, and config file format | | [Entra ID Setup](./entra-id-setup.md) | One-time Azure-side app registration required for Entra ID auth | +| [GitHub Token Setup](./github-pat-setup.md) | One-time GitHub PAT creation required for `github-pat` ruleset auth | | [Troubleshooting](./troubleshooting.md) | Auth failures, missing tools, and common errors | --- @@ -71,6 +72,7 @@ npx -y @dawmatt/api-grade-mcp - [→ Quick Start](./quick-start.md) — get the MCP server running in your AI tool - [→ Configuration Reference](./configuration.md) — configure a default ruleset and auth - [→ Entra ID Setup](./entra-id-setup.md) — Azure-side app registration for Entra ID auth +- [→ GitHub Token Setup](./github-pat-setup.md) — create and configure a GitHub PAT for `github-pat` auth - [→ Troubleshooting](./troubleshooting.md) — fix common issues - [→ Package Documentation](../package/api-grade-mcp.md) — full tool reference with all inputs and outputs - [→ Documentation Index](../index.md) — full navigation across all project docs diff --git a/docs/mcp/configuration.md b/docs/mcp/configuration.md index 0c60fb6..1bd1df9 100644 --- a/docs/mcp/configuration.md +++ b/docs/mcp/configuration.md @@ -94,6 +94,8 @@ For publicly accessible ruleset URLs, no auth configuration is needed: ### GitHub Enterprise (Personal Access Token) — you supply a token via an environment variable +This requires a GitHub personal access token to already exist with read access to the repository hosting the ruleset — see [GitHub Token Setup](github-pat-setup.md) for the one-time steps to create one before continuing here. + Set the `GITHUB_TOKEN` environment variable before starting your AI tool, or configure the auth type in the ruleset config: ```json @@ -191,6 +193,7 @@ Passing `rulesetPath: null` clears the configuration at that scope without affec - [Quick Start](quick-start.md) — install and configure in minutes - [Entra ID Setup](entra-id-setup.md) — one-time Azure-side app registration required for Entra ID auth +- [GitHub Token Setup](github-pat-setup.md) — one-time GitHub PAT creation required for `github-pat` auth - [Troubleshooting](troubleshooting.md) — auth failures, missing tools, and common errors - [Package Documentation](../package/api-grade-mcp.md) — full tool reference with all parameters - [Documentation Index](../index.md) diff --git a/docs/mcp/github-pat-setup.md b/docs/mcp/github-pat-setup.md new file mode 100644 index 0000000..63956ed --- /dev/null +++ b/docs/mcp/github-pat-setup.md @@ -0,0 +1,105 @@ +[← Back to Documentation Index](../index.md) + +# GitHub Token Setup for Secured Rulesets + +> One-time steps to create and configure a GitHub personal access token (PAT) before `@dawmatt/api-grade-mcp` can fetch a ruleset hosted on GitHub or GitHub Enterprise using the `github-pat` auth mechanism. + +--- + +## Who Needs This + +[Configuration Reference](configuration.md#github-enterprise-personal-access-token--you-supply-a-token-via-an-environment-variable) describes how `api-grade-mcp` uses the `GITHUB_TOKEN` environment variable to authenticate `auth.type: "github-pat"` requests. This page covers the step that comes before that: creating the token itself and making it available to the server. + +You need this if your ruleset lives in a **private** repository, or in a GitHub Enterprise Server/Cloud instance that requires authentication to read raw file contents. If the ruleset is in a public repository (or served from a public URL), skip this — use `auth: null` as shown in [Configuration Reference](configuration.md#no-authentication-public-urls). + +This is a per-user setup: each person running `api-grade-mcp` against a private ruleset needs their own token with read access to the repository. + +--- + +## What `api-grade-mcp` Expects + +The server reads the token from the `GITHUB_TOKEN` environment variable at the moment it needs to fetch a remote ruleset (see `packages/api-grade-mcp/src/auth/github.ts`), and sends it as an `Authorization: Bearer` header. It does not store, cache, or write the token to any config file — `auth.githubToken` inline values are accepted but discouraged, since `GITHUB_TOKEN` keeps the secret out of `.api-grade/config.json` entirely. + +The token only needs **read access to the repository containing the ruleset file** — nothing else. + +--- + +## Step-by-Step: Create the Token + +### 1. Choose a token type + +GitHub.com supports two token types; GitHub Enterprise Server versions support classic tokens (fine-grained tokens require a sufficiently recent Enterprise Server release — check **Settings → Developer settings** on your instance to see which are available). + +- **Fine-grained personal access token** (recommended on GitHub.com) — scoped to specific repositories, least privilege. +- **Classic personal access token** — required for most GitHub Enterprise Server instances; scoped by permission category rather than per-repository. + +### 2a. Fine-grained token (GitHub.com) + +1. Go to **Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token**. +2. **Token name**: something identifiable, e.g. `api-grade-mcp-ruleset-read`. +3. **Expiration**: choose a value matching your organization's secret-rotation policy (90 days is a reasonable default). +4. **Resource owner**: the organization or account that owns the ruleset repository. +5. **Repository access**: *Only select repositories* → choose the repository containing the ruleset file. Avoid *All repositories* — the token only needs to read one repo. +6. **Permissions → Repository permissions → Contents**: set to **Read-only**. This is the only permission required to fetch a raw file. +7. Click **Generate token** and copy the value immediately — it will not be shown again. + +If the repository belongs to an organization, the org owner may need to **approve** the fine-grained token before it becomes active (Settings → Developer settings → Personal access tokens → pending requests, from the org owner's side). + +### 2b. Classic token (GitHub Enterprise Server, or GitHub.com if fine-grained isn't an option) + +1. Go to **Settings → Developer settings → Personal access tokens → Tokens (classic) → Generate new token**. +2. **Note**: something identifiable, e.g. `api-grade-mcp-ruleset-read`. +3. **Expiration**: choose a value matching your organization's policy. +4. **Scopes**: select **`repo`** (full control of private repositories) if the ruleset is in a private repo, or no scopes at all if it's in a public repo on an instance that still requires authentication to read raw content. Classic tokens cannot be scoped to a single repository — `repo` grants read/write across every private repo you can access. If your GitHub Enterprise Server instance supports fine-grained tokens, prefer step 2a instead. +5. Click **Generate token** and copy the value immediately. + +--- + +## Making the Token Available to `api-grade-mcp` + +Set `GITHUB_TOKEN` in the environment **before** starting your AI tool, so the MCP server process inherits it on launch: + +```sh +export GITHUB_TOKEN=ghp_xxxx # or github_pat_xxxx for fine-grained tokens +``` + +Then start (or restart) your AI tool from that same shell session. Most AI hosts spawn the MCP server as a child process of the host application, so the token must be set wherever the host itself is launched from — not just in a terminal you open afterwards. + +If your AI host supports per-server environment variables in its MCP config (for example, an `env` block in `.vscode/mcp.json` or `.claude/settings.json`), you can set `GITHUB_TOKEN` there instead of exporting it globally — check [Quick Start](quick-start.md) for your host's config format. + +Finally, configure the ruleset to use `github-pat` auth, either inline on a grading call or as a default: + +``` +set-ruleset-config + scope: workspace + rulesetPath: https://github.example.com/org/api-standards/raw/main/ruleset.yaml + auth: { type: "github-pat" } +``` + +--- + +## Verifying the Setup + +1. Trigger a grading request that resolves to the secured ruleset (per the config above). +2. A successful fetch returns a normal grade response with `rulesetSource: "custom"`. +3. If the token is missing, expired, or lacks access, the tool returns a `RULESET_AUTH_FAILED` response with recovery options — see [Auth Failure Recovery](configuration.md#auth-failure-recovery) in the Configuration Reference. + +--- + +## Rotating or Revoking the Token + +When a token expires or is revoked, grading requests against the secured ruleset will start failing with `RULESET_AUTH_FAILED`. To fix it: + +1. Generate a new token following the steps above. +2. Update `GITHUB_TOKEN` in the environment (or your host's MCP config) with the new value. +3. Restart the AI tool so the MCP server process picks up the new environment variable. +4. Retry the grading request, or respond to the `RULESET_AUTH_FAILED` recovery prompt with `retry`. + +--- + +## Further Reading + +- [Configuration Reference](configuration.md) — how `api-grade-mcp` uses `GITHUB_TOKEN` at runtime, and the full auth failure recovery flow +- [Troubleshooting](troubleshooting.md) — token expiry and network failure scenarios +- [Quick Start](quick-start.md) — install and configure the MCP server, including per-server environment variables +- [Documentation Index](../index.md) diff --git a/docs/mcp/troubleshooting.md b/docs/mcp/troubleshooting.md index 0263d66..dcf783e 100644 --- a/docs/mcp/troubleshooting.md +++ b/docs/mcp/troubleshooting.md @@ -90,7 +90,7 @@ rm ~/.api-grade/entra-token-cache.json ## GitHub Token Issues -**Symptom**: `RULESET_AUTH_FAILED` with `failureReason: "auth-failed"` when fetching from GitHub Enterprise. +**Symptom**: `RULESET_AUTH_FAILED` with `failureReason: "auth-failed"` when fetching from GitHub Enterprise. If you haven't created a token yet, see [GitHub Token Setup](github-pat-setup.md) for the one-time steps. **Check**: 1. Is `GITHUB_TOKEN` set? `echo $GITHUB_TOKEN` @@ -126,5 +126,6 @@ This is expected behaviour. The server is meant to be started by the AI tool's M - [Quick Start](quick-start.md) — initial setup and configuration - [Configuration Reference](configuration.md) — auth, scopes, and config file format +- [GitHub Token Setup](github-pat-setup.md) — one-time GitHub PAT creation required for `github-pat` auth - [Package Documentation](../package/api-grade-mcp.md) — full tool reference - [Documentation Index](../index.md) From 11aaa1dbe2c5345381b9f1e7e55397f004ff35fe Mon Sep 17 00:00:00 2001 From: DawMatt Date: Sat, 20 Jun 2026 18:20:01 +1000 Subject: [PATCH 17/20] Improved MCP edge case responses --- docs/mcp/troubleshooting.md | 2 + packages/api-grade-core/src/summariser.ts | 3 +- .../tests/unit/summariser.test.ts | 12 +++++ packages/api-grade-mcp/package.json | 2 +- packages/api-grade-mcp/src/auth/github.ts | 5 +- .../api-grade-mcp/src/tools/assert-grade.ts | 6 +-- .../api-grade-mcp/src/tools/grade-detailed.ts | 6 +-- packages/api-grade-mcp/src/tools/grade.ts | 6 +-- .../src/tools/quick-fixes-only.ts | 6 +-- packages/api-grade-mcp/src/utils/errors.ts | 11 +++++ .../tests/integration/grade.test.ts | 21 +++++++- .../api-grade-mcp/tests/unit/errors.test.ts | 13 +++++ .../api-grade-mcp/tests/unit/github.test.ts | 8 ++- specs/007-ai-support/contracts/mcp-tools.md | 1 + specs/007-ai-support/data-model.md | 2 +- specs/007-ai-support/tasks.md | 49 +++++++++++++++++++ 16 files changed, 135 insertions(+), 18 deletions(-) diff --git a/docs/mcp/troubleshooting.md b/docs/mcp/troubleshooting.md index dcf783e..8da77bc 100644 --- a/docs/mcp/troubleshooting.md +++ b/docs/mcp/troubleshooting.md @@ -69,6 +69,8 @@ When the default ruleset fetch fails, the grading tool returns four recovery opt | use built-in for this session | Skips the configured default for all remaining requests | | cancel | Cancels the request | +**Expected AI behaviour**: the failure response includes an `instructions` field telling the AI to present these four options to you and wait for your explicit choice — it should not silently pick one (e.g. falling back to the built-in ruleset) on your behalf and disclose that after the fact. If an AI client ignores this and falls back silently anyway, tell it explicitly, e.g. *"Don't fall back to the built-in ruleset without asking me — show me the recovery options from the error response."* + --- ## Entra ID Device Code Not Completing diff --git a/packages/api-grade-core/src/summariser.ts b/packages/api-grade-core/src/summariser.ts index 81b6c69..f18ea21 100644 --- a/packages/api-grade-core/src/summariser.ts +++ b/packages/api-grade-core/src/summariser.ts @@ -114,11 +114,12 @@ function buildCommentary( if (warnCount > 0) { const n = warnCount; const plural = n === 1 ? 'warning' : 'warnings'; + const verb = n === 1 ? 'is' : 'are'; let verbPhrase: string; if (n > 20) verbPhrase = 'causing significant damage to the quality'; else if (n > 10) verbPhrase = 'impacting the quality'; else verbPhrase = 'affecting the quality'; - parts.push(`${n} ${plural} are ${verbPhrase}.`); + parts.push(`${n} ${plural} ${verb} ${verbPhrase}.`); } // Category insight: up to 3 worst categories ranked by error count then total diff --git a/packages/api-grade-core/tests/unit/summariser.test.ts b/packages/api-grade-core/tests/unit/summariser.test.ts index 98ed36f..2279be8 100644 --- a/packages/api-grade-core/tests/unit/summariser.test.ts +++ b/packages/api-grade-core/tests/unit/summariser.test.ts @@ -127,6 +127,18 @@ describe('Stage 4 — volume-aware warning language', () => { expect(commentary).toContain('affecting the quality'); }); + it('1 warning uses singular verb "is"', () => { + const { commentary } = generateSummary([makeDiag('warn', 'rule-a')], 99, 'openapi'); + expect(commentary).toContain('1 warning is affecting the quality'); + expect(commentary).not.toContain('1 warning are'); + }); + + it('2 warnings use plural verb "are"', () => { + const diags = [makeDiag('warn', 'rule-a'), makeDiag('warn', 'rule-b')]; + const { commentary } = generateSummary(diags, 89, 'openapi'); + expect(commentary).toContain('2 warnings are affecting the quality'); + }); + it('11 warnings → "impacting the quality"', () => { const diags = Array.from({ length: 11 }, () => makeDiag('warn', 'rule-a')); const { commentary } = generateSummary(diags, 89, 'openapi'); diff --git a/packages/api-grade-mcp/package.json b/packages/api-grade-mcp/package.json index 30b14ac..8ea73d5 100644 --- a/packages/api-grade-mcp/package.json +++ b/packages/api-grade-mcp/package.json @@ -1,6 +1,6 @@ { "name": "@dawmatt/api-grade-mcp", - "version": "0.1.1", + "version": "0.1.3", "description": "MCP server exposing api-grade capabilities for LLMs and agentic AI tooling", "keywords": [ "api", diff --git a/packages/api-grade-mcp/src/auth/github.ts b/packages/api-grade-mcp/src/auth/github.ts index 36c3efa..1a48057 100644 --- a/packages/api-grade-mcp/src/auth/github.ts +++ b/packages/api-grade-mcp/src/auth/github.ts @@ -3,7 +3,7 @@ export const RETRY_FETCH_TIMEOUT_MS = 30_000; export class RulesetAuthError extends Error { constructor( - public readonly reason: 'auth-failed' | 'network-unreachable', + public readonly reason: 'auth-failed' | 'not-found' | 'network-unreachable', public readonly url: string ) { super(`Failed to fetch ruleset from ${url}: ${reason}`); @@ -24,6 +24,9 @@ export async function fetchRulesetContent( if (res.status === 401 || res.status === 403) { throw new RulesetAuthError('auth-failed', url); } + if (res.status === 404) { + throw new RulesetAuthError('not-found', url); + } if (!res.ok) { throw new RulesetAuthError('network-unreachable', url); } diff --git a/packages/api-grade-mcp/src/tools/assert-grade.ts b/packages/api-grade-mcp/src/tools/assert-grade.ts index 480baff..eda6884 100644 --- a/packages/api-grade-mcp/src/tools/assert-grade.ts +++ b/packages/api-grade-mcp/src/tools/assert-grade.ts @@ -4,7 +4,7 @@ import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine, gradeToNumber, LETTER_GRADE_ORDER } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, buildAuthFailureResponse, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildAuthFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; import { resolveRuleset } from '../config/resolve-ruleset.js'; import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; @@ -34,7 +34,7 @@ export function registerAssertGradeTool(server: McpServer, sessionState: Session .enum(['retry', 'use-builtin-once', 'use-builtin-session', 'cancel']) .optional() .describe( - 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response.' + 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response. On receiving that response, present its recoveryOptions to the user verbatim and wait for their explicit choice before setting this field — do not select use-builtin-once or use-builtin-session on the user’s behalf.' ), }, async ({ specPath, minimumGrade, rulesetPath, recoveryOption }) => { @@ -101,7 +101,7 @@ export function registerAssertGradeTool(server: McpServer, sessionState: Session reason, resolved.rulesetPath, resolved.scope, - `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${reason.replace('-', ' ')}.` + `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${describeFetchFailureReason(reason)}.` ); } } diff --git a/packages/api-grade-mcp/src/tools/grade-detailed.ts b/packages/api-grade-mcp/src/tools/grade-detailed.ts index 1bbb0d9..e362681 100644 --- a/packages/api-grade-mcp/src/tools/grade-detailed.ts +++ b/packages/api-grade-mcp/src/tools/grade-detailed.ts @@ -4,7 +4,7 @@ import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, buildAuthFailureResponse, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildAuthFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; import { resolveRuleset } from '../config/resolve-ruleset.js'; import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; @@ -32,7 +32,7 @@ export function registerGradeDetailedTool(server: McpServer, sessionState: Sessi .enum(['retry', 'use-builtin-once', 'use-builtin-session', 'cancel']) .optional() .describe( - 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response.' + 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response. On receiving that response, present its recoveryOptions to the user verbatim and wait for their explicit choice before setting this field — do not select use-builtin-once or use-builtin-session on the user’s behalf.' ), }, async ({ specPath, rulesetPath, recoveryOption }) => { @@ -91,7 +91,7 @@ export function registerGradeDetailedTool(server: McpServer, sessionState: Sessi reason, resolved.rulesetPath, resolved.scope, - `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${reason.replace('-', ' ')}.` + `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${describeFetchFailureReason(reason)}.` ); } } diff --git a/packages/api-grade-mcp/src/tools/grade.ts b/packages/api-grade-mcp/src/tools/grade.ts index 9e53f66..ea1ae17 100644 --- a/packages/api-grade-mcp/src/tools/grade.ts +++ b/packages/api-grade-mcp/src/tools/grade.ts @@ -4,7 +4,7 @@ import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, buildAuthFailureResponse, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildAuthFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; import { resolveRuleset } from '../config/resolve-ruleset.js'; import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; @@ -33,7 +33,7 @@ export function registerGradeTool(server: McpServer, sessionState: SessionState) .enum(['retry', 'use-builtin-once', 'use-builtin-session', 'cancel']) .optional() .describe( - 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response.' + 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response. On receiving that response, present its recoveryOptions to the user verbatim and wait for their explicit choice before setting this field — do not select use-builtin-once or use-builtin-session on the user’s behalf.' ), }, async ({ specPath, rulesetPath, recoveryOption }) => { @@ -92,7 +92,7 @@ export function registerGradeTool(server: McpServer, sessionState: SessionState) reason, resolved.rulesetPath, resolved.scope, - `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${reason.replace('-', ' ')}.` + `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${describeFetchFailureReason(reason)}.` ); } } diff --git a/packages/api-grade-mcp/src/tools/quick-fixes-only.ts b/packages/api-grade-mcp/src/tools/quick-fixes-only.ts index 45a1f60..9bb8722 100644 --- a/packages/api-grade-mcp/src/tools/quick-fixes-only.ts +++ b/packages/api-grade-mcp/src/tools/quick-fixes-only.ts @@ -4,7 +4,7 @@ import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, buildAuthFailureResponse, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildAuthFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; import { resolveRuleset } from '../config/resolve-ruleset.js'; import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; @@ -32,7 +32,7 @@ export function registerQuickFixesOnlyTool(server: McpServer, sessionState: Sess .enum(['retry', 'use-builtin-once', 'use-builtin-session', 'cancel']) .optional() .describe( - 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response.' + 'Recovery action when the configured default ruleset is inaccessible. Only supply in response to a RULESET_AUTH_FAILED response. On receiving that response, present its recoveryOptions to the user verbatim and wait for their explicit choice before setting this field — do not select use-builtin-once or use-builtin-session on the user’s behalf.' ), }, async ({ specPath, rulesetPath, recoveryOption }) => { @@ -91,7 +91,7 @@ export function registerQuickFixesOnlyTool(server: McpServer, sessionState: Sess reason, resolved.rulesetPath, resolved.scope, - `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${reason.replace('-', ' ')}.` + `Could not fetch ruleset from '${resolved.rulesetPath}' (${resolved.scope} default): ${describeFetchFailureReason(reason)}.` ); } } diff --git a/packages/api-grade-mcp/src/utils/errors.ts b/packages/api-grade-mcp/src/utils/errors.ts index 42beeb6..7f51baa 100644 --- a/packages/api-grade-mcp/src/utils/errors.ts +++ b/packages/api-grade-mcp/src/utils/errors.ts @@ -54,6 +54,16 @@ const RECOVERY_OPTIONS = [ }, ] as const; +const FAILURE_REASON_DESCRIPTIONS: Record = { + 'auth-failed': 'the credentials were rejected (401/403)', + 'not-found': 'the ruleset path was not found — if this is a private repository, your token may also lack access; GitHub returns the same 404 response for both cases', + 'network-unreachable': 'the host could not be reached (DNS resolution or connection failure)', +}; + +export function describeFetchFailureReason(reason: string): string { + return FAILURE_REASON_DESCRIPTIONS[reason] ?? reason.replace('-', ' '); +} + export function buildAuthFailureResponse( failureReason: string, rulesetUrl: string, @@ -67,6 +77,7 @@ export function buildAuthFailureResponse( scope, message, recoveryOptions: RECOVERY_OPTIONS, + instructions: 'Present these recoveryOptions to the user and wait for their explicit choice before proceeding. Do not automatically select an option (such as falling back to the built-in ruleset) on the user\'s behalf.', }; return { content: [{ type: 'text', text: JSON.stringify(body) }], diff --git a/packages/api-grade-mcp/tests/integration/grade.test.ts b/packages/api-grade-mcp/tests/integration/grade.test.ts index 14a1653..2f6ea85 100644 --- a/packages/api-grade-mcp/tests/integration/grade.test.ts +++ b/packages/api-grade-mcp/tests/integration/grade.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect } from 'vitest'; +import { describe, it, expect, vi, afterEach } from 'vitest'; import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { writeFileSync, unlinkSync } from 'node:fs'; @@ -21,6 +21,11 @@ async function callTool(server: ReturnType, toolName: strin } describe('grade-api tool', () => { + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it('grades a valid OpenAPI spec and returns correct shape', async () => { const server = createServer(); const result = await callTool(server, 'grade-api', { specPath: OPENAPI_FIXTURE }); @@ -75,6 +80,20 @@ describe('grade-api tool', () => { expect(body.rulesetPath).toBe(CUSTOM_RULESET); }); + it('returns failureReason "not-found" (not "network-unreachable") when the remote ruleset 404s', async () => { + vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ ok: false, status: 404 })); + const server = createServer(); + const result = await callTool(server, 'grade-api', { + specPath: OPENAPI_FIXTURE, + rulesetPath: 'https://example.com/missing-ruleset.yaml', + }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('RULESET_AUTH_FAILED'); + expect(body.failureReason).toBe('not-found'); + expect(body.message).not.toContain('network'); + }); + it('returns largeSpecWarning for spec over 500KB', async () => { const tmp = resolve(tmpdir(), `large-spec-${Date.now()}.yaml`); const bigContent = 'openapi: "3.0.0"\ninfo:\n title: Big\n version: "1.0"\npaths: {}\n' + ' '.repeat(500_001); diff --git a/packages/api-grade-mcp/tests/unit/errors.test.ts b/packages/api-grade-mcp/tests/unit/errors.test.ts index 6d36df5..9d023b0 100644 --- a/packages/api-grade-mcp/tests/unit/errors.test.ts +++ b/packages/api-grade-mcp/tests/unit/errors.test.ts @@ -24,4 +24,17 @@ describe('buildAuthFailureResponse', () => { expect(ids).toContain('use-builtin-session'); expect(ids).toContain('cancel'); }); + + it('includes an instructions field telling the AI to present options and wait', () => { + const result = buildAuthFailureResponse( + 'not-found', + 'https://example.com/ruleset.yaml', + 'workspace', + 'Could not fetch ruleset' + ); + const body = JSON.parse(result.content[0].text); + expect(typeof body.instructions).toBe('string'); + expect(body.instructions.toLowerCase()).toContain('present'); + expect(body.instructions.toLowerCase()).toContain('wait'); + }); }); diff --git a/packages/api-grade-mcp/tests/unit/github.test.ts b/packages/api-grade-mcp/tests/unit/github.test.ts index b882b13..e3d2a33 100644 --- a/packages/api-grade-mcp/tests/unit/github.test.ts +++ b/packages/api-grade-mcp/tests/unit/github.test.ts @@ -63,12 +63,18 @@ describe('fetchRulesetContent', () => { .rejects.toMatchObject({ reason: 'auth-failed' }); }); - it('throws RulesetAuthError("network-unreachable") on non-401/403 failure', async () => { + it('throws RulesetAuthError("network-unreachable") on non-401/403/404 failure', async () => { vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ ok: false, status: 500 })); await expect(fetchRulesetContent('https://example.com/r.yaml', undefined, 5000)) .rejects.toMatchObject({ reason: 'network-unreachable' }); }); + it('throws RulesetAuthError("not-found") on 404', async () => { + vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ ok: false, status: 404 })); + await expect(fetchRulesetContent('https://example.com/r.yaml', undefined, 5000)) + .rejects.toMatchObject({ reason: 'not-found' }); + }); + it('throws RulesetAuthError("network-unreachable") on AbortError (timeout)', async () => { const abortError = new Error('The operation was aborted'); abortError.name = 'AbortError'; diff --git a/specs/007-ai-support/contracts/mcp-tools.md b/specs/007-ai-support/contracts/mcp-tools.md index 9bdd848..76f1b4e 100644 --- a/specs/007-ai-support/contracts/mcp-tools.md +++ b/specs/007-ai-support/contracts/mcp-tools.md @@ -457,6 +457,7 @@ When a grading tool (`grade-api`, `grade-api-detailed`, `assert-api-grade`, or ` | Value | Meaning | |---|---| | `auth-failed` | Credentials present but rejected (401/403 response) | +| `not-found` | HTTP 404 — the ruleset path does not exist, or, for a private repo, the configured token lacks access. GitHub returns 404 for both cases to avoid leaking repo existence, so this reason cannot distinguish between them | | `token-expired` | Token recognised but expired (GitHub PAT or Entra ID token) | | `network-unreachable` | DNS resolution or TCP connection failed (VPN/network issue) | | `entra-auth-required` | Entra ID authentication required but no cached token; device-code flow needed | diff --git a/specs/007-ai-support/data-model.md b/specs/007-ai-support/data-model.md index 424f327..fc4c385 100644 --- a/specs/007-ai-support/data-model.md +++ b/specs/007-ai-support/data-model.md @@ -110,7 +110,7 @@ Returned by any grading tool when the configured default ruleset cannot be fetch | Field | Type | Required | Description | |---|---|---|---| | `error` | `"RULESET_AUTH_FAILED"` | ✅ | Fixed error code | -| `failureReason` | `string` | ✅ | Machine-readable reason: `auth-failed`, `token-expired`, `network-unreachable`, `entra-auth-required`, `config-invalid` | +| `failureReason` | `string` | ✅ | Machine-readable reason: `auth-failed`, `not-found`, `token-expired`, `network-unreachable`, `entra-auth-required`, `config-invalid` | | `rulesetUrl` | `string` | ✅ | URL that could not be fetched | | `scope` | `string` | ✅ | Scope where the failing default was configured | | `message` | `string` | ✅ | Human-readable explanation for the AI to relay | diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index a1cd1f4..5064852 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -199,6 +199,48 @@ --- +## Phase 11: Bug Fix — Singular/Plural Grammar in Quality Assessment Commentary + +**Purpose**: Fix the issue logged in [`checklists/issues.md`](checklists/issues.md) (Run 3, 2026/06/10): the commentary text reads "1 warning **are** affecting the quality" instead of "1 warning **is** affecting the quality". Root cause: `packages/api-grade-core/src/summariser.ts` `buildCommentary()` (~line 121) hardcodes the verb `are` regardless of `warnCount`, even though the adjacent pluralisation logic (`plural`) already branches on `n === 1`. + +- [X] T052 [P] Extend `packages/api-grade-core/tests/unit/summariser.test.ts` with cases asserting the warning-count sentence reads "1 warning is affecting the quality" when `warnCount === 1`, and "N warnings are affecting the quality" when `warnCount > 1`; confirm the singular case fails before T053 +- [X] T053 Fix `packages/api-grade-core/src/summariser.ts` `buildCommentary()`: introduce `const verb = n === 1 ? 'is' : 'are';` alongside the existing `plural` ternary and use it in the warning sentence (`${n} ${plural} ${verb} ${verbPhrase}.`); confirm T052 now passes +- [X] T054 Run `yarn workspace api-grade-core run test:coverage` and `yarn workspace api-grade-mcp run test:coverage` to confirm no regressions in tests that snapshot commentary text (e.g. `formatter.test.ts`); update `checklists/issues.md` to check off the Run 3 grammar item and append a one-line resolution note (root cause + fix), matching the style of the Run 1/Run 2 resolution notes + +**Checkpoint**: Quality assessment commentary uses correct singular/plural verb agreement for both errors and warnings; close out the open item in `checklists/issues.md`. + +--- + +## Phase 12: Bug Fix — Ruleset Fetch Failures Misclassified as "network-unreachable" + +**Purpose**: Fix two related issues logged in [`checklists/issues.md`](checklists/issues.md) (Run 3, 2026/06/10): (a) a valid host with an invalid URL *path* (404) is reported with `failureReason: "network-unreachable"` instead of a not-found reason; (b) an unresolvable domain with **no auth configured** still returns the fixed `RULESET_AUTH_FAILED` error code and a message that reads as an authorisation problem, which is misleading when authorisation was never in play. Root cause: `packages/api-grade-mcp/src/auth/github.ts` `fetchRulesetContent()` only special-cases `401`/`403` as `'auth-failed'`; every other non-OK HTTP status (including `404`) and every thrown exception (DNS failure, TCP failure, timeout) collapse into the same generic `'network-unreachable'` reason and the same generically-worded message in `grade.ts`/`grade-detailed.ts`/`assert-grade.ts`/`quick-fixes-only.ts` (`` `... ${reason.replace('-', ' ')}.` ``). + +**Known limitation to document, not fix**: GitHub's raw-content endpoints intentionally return `404` for both "path does not exist" and "valid path but token lacks access to a private repo" (to avoid leaking repo existence) — these two cases cannot be distinguished from the HTTP response alone. The fix should name this ambiguity explicitly rather than guessing. + +- [X] T055 [P] Add unit tests to `packages/api-grade-mcp/tests/unit/github.test.ts`: `fetchRulesetContent()` rejects with reason `'not-found'` on a `404` response, distinct from the existing `'network-unreachable'` case (keep the existing `500 → 'network-unreachable'` test as-is); confirm the new `404` assertion fails before T057 +- [X] T056 [P] Add an integration test to `packages/api-grade-mcp/tests/integration/grade.test.ts` mocking a `404` ruleset fetch (configured custom remote ruleset) and asserting the structured failure response has `failureReason: "not-found"` and a `message` that does not contain the word "network"; confirm it fails before T057 +- [X] T057 Update `packages/api-grade-mcp/src/auth/github.ts`: extend `RulesetAuthError`'s `reason` union to `'auth-failed' | 'not-found' | 'network-unreachable'`; in `fetchRulesetContent()`, add a branch `if (res.status === 404) throw new RulesetAuthError('not-found', url);` before the generic `!res.ok` fallback; confirm T055 passes +- [X] T058 Update the failure-message construction in `packages/api-grade-mcp/src/tools/grade.ts`, `grade-detailed.ts`, `assert-grade.ts`, and `quick-fixes-only.ts`: replace the generic `` `${reason.replace('-', ' ')}.` `` interpolation with a reason-specific message map, where `'not-found'` renders "the ruleset path was not found — if this is a private repository, your token may also lack access; GitHub returns the same 404 response for both cases", `'auth-failed'` keeps the existing 401/403 wording, and `'network-unreachable'` keeps the existing DNS/connectivity wording; confirm T056 passes +- [X] T059 [P] Update `specs/007-ai-support/contracts/mcp-tools.md` and `specs/007-ai-support/data-model.md` `failureReason` value tables to add `not-found` (`HTTP 404 — path does not exist, or, for a private repo, the token lacks access; GitHub returns 404 for both`); update `specs/007-ai-support/checklists/t030-auth-verification.md` Part B step 5 to expect `failureReason: "not-found"` (not `"auth-failed"`) for a revoked PAT against a private-repo path, with a note explaining the GitHub 404-ambiguity limitation, and add a Part E case for "valid host, wrong path, no private-repo ambiguity" expecting `not-found` +- [X] T060 Run the full `packages/api-grade-mcp` test suite (`yarn workspace api-grade-mcp run test:coverage`) and confirm no regressions; update `checklists/issues.md` to check off the Run 3 "valid website, invalid path" and "unresolvable domain" items with a combined resolution note (root cause + fix + reference to the documented GitHub 404-ambiguity limitation) + +**Checkpoint**: Ruleset fetch failures are classified by actual cause (`auth-failed` / `not-found` / `network-unreachable`) with reason-specific messages; close out the two open items in `checklists/issues.md`. + +--- + +## Phase 13: Enhancement — Ensure AI Clients Present Recovery Options Instead of Silently Falling Back + +**Purpose**: Address the issue logged in [`checklists/issues.md`](checklists/issues.md) (Run 3, 2026/06/10): when a configured ruleset could not be fetched, the response correctly included `recoveryOptions` (per T030), but the calling AI silently chose to grade against the built-in ruleset itself instead of presenting the options to the user, then disclosed this after the fact ("Note: I used the built-in ruleset..."). This is not a server defect — the structured response already exists — it is a missing instruction telling the calling AI what it must do with that response. + +- [X] T061 Update the `recoveryOption` parameter description and the tool descriptions in `packages/api-grade-mcp/src/tools/grade.ts`, `grade-detailed.ts`, `assert-grade.ts`, and `quick-fixes-only.ts`: state explicitly that on a `RULESET_AUTH_FAILED` response, the calling AI must present the `recoveryOptions` to the user verbatim and wait for an explicit choice before re-calling the tool with `recoveryOption` — it must not unilaterally select `use-builtin-once` or `use-builtin-session` on the user's behalf +- [X] T062 [P] Add an `instructions` field to the response body built by `buildAuthFailureResponse()` in `packages/api-grade-mcp/src/utils/errors.ts` (e.g. `"Present these recoveryOptions to the user and wait for their explicit choice before proceeding. Do not select an option automatically."`) so the instruction travels with the failure payload itself, independent of host-specific tool-description handling; add/update a unit test in `packages/api-grade-mcp/tests/unit/errors.test.ts` asserting the field is present +- [X] T063 [P] Update `docs/mcp/troubleshooting.md` with a note describing the expected behaviour (AI presents recovery options and waits) and what a user should say if an AI client ignores it and falls back silently (e.g. "use the secured ruleset, don't fall back to the built-in one without asking me") +- [X] T064 Update `specs/007-ai-support/checklists/t030-auth-verification.md` Part B to add an explicit check that the recovery options are presented to the user in the conversation (not auto-resolved) before any recovery action is taken; update `checklists/issues.md` to check off the Run 3 "no error choices were offered" item with a resolution note referencing the new `instructions` field and updated tool descriptions + +**Checkpoint**: Failure responses carry an explicit instruction not to auto-select a recovery option; documentation tells users how to course-correct an AI client that ignores it; close out the open item in `checklists/issues.md`. + +--- + ## Dependencies & Execution Order ### Phase Dependencies @@ -213,6 +255,9 @@ - **Polish (Phase 8)**: Depends on all story phases completing; T044 depends on all six tools being registered - **Bug Fix (Phase 9)**: Independent of all story phases (touches only `src/index.ts`); discovered during T044 verification — T045 (test) before T046 (fix) before T047 (end-to-end verification + issue close-out) - **Bug Fix (Phase 10)**: Independent of all other phases (touches only `src/tools/grade.ts` and `src/tools/grade-detailed.ts`); reported in `checklists/issues.md` Run 2 — T048/T049 (tests, parallel) before T050 (fix) before T051 (full suite + issue close-out) +- **Bug Fix (Phase 11)**: Independent of all other phases (touches only `packages/api-grade-core/src/summariser.ts`); reported in `checklists/issues.md` Run 3 — T052 (test) before T053 (fix) before T054 (full suite + issue close-out) +- **Bug Fix (Phase 12)**: Independent of all other phases (touches `packages/api-grade-mcp/src/auth/github.ts` and the four grading tool files); reported in `checklists/issues.md` Run 3 — T055/T056 (tests, parallel) before T057 (classifier fix) before T058 (message fix) before T059 (docs/contract updates) before T060 (full suite + issue close-out) +- **Enhancement (Phase 13)**: Independent of all other phases (touches `src/utils/errors.ts`, tool descriptions, and docs); reported in `checklists/issues.md` Run 3 — depends on Phase 12 only in that T061/T062 reference the same failure-response shape; T061 before T062/T063 (parallel) before T064 (checklist + issue close-out) ### User Story Dependencies @@ -237,6 +282,8 @@ - T020, T021, T022, T023 (US5 tests) can all run in parallel — different files - T026 (GitHub auth), T027 (Entra auth), T024 (config), T025 (resolve) can run in parallel after US5 tests pass - T035–T038, T041–T043 (documentation) can all run in parallel +- T055, T056 (Phase 12 tests) can run in parallel — different files +- T062, T063 (Phase 13) can run in parallel — different files --- @@ -301,3 +348,5 @@ After Foundational phase is complete: - `auth.githubToken` is never persisted to workspace or global config files (only held in `SessionState` for the session); workspace config stores only `auth.type: "github-pat"` as a hint so the runtime reads `GITHUB_TOKEN` env var (FR-021). - `entra-token-cache.json` is written only to `~/.api-grade/` (user home), never to the workspace (FR-019). - Verify T044 manually in each of the three required environments before the feature is considered done (FR-014). +- **GitHub 404 ambiguity (Phase 12)**: a `404` from `raw.githubusercontent.com` means either "path does not exist" or "valid path, but the token lacks access to a private repo" — GitHub returns the same status for both to avoid leaking repo existence. T057's `'not-found'` reason and T058's message wording must not claim a definitive cause; T059 documents this limitation rather than attempting to resolve it heuristically. +- The duplicate "ruleset details ... `rulesetPath?` ... wasn't [set]" item logged again in `checklists/issues.md` Run 3 is the same defect already fixed by T048–T051 (Phase 10) and covered by regression assertions in `tests/integration/grade.test.ts` / `grade-detailed.test.ts`; no new task is needed — close it out by adding a one-line note in `checklists/issues.md` pointing back to the Run 2 resolution. From 4fcb4ffe234102c67bc3b41f0ca89c513a5cb2c5 Mon Sep 17 00:00:00 2001 From: DawMatt Date: Sat, 20 Jun 2026 20:42:14 +1000 Subject: [PATCH 18/20] Further improved MCP edge case handling --- docs/mcp/configuration.md | 4 +- docs/mcp/troubleshooting.md | 36 ++++++-- docs/package/api-reference.md | 3 + packages/api-grade-mcp/package.json | 2 +- .../api-grade-mcp/src/tools/assert-grade.ts | 4 +- .../api-grade-mcp/src/tools/grade-detailed.ts | 9 +- packages/api-grade-mcp/src/tools/grade.ts | 9 +- .../src/tools/quick-fixes-only.ts | 4 +- packages/api-grade-mcp/src/utils/errors.ts | 20 +++- .../tests/integration/grade-detailed.test.ts | 49 +++++++++- .../tests/integration/grade.test.ts | 34 ++++++- .../api-grade-mcp/tests/unit/errors.test.ts | 46 +++++++++- specs/007-ai-support/checklists/issues.md | 91 +++++++++++++++++++ specs/007-ai-support/contracts/mcp-tools.md | 26 +++--- specs/007-ai-support/data-model.md | 14 +-- specs/007-ai-support/tasks.md | 36 ++++++++ 16 files changed, 339 insertions(+), 48 deletions(-) diff --git a/docs/mcp/configuration.md b/docs/mcp/configuration.md index 1bd1df9..31820fa 100644 --- a/docs/mcp/configuration.md +++ b/docs/mcp/configuration.md @@ -142,9 +142,9 @@ Cached tokens are reused on subsequent requests, including after restarting the --- -## Auth Failure Recovery +## Ruleset Fetch Failure Recovery -When the configured default ruleset cannot be fetched (network unavailable, token expired, VPN disconnected), the grading tool returns an `RULESET_AUTH_FAILED` response with four recovery options: +When the configured default ruleset cannot be fetched, the grading tool returns a structured ruleset-fetch-failure response — `RULESET_AUTH_FAILED`, `RULESET_NOT_FOUND`, `RULESET_INVALID_HOST`, or `RULESET_BAD_CONFIG` depending on the cause (rejected credentials, a missing path/404, an unreachable host, or a malformed stored auth configuration respectively) — with four recovery options: | Option | Description | |--------|-------------| diff --git a/docs/mcp/troubleshooting.md b/docs/mcp/troubleshooting.md index 8da77bc..fd77ed6 100644 --- a/docs/mcp/troubleshooting.md +++ b/docs/mcp/troubleshooting.md @@ -36,28 +36,52 @@ openapi.yaml ## `RULESET_NOT_FOUND` Error -**Cause**: The `rulesetPath` supplied in the request (or the configured default) points to a local file that doesn't exist. +**Cause**: Either of two distinct cases produces this same error code: +- The `rulesetPath` supplied in the request (or the configured default) points to a **local file** that doesn't exist. +- A configured **remote ruleset URL** returned HTTP 404. For GitHub-hosted rulesets, a 404 also covers "the path exists but your token lacks access to a private repo" — GitHub returns the same status for both to avoid leaking repo existence, so the two cannot be distinguished from the response alone. -**Fix**: Verify the path is correct and the file exists. For configured defaults, use `get-ruleset-config` to see what path is active, then correct it with `set-ruleset-config`. +**Fix**: Verify the path is correct and the file (or remote path) exists. For configured defaults, use `get-ruleset-config` to see what path is active, then correct it with `set-ruleset-config`. If the remote path is correct but the repo is private, also check that your token has access. --- -## `RULESET_AUTH_FAILED` on Every Request +## `RULESET_INVALID_HOST` Error -**Cause**: The configured default ruleset is unreachable — network unavailable, token expired, or wrong credentials. +**Cause**: DNS resolution or the TCP connection to the configured ruleset host failed — the host is unreachable, regardless of authorisation. This is distinct from `RULESET_AUTH_FAILED`: no credentials were rejected, the host simply could not be reached (wrong hostname, VPN disconnected, corporate firewall, internal-only host resolved from outside the network). **Diagnosis**: 1. Run `get-ruleset-config` to see what ruleset URL is configured. 2. Test whether the URL is reachable from the terminal: `curl -I ` **Fixes**: -- **Token expired (`github-pat`)**: Rotate the `GITHUB_TOKEN` env var and restart the AI tool - **VPN disconnected**: Reconnect to VPN, then use the `retry` recovery option -- **Wrong URL**: Use `set-ruleset-config` to correct the `rulesetPath` +- **Wrong hostname**: Use `set-ruleset-config` to correct the `rulesetPath` - **Temporary bypass**: Use `set-ruleset-config scope: session rulesetPath: null` to clear the session default and fall back to the built-in ruleset --- +## `RULESET_AUTH_FAILED` on Every Request + +**Cause**: The configured default ruleset's host was reached, but the request was rejected on credentials — wrong, missing, or expired token (401/403), or Entra ID re-authentication is needed. + +**Diagnosis**: +1. Run `get-ruleset-config` to see what ruleset URL is configured. +2. Test whether the URL is reachable from the terminal with your token: `curl -I -H "Authorization: Bearer $GITHUB_TOKEN" ` + +**Fixes**: +- **Token expired (`github-pat`)**: Rotate the `GITHUB_TOKEN` env var and restart the AI tool +- **Wrong or insufficient token**: Confirm the token has read access to the repository containing the ruleset +- **Temporary bypass**: Use `set-ruleset-config scope: session rulesetPath: null` to clear the session default and fall back to the built-in ruleset + +--- + +## `RULESET_BAD_CONFIG` Error + +**Cause**: The stored auth configuration for the configured default ruleset (in `.api-grade/config.json` or `~/.api-grade/config.json`) is malformed or missing required fields — this is distinct from `RULESET_AUTH_FAILED`, since no credentials were even sent to the host; the configuration itself failed validation before a request could be made. + +**Fix**: Run `get-ruleset-config` to inspect the stored `auth` block for the affected scope, then use `set-ruleset-config` to supply a complete, valid `auth` configuration (e.g. `tenantId` and `clientId` for `entra-id`, or `type: "github-pat"` with `GITHUB_TOKEN` set in the environment for GitHub). + +--- + ## Auth Failure Recovery Options When the default ruleset fetch fails, the grading tool returns four recovery options. Tell your AI tool which to use: diff --git a/docs/package/api-reference.md b/docs/package/api-reference.md index 077401c..67c5fc4 100644 --- a/docs/package/api-reference.md +++ b/docs/package/api-reference.md @@ -4,6 +4,8 @@ > Detailed reference for all exported functions, classes, and types. +> **Scope**: this page documents the `@dawmatt/api-grade-core` programmatic library API only. For the MCP server's tools (including the `recoveryOption` parameter), see [MCP Server Tool Reference](api-grade-mcp.md). + --- ## `GradeEngine` @@ -213,4 +215,5 @@ interface RuleMetadata { - [Usage Guide](usage-guide.md) — common patterns and worked examples - [Package Overview](README.md) — installation and minimal usage +- [MCP Server Tool Reference](api-grade-mcp.md) — all six MCP tools including `recoveryOption` - [Documentation Index](../index.md) — full navigation across all docs diff --git a/packages/api-grade-mcp/package.json b/packages/api-grade-mcp/package.json index 8ea73d5..6c0292f 100644 --- a/packages/api-grade-mcp/package.json +++ b/packages/api-grade-mcp/package.json @@ -1,6 +1,6 @@ { "name": "@dawmatt/api-grade-mcp", - "version": "0.1.3", + "version": "0.1.4", "description": "MCP server exposing api-grade capabilities for LLMs and agentic AI tooling", "keywords": [ "api", diff --git a/packages/api-grade-mcp/src/tools/assert-grade.ts b/packages/api-grade-mcp/src/tools/assert-grade.ts index eda6884..ff6629d 100644 --- a/packages/api-grade-mcp/src/tools/assert-grade.ts +++ b/packages/api-grade-mcp/src/tools/assert-grade.ts @@ -4,7 +4,7 @@ import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine, gradeToNumber, LETTER_GRADE_ORDER } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, buildAuthFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildRulesetFetchFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; import { resolveRuleset } from '../config/resolve-ruleset.js'; import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; @@ -97,7 +97,7 @@ export function registerAssertGradeTool(server: McpServer, sessionState: Session }; } const reason = err instanceof RulesetAuthError ? err.reason : 'network-unreachable'; - return buildAuthFailureResponse( + return buildRulesetFetchFailureResponse( reason, resolved.rulesetPath, resolved.scope, diff --git a/packages/api-grade-mcp/src/tools/grade-detailed.ts b/packages/api-grade-mcp/src/tools/grade-detailed.ts index e362681..accc045 100644 --- a/packages/api-grade-mcp/src/tools/grade-detailed.ts +++ b/packages/api-grade-mcp/src/tools/grade-detailed.ts @@ -4,7 +4,7 @@ import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, buildAuthFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildRulesetFetchFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; import { resolveRuleset } from '../config/resolve-ruleset.js'; import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; @@ -47,6 +47,7 @@ export function registerGradeDetailedTool(server: McpServer, sessionState: Sessi const workspaceConfig = await loadWorkspaceConfig(); const globalConfig = await loadGlobalConfig(); const resolved = resolveRuleset(rulesetPath, sessionState, workspaceConfig, globalConfig); + const configuredRulesetPath = resolved.rulesetPath ?? undefined; let effectiveRulesetPath: string | undefined = resolved.rulesetPath ?? undefined; let tempRulesetFile: string | undefined; @@ -87,7 +88,7 @@ export function registerGradeDetailedTool(server: McpServer, sessionState: Sessi }; } const reason = err instanceof RulesetAuthError ? err.reason : 'network-unreachable'; - return buildAuthFailureResponse( + return buildRulesetFetchFailureResponse( reason, resolved.rulesetPath, resolved.scope, @@ -143,7 +144,9 @@ export function registerGradeDetailedTool(server: McpServer, sessionState: Sessi summary: result.summary, diagnostics, rulesetSource: result.rulesetSource, - ...(result.rulesetPath ? { rulesetPath: result.rulesetPath } : {}), + ...((configuredRulesetPath ?? result.rulesetPath) + ? { rulesetPath: configuredRulesetPath ?? result.rulesetPath } + : {}), truncated, }; diff --git a/packages/api-grade-mcp/src/tools/grade.ts b/packages/api-grade-mcp/src/tools/grade.ts index ea1ae17..1fad54e 100644 --- a/packages/api-grade-mcp/src/tools/grade.ts +++ b/packages/api-grade-mcp/src/tools/grade.ts @@ -4,7 +4,7 @@ import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, buildAuthFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildRulesetFetchFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; import { resolveRuleset } from '../config/resolve-ruleset.js'; import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; @@ -48,6 +48,7 @@ export function registerGradeTool(server: McpServer, sessionState: SessionState) const workspaceConfig = await loadWorkspaceConfig(); const globalConfig = await loadGlobalConfig(); const resolved = resolveRuleset(rulesetPath, sessionState, workspaceConfig, globalConfig); + const configuredRulesetPath = resolved.rulesetPath ?? undefined; let effectiveRulesetPath: string | undefined = resolved.rulesetPath ?? undefined; let tempRulesetFile: string | undefined; @@ -88,7 +89,7 @@ export function registerGradeTool(server: McpServer, sessionState: SessionState) }; } const reason = err instanceof RulesetAuthError ? err.reason : 'network-unreachable'; - return buildAuthFailureResponse( + return buildRulesetFetchFailureResponse( reason, resolved.rulesetPath, resolved.scope, @@ -136,7 +137,9 @@ export function registerGradeTool(server: McpServer, sessionState: SessionState) numericScore: result.numericScore, summary: result.summary, rulesetSource: result.rulesetSource, - ...(result.rulesetPath ? { rulesetPath: result.rulesetPath } : {}), + ...((configuredRulesetPath ?? result.rulesetPath) + ? { rulesetPath: configuredRulesetPath ?? result.rulesetPath } + : {}), }; if (largeSpecWarning) { diff --git a/packages/api-grade-mcp/src/tools/quick-fixes-only.ts b/packages/api-grade-mcp/src/tools/quick-fixes-only.ts index 9bb8722..c54d62f 100644 --- a/packages/api-grade-mcp/src/tools/quick-fixes-only.ts +++ b/packages/api-grade-mcp/src/tools/quick-fixes-only.ts @@ -4,7 +4,7 @@ import { join } from 'node:path'; import { z } from 'zod'; import { GradeEngine } from '@dawmatt/api-grade-core'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { mcpError, buildAuthFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; +import { mcpError, buildRulesetFetchFailureResponse, describeFetchFailureReason, ERROR_CODES } from '../utils/errors.js'; import { loadWorkspaceConfig, loadGlobalConfig } from '../config/ruleset-config.js'; import { resolveRuleset } from '../config/resolve-ruleset.js'; import { fetchRulesetContent, RulesetAuthError, INITIAL_FETCH_TIMEOUT_MS, RETRY_FETCH_TIMEOUT_MS } from '../auth/github.js'; @@ -87,7 +87,7 @@ export function registerQuickFixesOnlyTool(server: McpServer, sessionState: Sess }; } const reason = err instanceof RulesetAuthError ? err.reason : 'network-unreachable'; - return buildAuthFailureResponse( + return buildRulesetFetchFailureResponse( reason, resolved.rulesetPath, resolved.scope, diff --git a/packages/api-grade-mcp/src/utils/errors.ts b/packages/api-grade-mcp/src/utils/errors.ts index 7f51baa..a9999b7 100644 --- a/packages/api-grade-mcp/src/utils/errors.ts +++ b/packages/api-grade-mcp/src/utils/errors.ts @@ -5,6 +5,8 @@ export const ERROR_CODES = { INVALID_GRADE: 'INVALID_GRADE', GRADE_ENGINE_ERROR: 'GRADE_ENGINE_ERROR', RULESET_AUTH_FAILED: 'RULESET_AUTH_FAILED', + RULESET_INVALID_HOST: 'RULESET_INVALID_HOST', + RULESET_BAD_CONFIG: 'RULESET_BAD_CONFIG', ENTRA_AUTH_REQUIRED: 'ENTRA_AUTH_REQUIRED', INVALID_AUTH_CONFIG: 'INVALID_AUTH_CONFIG', CONFIG_WRITE_ERROR: 'CONFIG_WRITE_ERROR', @@ -58,20 +60,34 @@ const FAILURE_REASON_DESCRIPTIONS: Record = { 'auth-failed': 'the credentials were rejected (401/403)', 'not-found': 'the ruleset path was not found — if this is a private repository, your token may also lack access; GitHub returns the same 404 response for both cases', 'network-unreachable': 'the host could not be reached (DNS resolution or connection failure)', + 'config-invalid': 'the stored auth configuration is malformed or missing required fields', }; export function describeFetchFailureReason(reason: string): string { return FAILURE_REASON_DESCRIPTIONS[reason] ?? reason.replace('-', ' '); } -export function buildAuthFailureResponse( +export function errorCodeForFailureReason(reason: string): ErrorCode { + switch (reason) { + case 'not-found': + return ERROR_CODES.RULESET_NOT_FOUND; + case 'network-unreachable': + return ERROR_CODES.RULESET_INVALID_HOST; + case 'config-invalid': + return ERROR_CODES.RULESET_BAD_CONFIG; + default: + return ERROR_CODES.RULESET_AUTH_FAILED; + } +} + +export function buildRulesetFetchFailureResponse( failureReason: string, rulesetUrl: string, scope: string, message: string ): { content: [{ type: 'text'; text: string }]; isError: true } { const body = { - error: ERROR_CODES.RULESET_AUTH_FAILED, + error: errorCodeForFailureReason(failureReason), failureReason, rulesetUrl, scope, diff --git a/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts b/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts index 9e8fb06..541957d 100644 --- a/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts +++ b/packages/api-grade-mcp/tests/integration/grade-detailed.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect } from 'vitest'; +import { describe, it, expect, vi, afterEach } from 'vitest'; import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { createServer } from '../../src/server.js'; @@ -19,6 +19,36 @@ async function callTool(server: ReturnType, toolName: strin } describe('grade-api-detailed tool', () => { + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it('returns error "RULESET_NOT_FOUND" when the remote ruleset 404s', async () => { + vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ ok: false, status: 404 })); + const server = createServer(); + const result = await callTool(server, 'grade-api-detailed', { + specPath: OPENAPI_POOR, + rulesetPath: 'https://example.com/missing-ruleset.yaml', + }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('RULESET_NOT_FOUND'); + expect(body.failureReason).toBe('not-found'); + }); + + it('returns error "RULESET_INVALID_HOST" when the remote ruleset host is unreachable', async () => { + vi.stubGlobal('fetch', vi.fn().mockRejectedValueOnce(new Error('ECONNREFUSED'))); + const server = createServer(); + const result = await callTool(server, 'grade-api-detailed', { + specPath: OPENAPI_POOR, + rulesetPath: 'https://internal.example.invalid/ruleset.yaml', + }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('RULESET_INVALID_HOST'); + expect(body.failureReason).toBe('network-unreachable'); + }); + it('response includes diagnostics array', async () => { const server = createServer(); const result = await callTool(server, 'grade-api-detailed', { specPath: OPENAPI_POOR }); @@ -72,6 +102,23 @@ describe('grade-api-detailed tool', () => { expect(body.rulesetPath).toBe(CUSTOM_RULESET); }); + it('returns the configured remote ruleset URL as rulesetPath, not the temp file used to fetch it', async () => { + vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ + ok: true, + status: 200, + text: () => Promise.resolve('rules: {}'), + })); + const server = createServer(); + const result = await callTool(server, 'grade-api-detailed', { + specPath: OPENAPI_POOR, + rulesetPath: 'https://raw.githubusercontent.com/example/repo/main/ruleset.yaml', + }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body.rulesetPath).toBe('https://raw.githubusercontent.com/example/repo/main/ruleset.yaml'); + expect(body.rulesetPath).not.toContain('api-grade-ruleset-'); + }); + it('grades AsyncAPI spec successfully', async () => { const server = createServer(); const result = await callTool(server, 'grade-api-detailed', { specPath: ASYNCAPI_FIXTURE }); diff --git a/packages/api-grade-mcp/tests/integration/grade.test.ts b/packages/api-grade-mcp/tests/integration/grade.test.ts index 2f6ea85..ac4a0b2 100644 --- a/packages/api-grade-mcp/tests/integration/grade.test.ts +++ b/packages/api-grade-mcp/tests/integration/grade.test.ts @@ -80,7 +80,7 @@ describe('grade-api tool', () => { expect(body.rulesetPath).toBe(CUSTOM_RULESET); }); - it('returns failureReason "not-found" (not "network-unreachable") when the remote ruleset 404s', async () => { + it('returns error "RULESET_NOT_FOUND" and failureReason "not-found" when the remote ruleset 404s', async () => { vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ ok: false, status: 404 })); const server = createServer(); const result = await callTool(server, 'grade-api', { @@ -89,11 +89,41 @@ describe('grade-api tool', () => { }); expect(result.isError).toBe(true); const body = JSON.parse(result.content[0].text); - expect(body.error).toBe('RULESET_AUTH_FAILED'); + expect(body.error).toBe('RULESET_NOT_FOUND'); expect(body.failureReason).toBe('not-found'); expect(body.message).not.toContain('network'); }); + it('returns error "RULESET_INVALID_HOST" when the remote ruleset host is unreachable', async () => { + vi.stubGlobal('fetch', vi.fn().mockRejectedValueOnce(new Error('ECONNREFUSED'))); + const server = createServer(); + const result = await callTool(server, 'grade-api', { + specPath: OPENAPI_FIXTURE, + rulesetPath: 'https://internal.example.invalid/ruleset.yaml', + }); + expect(result.isError).toBe(true); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe('RULESET_INVALID_HOST'); + expect(body.failureReason).toBe('network-unreachable'); + }); + + it('returns the configured remote ruleset URL as rulesetPath, not the temp file used to fetch it', async () => { + vi.stubGlobal('fetch', vi.fn().mockResolvedValueOnce({ + ok: true, + status: 200, + text: () => Promise.resolve('rules: {}'), + })); + const server = createServer(); + const result = await callTool(server, 'grade-api', { + specPath: OPENAPI_FIXTURE, + rulesetPath: 'https://raw.githubusercontent.com/example/repo/main/ruleset.yaml', + }); + expect(result.isError).toBeFalsy(); + const body = JSON.parse(result.content[0].text); + expect(body.rulesetPath).toBe('https://raw.githubusercontent.com/example/repo/main/ruleset.yaml'); + expect(body.rulesetPath).not.toContain('api-grade-ruleset-'); + }); + it('returns largeSpecWarning for spec over 500KB', async () => { const tmp = resolve(tmpdir(), `large-spec-${Date.now()}.yaml`); const bigContent = 'openapi: "3.0.0"\ninfo:\n title: Big\n version: "1.0"\npaths: {}\n' + ' '.repeat(500_001); diff --git a/packages/api-grade-mcp/tests/unit/errors.test.ts b/packages/api-grade-mcp/tests/unit/errors.test.ts index 9d023b0..95e2598 100644 --- a/packages/api-grade-mcp/tests/unit/errors.test.ts +++ b/packages/api-grade-mcp/tests/unit/errors.test.ts @@ -1,9 +1,9 @@ import { describe, it, expect } from 'vitest'; -import { buildAuthFailureResponse, ERROR_CODES } from '../../src/utils/errors.js'; +import { buildRulesetFetchFailureResponse, ERROR_CODES } from '../../src/utils/errors.js'; -describe('buildAuthFailureResponse', () => { - it('returns isError:true with RULESET_AUTH_FAILED and four recovery options', () => { - const result = buildAuthFailureResponse( +describe('buildRulesetFetchFailureResponse', () => { + it('returns isError:true with RULESET_AUTH_FAILED and four recovery options for auth-failed', () => { + const result = buildRulesetFetchFailureResponse( 'auth-failed', 'https://example.com/ruleset.yaml', 'workspace', @@ -25,8 +25,44 @@ describe('buildAuthFailureResponse', () => { expect(ids).toContain('cancel'); }); + it('returns RULESET_NOT_FOUND when failureReason is "not-found"', () => { + const result = buildRulesetFetchFailureResponse( + 'not-found', + 'https://example.com/ruleset.yaml', + 'workspace', + 'Could not fetch ruleset' + ); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe(ERROR_CODES.RULESET_NOT_FOUND); + expect(body.failureReason).toBe('not-found'); + }); + + it('returns RULESET_INVALID_HOST when failureReason is "network-unreachable"', () => { + const result = buildRulesetFetchFailureResponse( + 'network-unreachable', + 'https://example.com/ruleset.yaml', + 'workspace', + 'Could not fetch ruleset' + ); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe(ERROR_CODES.RULESET_INVALID_HOST); + expect(body.failureReason).toBe('network-unreachable'); + }); + + it('returns RULESET_BAD_CONFIG when failureReason is "config-invalid"', () => { + const result = buildRulesetFetchFailureResponse( + 'config-invalid', + 'https://example.com/ruleset.yaml', + 'workspace', + 'Could not fetch ruleset' + ); + const body = JSON.parse(result.content[0].text); + expect(body.error).toBe(ERROR_CODES.RULESET_BAD_CONFIG); + expect(body.failureReason).toBe('config-invalid'); + }); + it('includes an instructions field telling the AI to present options and wait', () => { - const result = buildAuthFailureResponse( + const result = buildRulesetFetchFailureResponse( 'not-found', 'https://example.com/ruleset.yaml', 'workspace', diff --git a/specs/007-ai-support/checklists/issues.md b/specs/007-ai-support/checklists/issues.md index 5e50314..53fe687 100644 --- a/specs/007-ai-support/checklists/issues.md +++ b/specs/007-ai-support/checklists/issues.md @@ -27,3 +27,94 @@ npm warn deprecated uuid@8.3.2: uuid@10 and below is no longer supported. For E ``` **Resolved** (`specs/007-ai-support/tasks.md` T048–T051): `src/tools/grade.ts` and `src/tools/grade-detailed.ts` copied `result.rulesetSource` into the response but never copied `result.rulesetPath`, even though `GradeEngine.grade()` (via `api-grade-core`'s ruleset loader) populates it correctly whenever a custom ruleset is used. Fix: added `...(result.rulesetPath ? { rulesetPath: result.rulesetPath } : {})` to both response projections, mirroring the existing pattern in `api-grade-core/src/formatter.ts`, and added regression assertions to `tests/integration/grade.test.ts` and `tests/integration/grade-detailed.test.ts`. + +## Run 3 - 2026/06/20 + +- [x] Grammar issue with quality assessment when only 1 issue highlighted. "1 warning are affecting" should be "1 warning is affecting". Use "is" when 1, "are" when multiple. + +``` +Grade: A (99%) — Excellent + +Quality Assessment: +Excellent. 1 warning are affecting the quality. The test category has the most issues. +``` + +**Resolved** (`specs/007-ai-support/tasks.md` T052–T054): `packages/api-grade-core/src/summariser.ts` `buildCommentary()` hardcoded the verb `are` in the warning sentence regardless of count, even though the adjacent pluralisation (`warning`/`warnings`) already branched on count. Fix: added a `verb = n === 1 ? 'is' : 'are'` ternary alongside the existing `plural` ternary and used it in the sentence; added regression assertions to `tests/unit/summariser.test.ts` for both the singular and plural cases. + +- [x] Ruleset details returned in grade-api-detail JSON are not as expected. `rulesetSource` value of `custom` gives no detail and relies upon `rulesetPath?`, which was supposed to be set but wasn't. **This is a duplicate of the Run 2 item above** — already fixed by T048–T051 and covered by regression assertions in `tests/integration/grade.test.ts` / `grade-detailed.test.ts`. Verified still passing as of this implementation pass; no new code change required. + +```json +{"specPath":"tests/fixtures/openapi/poor-quality.yaml","format":"openapi-3","letterGrade":"A","gradeLabel":"Excellent","numericScore":99,"summary":{"tone":"Excellent","severityLevel":"INFO","errorCount":0,"warnCount":1,"infoCount":0,"hintCount":0,"commentary":"Excellent. 1 warning are affecting the quality. The test category has the most issues.","text":"Excellent. 1 warning are affecting the quality. The test category has the most issues.","focusRules":[{"id":"test-rule-pat","title":"Test Rule Pat","category":"test","count":1,"impact":"LOW","url":null}],"recommendations":["Focus on this rule (highest impact first): test-rule-pat — 1 violations (LOW)","Start with this category test — it has the most impactful issues"]},"diagnostics":[{"ruleId":"test-rule-pat","message":"Test rule for remote PAT ruleset unit tests","severity":"warn","path":["info"],"range":{"start":{"line":1,"character":5},"end":{"line":3,"character":12}},"source":"/Users/matt/Code/DawMatt/api-grade/tests/fixtures/openapi/poor-quality.yaml"}],"rulesetSource":"custom","truncated":false} +``` + +- [x] `t030-auth-verification.md` step 5 indicates the correct result looks like: 'Response is RULESET_AUTH_FAILED with failureReason: "auth-failed"'. The actual response blames the failure on an unreachable network. This misleads the AI, which decided by itself to fallback to the in-built ruleset rather than offer me the recovery options embedded in the response. + +```json +{"error":"RULESET_AUTH_FAILED","failureReason":"network-unreachable","rulesetUrl":"https://raw.githubusercontent.com/DawMatt/logseq/refs/heads/main/remotePAT.yaml","scope":"workspace","message":"Could not fetch ruleset from 'https://raw.githubusercontent.com/DawMatt/logseq/refs/heads/main/remotePAT.yaml' (workspace default): network unreachable.","recoveryOptions":[{"id":"retry","label":"Retry","description":"Attempt to fetch the ruleset again (re-run this grading request using the configured default)."},{"id":"use-builtin-once","label":"Use built-in default for this request","description":"Grade using the built-in api-grade ruleset for this one request only. The configured default remains active for future requests."},{"id":"use-builtin-session","label":"Use built-in default for this session","description":"Grade using the built-in api-grade ruleset for all remaining requests this session. The configured default is not changed."},{"id":"cancel","label":"Cancel","description":"Cancel this grading request without returning a result."}]} +``` + +- [x] This was the response for a valid website, but an invalid URL path, with a valid PAT. This should have returned a 404 to the application. Why has this response indicated an auth failure and network unreachable? Neither are true. + +```json +{"error":"RULESET_AUTH_FAILED","failureReason":"network-unreachable","rulesetUrl":"https://raw.githubusercontent.com/DawMatt/logseq/refs/heads/main/remotePATxxx.yaml","scope":"workspace","message":"Could not fetch ruleset from 'https://raw.githubusercontent.com/DawMatt/logseq/refs/heads/main/remotePATxxx.yaml' (workspace default): network unreachable.","recoveryOptions":[{"id":"retry","label":"Retry","description":"Attempt to fetch the ruleset again (re-run this grading request using the configured default)."},{"id":"use-builtin-once","label":"Use built-in default for this request","description":"Grade using the built-in api-grade ruleset for this one request only. The configured default remains active for future requests."},{"id":"use-builtin-session","label":"Use built-in default for this session","description":"Grade using the built-in api-grade ruleset for all remaining requests this session. The configured default is not changed."},{"id":"cancel","label":"Cancel","description":"Cancel this grading request without returning a result."}]} +``` + +- [x] This was the response for an unresolvable domain with no authorisation configured. This should have indicated an unresolvable host to the application. Why has this response indicated an auth failure and network unreachable? Authorisation was not configured and irrelevant to this error. + +```json +{"error":"RULESET_AUTH_FAILED","failureReason":"network-unreachable","rulesetUrl":"https://internal/DawMatt/logseq/refs/heads/main/remotePAT.yaml","scope":"workspace","message":"Could not fetch ruleset from 'https://internal/DawMatt/logseq/refs/heads/main/remotePAT.yaml' (workspace default): network unreachable.","recoveryOptions":[{"id":"retry","label":"Retry","description":"Attempt to fetch the ruleset again (re-run this grading request using the configured default)."},{"id":"use-builtin-once","label":"Use built-in default for this request","description":"Grade using the built-in api-grade ruleset for this one request only. The configured default remains active for future requests."},{"id":"use-builtin-session","label":"Use built-in default for this session","description":"Grade using the built-in api-grade ruleset for all remaining requests this session. The configured default is not changed."},{"id":"cancel","label":"Cancel","description":"Cancel this grading request without returning a result."}]} +``` + +**Resolved** (`specs/007-ai-support/tasks.md` T055–T060): `packages/api-grade-mcp/src/auth/github.ts` `fetchRulesetContent()` only special-cased `401`/`403` as `'auth-failed'`; every other non-OK HTTP status — including a plain `404` on a reachable host — and every thrown exception (DNS failure, TCP failure, timeout) fell into the same generic `'network-unreachable'` reason, and the response message always read `... : network unreachable.` regardless of what actually happened, even though authorisation was never configured for the unresolvable-domain case. Fix: added a dedicated `'not-found'` `failureReason` for HTTP `404` responses (`github.ts`), and replaced the generic `${reason.replace('-', ' ')}` message interpolation in `grade.ts`/`grade-detailed.ts`/`assert-grade.ts`/`quick-fixes-only.ts` with a reason-specific `describeFetchFailureReason()` helper (`utils/errors.ts`) so each reason gets accurate wording. **Known limitation, documented rather than papered over**: GitHub's raw-content endpoints intentionally return the same `404` for "path does not exist" and "valid path but the token lacks access to a private repo" (to avoid leaking repo existence), so a revoked PAT against a private-repo path now correctly surfaces as `not-found` rather than the previously-expected (but unverifiable) `auth-failed` — `checklists/t030-auth-verification.md` Part B/E and `contracts/mcp-tools.md`/`data-model.md`'s `failureReason` tables have been updated to reflect this. The genuine unresolvable-domain case still correctly throws `'network-unreachable'` (an exception from `fetch()`, not an HTTP response) — the fix there was the message wording, not the classification. + +- [x] For all of the ruleset retrieval errors in this run, a result was returned using the default ruleset. No error choices were offered to me despite the recovery options included in the error response message. The following was shown below the response using the default ruleset. + +``` +Note: I used the built-in ruleset for this grading request because the workspace default ruleset could not be fetched. +``` + +**Resolved** (`specs/007-ai-support/tasks.md` T061–T064): the structured `RULESET_AUTH_FAILED` response already included the four `recoveryOptions` (added in T030), but nothing in the response or in the tool descriptions told the calling AI what to *do* with them — it was free to interpret the failure however it liked, and in this run it chose to silently grade with the built-in ruleset and disclose that only after the fact, instead of surfacing the choice to the user. This was not a server defect so much as a missing instruction. Fix: added an `instructions` field to `buildAuthFailureResponse()` (`packages/api-grade-mcp/src/utils/errors.ts`) stating that the AI must present the recovery options to the user and wait for an explicit choice rather than auto-selecting one; reinforced the same instruction in the `recoveryOption` parameter description on all four grading tools (`grade.ts`, `grade-detailed.ts`, `assert-grade.ts`, `quick-fixes-only.ts`); documented the expected behaviour and a user-facing workaround in `docs/mcp/troubleshooting.md`; added a manual verification check to `checklists/t030-auth-verification.md` Part B to confirm the options are actually surfaced in the conversation, not auto-resolved. Whether a given AI host actually honours this instruction is outside the server's control — the fix gives the AI an explicit, hard-to-miss directive rather than leaving the behaviour to chance. + +## Run 4 - 2026/06/20 + +- [x] `data-model.md` and `configuration.md` are misleading. Their section `AuthFailureRecoveryResponse` actually handles all errors to do with retrieving rulesets, not just authorisation errors. The section states `error` has a single fixed value that is specific to authorisation errors. This seems to be driving a number of the issues reported this run. + +- [x] `troubleshooting.md` refers to other errors such as `RULESET_NOT_FOUND`, which is described as only for local files that can't be found but seems entirely appropriate for the 404 error issues noted below. + +- [x] This was the response for an unresolvable domain with no authorisation configured. This should have indicated an unresolvable host to the application. Why has this response indicated an auth failure and network unreachable? Authorisation was not configured and irrelevant to this error. The `message` has improved but the `error` and `failureReason` fields still contain inappropriate values. For `error` we should use a new error code like `RULESET_INVALID_HOST`. + +```json +{"error":"RULESET_AUTH_FAILED","failureReason":"network-unreachable","rulesetUrl":"https://internal/DawMatt/logseq/refs/heads/main/remotePAT.yaml","scope":"workspace","message":"Could not fetch ruleset from 'https://internal/DawMatt/logseq/refs/heads/main/remotePAT.yaml' (workspace default): the host could not be reached (DNS resolution or connection failure).","recoveryOptions":[{"id":"retry","label":"Retry","description":"Attempt to fetch the ruleset again (re-run this grading request using the configured default)."},{"id":"use-builtin-once","label":"Use built-in default for this request","description":"Grade using the built-in api-grade ruleset for this one request only. The configured default remains active for future requests."},{"id":"use-builtin-session","label":"Use built-in default for this session","description":"Grade using the built-in api-grade ruleset for all remaining requests this session. The configured default is not changed."},{"id":"cancel","label":"Cancel","description":"Cancel this grading request without returning a result."}],"instructions":"Present these recoveryOptions to the user and wait for their explicit choice before proceeding. Do not automatically select an option (such as falling back to the built-in ruleset) on the user's behalf."} +``` + +**Resolved** (`specs/007-ai-support/tasks.md` T065–T071): the response shape used for every ruleset-retrieval failure was named `AuthFailureRecoveryResponse` and its `error` field was hardcoded to the fixed value `RULESET_AUTH_FAILED`, regardless of `failureReason` — so a 404 (`not-found`) and an unresolvable host (`network-unreachable`) both surfaced as an authorisation failure even though authorisation was never in play, exactly as reported. Fix: added a new `RULESET_INVALID_HOST` error code (`packages/api-grade-mcp/src/utils/errors.ts` `ERROR_CODES`); added `errorCodeForFailureReason()` mapping `not-found` → `RULESET_NOT_FOUND` (reusing the existing local-file-not-found code, now generalised to also cover remote 404s), `network-unreachable` → `RULESET_INVALID_HOST`, and everything else (`auth-failed`, `token-expired`, `entra-auth-required`, `config-invalid`) → `RULESET_AUTH_FAILED`; renamed `buildAuthFailureResponse()` to `buildRulesetFetchFailureResponse()` and updated all four call sites (`grade.ts`, `grade-detailed.ts`, `assert-grade.ts`, `quick-fixes-only.ts`) and the `AuthFailureRecoveryResponse` data-model entity (renamed to `RulesetFetchFailureResponse`). Documentation (`data-model.md`, `contracts/mcp-tools.md`, `docs/mcp/configuration.md`, `docs/mcp/troubleshooting.md`) updated to describe the generalised response shape, the new error code, and the fact that `RULESET_NOT_FOUND` now also covers remote 404s; `troubleshooting.md`'s `RULESET_AUTH_FAILED` section narrowed to genuine 401/403/token-expiry cases with a new dedicated `RULESET_INVALID_HOST` section for DNS/connection failures. Only the top-level `error` field changed — `failureReason` values and `recoveryOptions` are unaffected. + +- [x] Ruleset details returned in grade-api-detail JSON are not as expected. `rulesetPath` contains the path to a temporary file ("/var/folders/qp/gs_7hwfn2_1_vfrcws0stqyc0000gn/T/api-grade-ruleset-1781936309420.yaml") rather than the path for the ruleset the user configured. The information currently being returned in this field is of no value. + +```json +{"specPath":"tests/fixtures/openapi/poor-quality.yaml","format":"openapi-3","letterGrade":"A","gradeLabel":"Excellent","numericScore":99,"summary":{"tone":"Excellent","severityLevel":"INFO","errorCount":0,"warnCount":1,"infoCount":0,"hintCount":0,"commentary":"Excellent. 1 warning is affecting the quality. The test category has the most issues.","text":"Excellent. 1 warning is affecting the quality. The test category has the most issues.","focusRules":[{"id":"test-rule-pat","title":"Test Rule Pat","category":"test","count":1,"impact":"LOW","url":null}],"recommendations":["Focus on this rule (highest impact first): test-rule-pat — 1 violations (LOW)","Start with this category test — it has the most impactful issues"]},"diagnostics":[{"ruleId":"test-rule-pat","message":"Test rule for remote PAT ruleset unit tests","severity":"warn","path":["info"],"range":{"start":{"line":1,"character":5},"end":{"line":3,"character":12}},"source":"/Users/matt/Code/DawMatt/api-grade/tests/fixtures/openapi/poor-quality.yaml"}],"rulesetSource":"custom","rulesetPath":"/var/folders/qp/gs_7hwfn2_1_vfrcws0stqyc0000gn/T/api-grade-ruleset-1781936309420.yaml","truncated":false} +``` + +**Resolved** (`specs/007-ai-support/tasks.md` T072–T074): when a remote ruleset was fetched successfully, `grade.ts` and `grade-detailed.ts` wrote its content to a temp file in `os.tmpdir()` and passed that path to `GradeEngine.grade()`, which echoes back whatever `rulesetPath` it was given — so the response field exposed an internal, already-deleted-by-the-time-you-read-it temp path instead of the ruleset source the user actually configured. Fix: captured `configuredRulesetPath` from `resolveRuleset()`'s result immediately, before any temp file is written, and changed both response projections to report `configuredRulesetPath ?? result.rulesetPath` — so a successfully-fetched remote URL or a local custom file path is always reported, and the temp file path never leaks into the response. Added regression assertions to `tests/integration/grade.test.ts` and `tests/integration/grade-detailed.test.ts` mocking a successful remote fetch and asserting `rulesetPath` equals the configured URL, not a path containing `api-grade-ruleset-`. +- [x] This was the response for a valid website, but an invalid URL path, with a valid PAT. The `failureReason` and `message` are now correct. Why is `error` claiming this is an authorisation failure? + +```json +{"error":"RULESET_AUTH_FAILED","failureReason":"not-found","rulesetUrl":"https://raw.githubusercontent.com/DawMatt/logseq/refs/heads/main/remotePATxxx.yaml","scope":"workspace","message":"Could not fetch ruleset from 'https://raw.githubusercontent.com/DawMatt/logseq/refs/heads/main/remotePATxxx.yaml' (workspace default): the ruleset path was not found — if this is a private repository, your token may also lack access; GitHub returns the same 404 response for both cases.","recoveryOptions":[{"id":"retry","label":"Retry","description":"Attempt to fetch the ruleset again (re-run this grading request using the configured default)."},{"id":"use-builtin-once","label":"Use built-in default for this request","description":"Grade using the built-in api-grade ruleset for this one request only. The configured default remains active for future requests."},{"id":"use-builtin-session","label":"Use built-in default for this session","description":"Grade using the built-in api-grade ruleset for all remaining requests this session. The configured default is not changed."},{"id":"cancel","label":"Cancel","description":"Cancel this grading request without returning a result."}],"instructions":"Present these recoveryOptions to the user and wait for their explicit choice before proceeding. Do not automatically select an option (such as falling back to the built-in ruleset) on the user's behalf."} +``` + +- [x] This was the response for a valid website and URL path, with an invalid PAT. Given the documented GitHub behaviour doesn't differentiate between a bad URL and a bad PAT, returning a 404 for both, the `failureReason` and `message` are now correct. Given the error code returned by the host our `error` value can't claim this is an authorisation failure. All we know was the ruleset was not found where we were told to expect it to be. + +```json +{"error":"RULESET_AUTH_FAILED","failureReason":"not-found","rulesetUrl":"https://raw.githubusercontent.com/DawMatt/logseq/refs/heads/main/remotePAT.yaml","scope":"workspace","message":"Could not fetch ruleset from 'https://raw.githubusercontent.com/DawMatt/logseq/refs/heads/main/remotePAT.yaml' (workspace default): the ruleset path was not found — if this is a private repository, your token may also lack access; GitHub returns the same 404 response for both cases.","recoveryOptions":[{"id":"retry","label":"Retry","description":"Attempt to fetch the ruleset again (re-run this grading request using the configured default)."},{"id":"use-builtin-once","label":"Use built-in default for this request","description":"Grade using the built-in api-grade ruleset for this one request only. The configured default remains active for future requests."},{"id":"use-builtin-session","label":"Use built-in default for this session","description":"Grade using the built-in api-grade ruleset for all remaining requests this session. The configured default is not changed."},{"id":"cancel","label":"Cancel","description":"Cancel this grading request without returning a result."}],"instructions":"Present these recoveryOptions to the user and wait for their explicit choice before proceeding. Do not automatically select an option (such as falling back to the built-in ruleset) on the user's behalf."} +``` + +- [x] The AI tool (GitHub Copilot) decided to provide the `recoveryOption` as part of the second request. That actually makes a lot of sense but I don't think it is part of the API spec for the grade-api* tools. That should be an allowable parameter in the request. This would make it easier for the retry option to know when the longer timeout should be used (as per design). + +```json +{ + "specPath": "tests/fixtures/openapi/poor-quality.yaml", + "recoveryOption": "use-builtin-once" +} +``` + +**Resolved** (`specs/007-ai-support/tasks.md` T075): `recoveryOption` is not actually missing — it was already added as an optional Zod field on all four grading tools in T030 and is documented in `contracts/mcp-tools.md` and `docs/package/api-grade-mcp.md`. The real gap was discoverability: `docs/package/api-reference.md` (linked from `docs/index.md` as the general "Package API Reference") covers only the `@dawmatt/api-grade-core` programmatic library and never linked onward to the MCP tool docs, so a reader who started there had no way to find `recoveryOption`. Fix: added a scope note near the top of `api-reference.md` clarifying it documents the core library only, and added a "MCP Server Tool Reference" entry to its "Further Reading" section linking to `docs/package/api-grade-mcp.md`. \ No newline at end of file diff --git a/specs/007-ai-support/contracts/mcp-tools.md b/specs/007-ai-support/contracts/mcp-tools.md index 76f1b4e..d7f16b0 100644 --- a/specs/007-ai-support/contracts/mcp-tools.md +++ b/specs/007-ai-support/contracts/mcp-tools.md @@ -414,13 +414,13 @@ Response confirms the scope was cleared and which scope will now take effect. --- -## Auth Failure Recovery Response +## Ruleset Fetch Failure Response -When a grading tool (`grade-api`, `grade-api-detailed`, `assert-api-grade`, or `grade-api-quick-fixes-only`) is invoked and the configured default ruleset cannot be fetched due to an authentication, authorisation, or network failure, the tool returns this structured response instead of an unhandled error. (`grade-api-quick-fixes-only` participates in the same auth failure recovery flow as the other grading tools.) +When a grading tool (`grade-api`, `grade-api-detailed`, `assert-api-grade`, or `grade-api-quick-fixes-only`) is invoked and the configured default ruleset cannot be fetched — for any reason, not only an authentication or authorisation failure — the tool returns this structured response instead of an unhandled error. (`grade-api-quick-fixes-only` participates in the same recovery flow as the other grading tools.) The top-level `error` field varies by `failureReason` (see the values table below): `not-found` → `RULESET_NOT_FOUND`, `network-unreachable` → `RULESET_INVALID_HOST`, `config-invalid` → `RULESET_BAD_CONFIG`, everything else → `RULESET_AUTH_FAILED`. This example shows the `network-unreachable` case: ```json { - "error": "RULESET_AUTH_FAILED", + "error": "RULESET_INVALID_HOST", "failureReason": "network-unreachable", "rulesetUrl": "https://sharepoint.example.com/sites/api-standards/ruleset.yaml", "scope": "workspace", @@ -452,16 +452,16 @@ When a grading tool (`grade-api`, `grade-api-detailed`, `assert-api-grade`, or ` **Fetch timeout behaviour**: The initial fetch attempt uses a **5-second timeout**. If the user selects `retry`, the retry uses a **30-second timeout**. All other recovery options bypass the fetch. -**`failureReason` values**: +**`failureReason` values** (each maps to a top-level `error` code as noted): -| Value | Meaning | -|---|---| -| `auth-failed` | Credentials present but rejected (401/403 response) | -| `not-found` | HTTP 404 — the ruleset path does not exist, or, for a private repo, the configured token lacks access. GitHub returns 404 for both cases to avoid leaking repo existence, so this reason cannot distinguish between them | -| `token-expired` | Token recognised but expired (GitHub PAT or Entra ID token) | -| `network-unreachable` | DNS resolution or TCP connection failed (VPN/network issue) | -| `entra-auth-required` | Entra ID authentication required but no cached token; device-code flow needed | -| `config-invalid` | Stored auth config is malformed or missing required fields | +| Value | Meaning | `error` code | +|---|---|---| +| `auth-failed` | Credentials present but rejected (401/403 response) | `RULESET_AUTH_FAILED` | +| `not-found` | HTTP 404 — the ruleset path does not exist, or, for a private repo, the configured token lacks access. GitHub returns 404 for both cases to avoid leaking repo existence, so this reason cannot distinguish between them | `RULESET_NOT_FOUND` | +| `token-expired` | Token recognised but expired (GitHub PAT or Entra ID token) | `RULESET_AUTH_FAILED` | +| `network-unreachable` | DNS resolution or TCP connection failed (VPN/network issue, unresolvable host) | `RULESET_INVALID_HOST` | +| `entra-auth-required` | Entra ID authentication required but no cached token; device-code flow needed | `RULESET_AUTH_FAILED` | +| `config-invalid` | Stored auth config is malformed or missing required fields | `RULESET_BAD_CONFIG` | **Acting on a recovery option**: The AI presents the options to the user, then re-calls the original grading tool with an additional `recoveryOption` parameter set to the chosen `id`. The grading tool honours the choice and proceeds accordingly. @@ -481,7 +481,7 @@ When a grading tool (`grade-api`, `grade-api-detailed`, `assert-api-grade`, or ` "recoveryOption": { "type": "string", "enum": ["retry", "use-builtin-once", "use-builtin-session", "cancel"], - "description": "Recovery action to take when the configured default ruleset is inaccessible. Only supply this field in response to a RULESET_AUTH_FAILED response — do not set it on initial requests." + "description": "Recovery action to take when the configured default ruleset is inaccessible. Only supply this field in response to a ruleset fetch failure response (RULESET_AUTH_FAILED, RULESET_NOT_FOUND, RULESET_INVALID_HOST, or RULESET_BAD_CONFIG) — do not set it on initial requests." } ``` diff --git a/specs/007-ai-support/data-model.md b/specs/007-ai-support/data-model.md index fc4c385..f80b0ca 100644 --- a/specs/007-ai-support/data-model.md +++ b/specs/007-ai-support/data-model.md @@ -103,13 +103,13 @@ The result of the precedence chain lookup, produced by `resolve-ruleset.ts` befo | `scope` | `"per-request" \| "session" \| "workspace" \| "global" \| "built-in"` | Which scope provided the resolved value | | `auth` | `AuthConfig \| null` | Auth config to apply when fetching, or `null` | -### AuthFailureRecoveryResponse +### RulesetFetchFailureResponse -Returned by any grading tool when the configured default ruleset cannot be fetched. +Returned by any grading tool when the configured default ruleset cannot be fetched, for any reason — not only authorisation failures. The `error` field is chosen per `failureReason` so it never claims a cause that didn't occur. | Field | Type | Required | Description | |---|---|---|---| -| `error` | `"RULESET_AUTH_FAILED"` | ✅ | Fixed error code | +| `error` | `"RULESET_AUTH_FAILED" \| "RULESET_NOT_FOUND" \| "RULESET_INVALID_HOST" \| "RULESET_BAD_CONFIG"` | ✅ | Error code selected by `failureReason`: `not-found` → `RULESET_NOT_FOUND`, `network-unreachable` → `RULESET_INVALID_HOST`, `config-invalid` → `RULESET_BAD_CONFIG`, everything else (`auth-failed`, `token-expired`, `entra-auth-required`) → `RULESET_AUTH_FAILED` | | `failureReason` | `string` | ✅ | Machine-readable reason: `auth-failed`, `not-found`, `token-expired`, `network-unreachable`, `entra-auth-required`, `config-invalid` | | `rulesetUrl` | `string` | ✅ | URL that could not be fetched | | `scope` | `string` | ✅ | Scope where the failing default was configured | @@ -223,7 +223,7 @@ Each grading tool invocation: 1. Receives input via MCP stdio 2. Calls `resolveRuleset(input.rulesetPath, sessionState, workspaceConfig, globalConfig)` to determine the effective ruleset. Precedence: per-request → `sessionRulesetOverride: "builtin"` (short-circuits to built-in immediately) → `session.defaultRuleset` → workspace → global → built-in 3. If the resolved ruleset is a remote URL, fetches it using the associated `AuthConfig` (PAT header or cached Entra token) -4. If fetch fails with an auth/network error, returns `AuthFailureRecoveryResponse` immediately +4. If fetch fails, returns `RulesetFetchFailureResponse` immediately, with `error` selected per `failureReason` (see Error Shapes below) 5. Constructs a `GradeRequest` and calls `GradeEngine` 6. Returns a projected JSON response @@ -245,10 +245,12 @@ Structured errors are returned as MCP tool errors (not thrown exceptions). All e |---|---| | `SPEC_NOT_FOUND` | `specPath` does not exist on the filesystem | | `SPEC_PARSE_ERROR` | Specification is syntactically invalid (unparseable) | -| `RULESET_NOT_FOUND` | `rulesetPath` was provided but does not exist | +| `RULESET_NOT_FOUND` | `rulesetPath` was provided but does not exist on the local filesystem, or a remote ruleset URL returned HTTP 404 | | `INVALID_GRADE` | `minimumGrade` is not one of A/B/C/D/F | | `GRADE_ENGINE_ERROR` | Unexpected error from GradeEngine (wrapped with details) | -| `RULESET_AUTH_FAILED` | Configured default ruleset could not be fetched (auth/network failure) — see `AuthFailureRecoveryResponse` | +| `RULESET_AUTH_FAILED` | Configured default ruleset could not be fetched due to rejected credentials (401/403) — see `RulesetFetchFailureResponse` | +| `RULESET_INVALID_HOST` | DNS resolution or TCP connection to the configured ruleset host failed — see `RulesetFetchFailureResponse` | +| `RULESET_BAD_CONFIG` | The stored auth configuration for the configured default ruleset is malformed or missing required fields, discovered at fetch time — see `RulesetFetchFailureResponse` | | `ENTRA_AUTH_REQUIRED` | Entra ID device-code flow must be completed before the secured ruleset can be fetched | | `INVALID_AUTH_CONFIG` | Auth configuration is malformed or missing required fields | | `CONFIG_WRITE_ERROR` | Workspace or global config file could not be written (permission denied or invalid path) | diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index 5064852..e6aca3d 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -241,6 +241,35 @@ --- +## Phase 14: Bug Fix — `error` Field Misclassifies Non-Auth Ruleset Fetch Failures as `RULESET_AUTH_FAILED` + +**Purpose**: Address the issues logged in [`checklists/issues.md`](checklists/issues.md) (Run 4, 2026/06/20): `AuthFailureRecoveryResponse` is documented in `data-model.md` and `docs/mcp/configuration.md` as having a single fixed `error: "RULESET_AUTH_FAILED"`, but the same response shape is used for every ruleset retrieval failure (404, unreachable host, malformed config), not just authorisation failures. This caused two reported defects: a `404` (`failureReason: "not-found"`) and an unresolvable host (`failureReason: "network-unreachable"`) both surfaced `error: "RULESET_AUTH_FAILED"`, which is factually wrong and actively misleading — the user correctly pointed out that "authorisation was not configured and irrelevant to this error." `docs/mcp/troubleshooting.md`'s `RULESET_NOT_FOUND` section also only describes local-file lookups, omitting that it now applies to remote 404s too. + +- [X] T065 [P] Add unit tests to `packages/api-grade-mcp/tests/unit/errors.test.ts`: rename the `describe` block to `buildRulesetFetchFailureResponse` and add cases asserting `body.error` is `RULESET_NOT_FOUND` when `failureReason: "not-found"`, `RULESET_INVALID_HOST` when `failureReason: "network-unreachable"`, and `RULESET_AUTH_FAILED` when `failureReason: "auth-failed"` (keep the existing four-recovery-options and `instructions` assertions, updated to call the renamed function); confirm the new `not-found`/`network-unreachable` assertions fail before T067 +- [X] T066 [P] Extend `packages/api-grade-mcp/tests/integration/grade.test.ts` and `tests/integration/grade-detailed.test.ts`: for a mocked `404` ruleset fetch, assert the structured failure response has `error: "RULESET_NOT_FOUND"` (not `RULESET_AUTH_FAILED`); for a mocked DNS/connection failure, assert `error: "RULESET_INVALID_HOST"`; confirm both new assertions fail before T067 +- [X] T067 Update `packages/api-grade-mcp/src/utils/errors.ts`: add `RULESET_INVALID_HOST: 'RULESET_INVALID_HOST'` to `ERROR_CODES`; add `function errorCodeForFailureReason(reason: string): ErrorCode` mapping `'not-found'` → `RULESET_NOT_FOUND`, `'network-unreachable'` → `RULESET_INVALID_HOST`, and everything else (`'auth-failed'`, `'token-expired'`, `'config-invalid'`, `'entra-auth-required'`) → `RULESET_AUTH_FAILED`; rename `buildAuthFailureResponse` to `buildRulesetFetchFailureResponse` (same parameter list) and set `body.error = errorCodeForFailureReason(failureReason)` instead of the hardcoded constant; update the import and call site in `packages/api-grade-mcp/src/tools/grade.ts`, `grade-detailed.ts`, `assert-grade.ts`, and `quick-fixes-only.ts`; confirm T065 and T066 now pass +- [X] T068 [P] Update `specs/007-ai-support/data-model.md`: rename the `AuthFailureRecoveryResponse` entity to `RulesetFetchFailureResponse`, change its `error` field type from the fixed `"RULESET_AUTH_FAILED"` to `"RULESET_AUTH_FAILED" \| "RULESET_NOT_FOUND" \| "RULESET_INVALID_HOST"` with a description noting it is chosen per `failureReason`; add a `RULESET_INVALID_HOST` row to the Error Codes table (`DNS resolution or TCP connection to the ruleset host failed`); update the `RULESET_NOT_FOUND` row to note it now also covers a remote ruleset URL returning HTTP 404 +- [X] T069 [P] Update `specs/007-ai-support/contracts/mcp-tools.md`: rename the "Auth Failure Recovery Response" heading to "Ruleset Fetch Failure Response"; update its intro sentence and the `error` field in the example JSON to show it varies by `failureReason` (link to the `failureReason` values table); add `RULESET_INVALID_HOST` and clarify `RULESET_NOT_FOUND` next to the existing `failureReason` values table entries for `network-unreachable` and `not-found` +- [X] T070 [P] Update `docs/mcp/configuration.md` (the paragraph at line ~147 describing the `RULESET_AUTH_FAILED` response) and `docs/mcp/troubleshooting.md` (`RULESET_NOT_FOUND` and `RULESET_AUTH_FAILED` sections): generalise the configuration.md wording to "the grading tool returns a structured ruleset-fetch-failure response (`RULESET_AUTH_FAILED`, `RULESET_NOT_FOUND`, or `RULESET_INVALID_HOST` depending on the cause)"; extend troubleshooting.md's `RULESET_NOT_FOUND` section to state it also covers a remote ruleset URL returning HTTP 404; add a new `RULESET_INVALID_HOST` section covering DNS/connection failures (moved out of the `RULESET_AUTH_FAILED on Every Request` section, which should be narrowed to genuine 401/403/token-expiry cases) +- [X] T071 Run the full `packages/api-grade-mcp` test suite (`yarn workspace api-grade-mcp run test:coverage`) and confirm no regressions; update `checklists/issues.md` to check off the Run 4 "`data-model.md`/`configuration.md` misleading" item, the "`troubleshooting.md` refers to `RULESET_NOT_FOUND`" item, and the two "`error` claims auth failure" items (unresolvable host and 404-on-valid-host) with a combined resolution note (root cause + new `RULESET_INVALID_HOST` code + reused `RULESET_NOT_FOUND` for remote 404s + doc updates) + +**Checkpoint**: `error` reflects what actually happened (auth, not-found, or unreachable host) instead of always claiming an authorisation failure; docs describe the generalised response shape and the new error code. + +--- + +## Phase 15: Bug Fix — `rulesetPath` in Grade Responses Leaks Temp File Path Instead of Configured Source + +**Purpose**: Address the issue logged in [`checklists/issues.md`](checklists/issues.md) (Run 4, 2026/06/20): when a remote ruleset is fetched successfully, `grade.ts` and `grade-detailed.ts` write its content to a temp file (`api-grade-ruleset-.yaml` in `os.tmpdir()`) and pass that temp path to `GradeEngine.grade()`. `GradeEngine` echoes back whatever `rulesetPath` it was given as `result.rulesetPath`, so the response field — which is supposed to tell the user which ruleset was applied — instead exposes a meaningless, already-deleted-by-the-time-you-read-it temp file path. + +- [X] T072 [P] Add a case to `packages/api-grade-mcp/tests/integration/grade.test.ts` and `tests/integration/grade-detailed.test.ts`: mock a successful fetch of a configured remote ruleset URL and assert the response's `rulesetPath` equals the configured URL (e.g. `https://raw.githubusercontent.com/.../ruleset.yaml`), and does **not** contain `tmpdir()`'s path or the `api-grade-ruleset-` prefix; confirm this fails before T073 (current behaviour returns the temp path) +- [X] T073 Fix `packages/api-grade-mcp/src/tools/grade.ts` and `grade-detailed.ts`: capture `const configuredRulesetPath = resolved.rulesetPath ?? undefined;` immediately after `resolveRuleset()` runs (before any temp file is written); in the response object, change `...(result.rulesetPath ? { rulesetPath: result.rulesetPath } : {})` to `...(configuredRulesetPath ?? result.rulesetPath ? { rulesetPath: configuredRulesetPath ?? result.rulesetPath } : {})` so a successfully-fetched remote URL or a local custom file path is reported, never the temp file; confirm T072 now passes +- [X] T074 Run the full `packages/api-grade-mcp` test suite (`yarn workspace api-grade-mcp run test:coverage`) and confirm no regressions; update `checklists/issues.md` to check off the Run 4 "`rulesetPath` contains a temporary file" item with a resolution note (root cause + fix) +- [X] T075 [P] Fix the documentation gap behind the Run 4 "`recoveryOption` ... should be an allowable parameter" item: `recoveryOption` **is** already implemented (T030) and documented in `contracts/mcp-tools.md` and `docs/package/api-grade-mcp.md`, but `docs/package/api-reference.md` — which `docs/index.md` lists simply as "Package API Reference" — covers only the `@dawmatt/api-grade-core` library and has no link onward to the MCP tool docs, so a reader who starts there has no way to discover `recoveryOption` exists. Add a note near the top of `docs/package/api-reference.md` clarifying it documents the `@dawmatt/api-grade-core` programmatic API only, and add an entry to its "Further Reading" section linking to `docs/package/api-grade-mcp.md` ("MCP Server Tool Reference — all six MCP tools including `recoveryOption`"); update `checklists/issues.md` to check off the Run 4 `recoveryOption` item with a note that the parameter was already implemented and documented, but the cross-reference from `api-reference.md` was missing and has now been added + +**Checkpoint**: `rulesetPath` in grading responses always identifies the actual configured ruleset source (URL or local path), never an internal temp file; the `recoveryOption` concern is closed out by linking the core-library API reference to the MCP tool reference where it was already documented. + +--- + ## Dependencies & Execution Order ### Phase Dependencies @@ -258,6 +287,8 @@ - **Bug Fix (Phase 11)**: Independent of all other phases (touches only `packages/api-grade-core/src/summariser.ts`); reported in `checklists/issues.md` Run 3 — T052 (test) before T053 (fix) before T054 (full suite + issue close-out) - **Bug Fix (Phase 12)**: Independent of all other phases (touches `packages/api-grade-mcp/src/auth/github.ts` and the four grading tool files); reported in `checklists/issues.md` Run 3 — T055/T056 (tests, parallel) before T057 (classifier fix) before T058 (message fix) before T059 (docs/contract updates) before T060 (full suite + issue close-out) - **Enhancement (Phase 13)**: Independent of all other phases (touches `src/utils/errors.ts`, tool descriptions, and docs); reported in `checklists/issues.md` Run 3 — depends on Phase 12 only in that T061/T062 reference the same failure-response shape; T061 before T062/T063 (parallel) before T064 (checklist + issue close-out) +- **Bug Fix (Phase 14)**: Depends on Phases 12–13 (renames `buildAuthFailureResponse` introduced there and reuses the same `failureReason` values); reported in `checklists/issues.md` Run 4 — T065/T066 (tests, parallel) before T067 (error-code fix) before T068/T069/T070 (docs, parallel) before T071 (full suite + issue close-out) +- **Bug Fix (Phase 15)**: Independent of Phase 14 (touches `src/tools/grade.ts`, `grade-detailed.ts`, and `docs/package/api-reference.md`); reported in `checklists/issues.md` Run 4 — T072 (test) before T073 (fix) before T074 (full suite + issue close-out); T075 (docs cross-link) is independent of T072–T074 and can run in parallel ### User Story Dependencies @@ -284,6 +315,8 @@ - T035–T038, T041–T043 (documentation) can all run in parallel - T055, T056 (Phase 12 tests) can run in parallel — different files - T062, T063 (Phase 13) can run in parallel — different files +- T065, T066 (Phase 14 tests) can run in parallel — different files +- T068, T069, T070 (Phase 14 docs) can all run in parallel — different files --- @@ -350,3 +383,6 @@ After Foundational phase is complete: - Verify T044 manually in each of the three required environments before the feature is considered done (FR-014). - **GitHub 404 ambiguity (Phase 12)**: a `404` from `raw.githubusercontent.com` means either "path does not exist" or "valid path, but the token lacks access to a private repo" — GitHub returns the same status for both to avoid leaking repo existence. T057's `'not-found'` reason and T058's message wording must not claim a definitive cause; T059 documents this limitation rather than attempting to resolve it heuristically. - The duplicate "ruleset details ... `rulesetPath?` ... wasn't [set]" item logged again in `checklists/issues.md` Run 3 is the same defect already fixed by T048–T051 (Phase 10) and covered by regression assertions in `tests/integration/grade.test.ts` / `grade-detailed.test.ts`; no new task is needed — close it out by adding a one-line note in `checklists/issues.md` pointing back to the Run 2 resolution. +- **Phase 14** renames `buildAuthFailureResponse()` to `buildRulesetFetchFailureResponse()` and the `AuthFailureRecoveryResponse` data-model entity to `RulesetFetchFailureResponse` — these names were the root cause of Run 4's confusion (the shape was never auth-specific, it covers every ruleset retrieval failure). T067 must update all four call sites (`grade.ts`, `grade-detailed.ts`, `assert-grade.ts`, `quick-fixes-only.ts`) in the same change to avoid a broken build. +- **Phase 14**'s new `RULESET_INVALID_HOST` code and reused `RULESET_NOT_FOUND` code do not change `failureReason` values or `recoveryOptions` — only the top-level `error` field changes. The `instructions` field (T062) still applies to all three error codes since the recovery options are identical regardless of cause. +- The "`recoveryOption` ... should be an allowable parameter in the request" item logged in `checklists/issues.md` Run 4 is not a missing *implementation* — `recoveryOption` was already added as an optional Zod field on all four grading tools in T030 and is documented in `contracts/mcp-tools.md` and `docs/package/api-grade-mcp.md`. It is, however, a real *discoverability* gap: `docs/package/api-reference.md` (linked from `docs/index.md` as the general "Package API Reference") only covers the `@dawmatt/api-grade-core` library and never links onward to the MCP tool docs, so a reader relying on it alone would not find `recoveryOption` documented anywhere. T075 fixes that gap with a scope note and a cross-reference link rather than a code change. From 186f8941154b34bc6cddbaa7c1b07ef1aa8dc7ed Mon Sep 17 00:00:00 2001 From: DawMatt Date: Sat, 20 Jun 2026 23:51:01 +1000 Subject: [PATCH 19/20] Added Docker image for MCP --- GOAL.md | 14 +++- README.md | 2 + docs/mcp/quick-start.md | 51 ++++++++++++ docs/mcp/troubleshooting.md | 28 +++++++ docs/package/api-grade-mcp.md | 2 + packages/api-grade-mcp/.dockerignore | 6 ++ packages/api-grade-mcp/Dockerfile | 39 +++++++++ packages/api-grade-mcp/package.json | 1 + .../checklists/t030-auth-verification.md | 81 +++++++++++++++++++ specs/007-ai-support/plan.md | 19 ++++- specs/007-ai-support/spec.md | 14 ++++ specs/007-ai-support/tasks.md | 18 +++++ 12 files changed, 272 insertions(+), 3 deletions(-) create mode 100644 packages/api-grade-mcp/.dockerignore create mode 100644 packages/api-grade-mcp/Dockerfile create mode 100644 specs/007-ai-support/checklists/t030-auth-verification.md diff --git a/GOAL.md b/GOAL.md index 3c3b63d..22bbcb1 100644 --- a/GOAL.md +++ b/GOAL.md @@ -64,12 +64,24 @@ Feature 7 - Local AI support - Use the api-grade's JSON format output so the AI is able to process and reformat the information in a way that suits its requirements - Leverage the AI support to not just grade the API, but also resolve the "non-breaking change" issues highlighted by the grading that are bringing down the result - Any local AI tooling support must explicitly include Claude Code and GitHub Copilot +- Add support for rulesets hosted on GitHub private repos (via PAT) and Entra ID protected environments (e.g. SharePoint, OneDrive) +- Support both direct installed and containerised execution of the functionality. -Feature 8 - Remote AI support +Feature 8 - CLI GitHub PAT + +- Add CLI support for rulesets hosted on GitHub private repos (via PAT) + +Feature 9 - Remote AI support - Allow API grading to be performed directly (remotely) from LLMs and agentic AI tooling - Update AI support to include remote access via streamable/HTTP transport - Any remote AI tooling support must explicitly include Claude Code, GitHub Copilot and Copilot Studio +- Support both direct installed and containerised execution of the functionality. + +Feature 10 - Entra and CLI + +- Confirm Entra ID ruleset functionality in MCP is operational, for Entra ID protected environments (e.g. SharePoint, OneDrive) +- Add Entra ID functionality to CLI as well ## Constitution diff --git a/README.md b/README.md index bc4edde..7559e07 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,8 @@ npm install @dawmatt/api-grade-core claude mcp add api-grade -- npx -y @dawmatt/api-grade-mcp ``` +Can also be run via the published Docker image instead of `npx`/`node` — see [Docker invocation](docs/mcp/quick-start.md#run-via-docker). + --- ## Documentation diff --git a/docs/mcp/quick-start.md b/docs/mcp/quick-start.md index 3fe7c35..b511240 100644 --- a/docs/mcp/quick-start.md +++ b/docs/mcp/quick-start.md @@ -28,6 +28,17 @@ Or install globally if you prefer a local binary: npm install -g @dawmatt/api-grade-mcp ``` +### Run via Docker + +If your environment restricts direct `node`/`npx` execution but allows approved container images, run the server as a Docker container instead. Tool behaviour is identical to the `npx`/`node` invocation. + +```sh +docker pull dawmatt/api-grade-mcp +docker run -i --rm -v "$PWD:/workspace" -w /workspace dawmatt/api-grade-mcp +``` + +The `-v "$PWD:/workspace"` bind mount is required — spec and ruleset file paths must resolve inside the container, so mount the directory containing the files you want to grade. The `-i` flag keeps stdin open for the stdio transport (no `-t` needed; this is not an interactive terminal session). + --- ## Configure Your AI Tool @@ -55,6 +66,19 @@ Or add it to `.claude/settings.json` manually: The tools are available immediately in your Claude Code session. +**Via Docker:** + +```json +{ + "mcpServers": { + "api-grade": { + "command": "docker", + "args": ["run", "-i", "--rm", "-v", "${PWD}:/workspace", "-w", "/workspace", "dawmatt/api-grade-mcp"] + } + } +} +``` + ### Claude Desktop 1. Open the configuration file: @@ -76,6 +100,19 @@ The tools are available immediately in your Claude Code session. 3. Restart Claude Desktop. The six api-grade tools will appear in the tools panel. +**Via Docker:** + +```json +{ + "mcpServers": { + "api-grade": { + "command": "docker", + "args": ["run", "-i", "--rm", "-v", "/path/to/your/workspace:/workspace", "-w", "/workspace", "dawmatt/api-grade-mcp"] + } + } +} +``` + ### GitHub Copilot (VS Code Agent mode) Requires VS Code 1.99 or later with the GitHub Copilot extension. @@ -98,6 +135,20 @@ Requires VS Code 1.99 or later with the GitHub Copilot extension. 3. The api-grade tools are now available to Copilot in agent mode. +**Via Docker:** + +```json +{ + "servers": { + "api-grade": { + "type": "stdio", + "command": "docker", + "args": ["run", "-i", "--rm", "-v", "${workspaceFolder}:/workspace", "-w", "/workspace", "dawmatt/api-grade-mcp"] + } + } +} +``` + ### Cursor Create `.cursor/mcp.json` in your project root (or `~/.cursor/mcp.json` for global): diff --git a/docs/mcp/troubleshooting.md b/docs/mcp/troubleshooting.md index fd77ed6..9d9da84 100644 --- a/docs/mcp/troubleshooting.md +++ b/docs/mcp/troubleshooting.md @@ -148,6 +148,34 @@ This is expected behaviour. The server is meant to be started by the AI tool's M --- +## Docker Invocation + +These issues are specific to running the server via `docker run` instead of `npx`/`node` (see [Quick Start](quick-start.md#run-via-docker)). + +**Spec or ruleset file not found (`SPEC_NOT_FOUND` / `RULESET_NOT_FOUND`)** + +**Cause**: Missing or incorrect `-v` bind mount. Inside the container, only the mounted directory is visible — paths must be given relative to `/workspace` (or whatever path you mounted to), not the path on your host machine. + +**Fix**: Confirm the bind mount covers the directory containing your spec/ruleset files, and that the path you pass to the tool matches the path *inside* the container: +```sh +docker run -i --rm -v "$PWD:/workspace" -w /workspace dawmatt/api-grade-mcp +``` +If your spec lives at `./api/openapi.yaml` on the host and you mounted `$PWD:/workspace`, pass `/workspace/api/openapi.yaml` (or the relative path `api/openapi.yaml`, since `-w /workspace` sets the working directory) — not the host's absolute path. + +**Workspace ruleset config not picked up** + +**Cause**: `set-ruleset-config` with `scope: "workspace"` writes `.api-grade/config.json` relative to the container's working directory. If that directory isn't inside the bind-mounted volume, the file is written inside the container's ephemeral filesystem and disappears when the container exits (`--rm`). + +**Fix**: Ensure `.api-grade/config.json` ends up inside the mounted directory by setting `-w` to the mounted path (as in the example above), so the config persists on the host across container runs. + +**Permission denied writing config** + +**Cause**: The container runs as the non-root `node` user (UID 1000). If the host-mounted directory isn't writable by that UID, writes to `.api-grade/config.json` fail. + +**Fix**: Ensure the mounted host directory is writable by UID 1000, e.g. `chmod -R u+w,g+w ` or adjust ownership with `chown`. + +--- + ## Further Reading - [Quick Start](quick-start.md) — initial setup and configuration diff --git a/docs/package/api-grade-mcp.md b/docs/package/api-grade-mcp.md index 9194ae9..5d8f87c 100644 --- a/docs/package/api-grade-mcp.md +++ b/docs/package/api-grade-mcp.md @@ -20,6 +20,8 @@ Or install globally: npm install -g @dawmatt/api-grade-mcp ``` +Alternatively, the server can be run via the published Docker image — see [Docker invocation](../mcp/quick-start.md#run-via-docker) for `docker run` commands and equivalent host configs. + --- ## MCP Host Configuration diff --git a/packages/api-grade-mcp/.dockerignore b/packages/api-grade-mcp/.dockerignore new file mode 100644 index 0000000..fa43e62 --- /dev/null +++ b/packages/api-grade-mcp/.dockerignore @@ -0,0 +1,6 @@ +node_modules +src +tests +*.test.ts +coverage +.git diff --git a/packages/api-grade-mcp/Dockerfile b/packages/api-grade-mcp/Dockerfile new file mode 100644 index 0000000..da62788 --- /dev/null +++ b/packages/api-grade-mcp/Dockerfile @@ -0,0 +1,39 @@ +# Stage 1: Build +FROM node:20-alpine AS builder + +WORKDIR /build + +# Copy workspace manifests before install (workspace-aware layer caching) +COPY package.json package-lock.json ./ +COPY packages/api-grade-core/package.json ./packages/api-grade-core/ +COPY packages/api-grade-mcp/package.json ./packages/api-grade-mcp/ + +RUN npm ci --ignore-scripts + +COPY tsconfig.json ./ +COPY packages/api-grade-core/ ./packages/api-grade-core/ +COPY packages/api-grade-mcp/ ./packages/api-grade-mcp/ + +RUN npm run build --workspace=@dawmatt/api-grade-core +RUN npm run build --workspace=@dawmatt/api-grade-mcp + +# Stage 2: Runtime +FROM node:20-alpine AS runtime + +WORKDIR /app + +# Copy manifests so npm knows about the workspace and installs its deps +COPY package.json package-lock.json ./ +COPY packages/api-grade-core/package.json ./packages/api-grade-core/ +COPY packages/api-grade-mcp/package.json ./packages/api-grade-mcp/ + +RUN npm ci --omit=dev --ignore-scripts + +# Copy compiled output from builder +COPY --from=builder /build/packages/api-grade-core/dist ./packages/api-grade-core/dist +COPY --from=builder /build/packages/api-grade-mcp/dist ./packages/api-grade-mcp/dist + +# Run as non-root user for security +USER node + +ENTRYPOINT ["node", "/app/packages/api-grade-mcp/dist/index.js"] diff --git a/packages/api-grade-mcp/package.json b/packages/api-grade-mcp/package.json index 6c0292f..6090900 100644 --- a/packages/api-grade-mcp/package.json +++ b/packages/api-grade-mcp/package.json @@ -34,6 +34,7 @@ }, "scripts": { "build": "tsc", + "docker:build": "docker build -f Dockerfile -t dawmatt/api-grade-mcp:local ../..", "test": "vitest run", "test:watch": "vitest", "test:coverage": "vitest run --coverage", diff --git a/specs/007-ai-support/checklists/t030-auth-verification.md b/specs/007-ai-support/checklists/t030-auth-verification.md new file mode 100644 index 0000000..780e6ef --- /dev/null +++ b/specs/007-ai-support/checklists/t030-auth-verification.md @@ -0,0 +1,81 @@ +# T030 — Authenticated Ruleset Fetch Verification Checklist + +**Satisfies**: FR-017, FR-019, FR-021, SC-001, SC-008, SC-009 + +**Why this exists**: `src/auth/github.ts` has unit tests (mocked `fetch`). `src/auth/entra.ts` has **no automated tests**. Neither is exercised end-to-end through `grade.ts` / `grade-detailed.ts` / `assert-grade.ts` by any existing test — `recoveryOption`, `RULESET_AUTH_FAILED`, and `ENTRA_AUTH_REQUIRED` are untested in CI. This requires live credentials (a real PAT, a real Entra tenant), so it cannot be automated cheaply — it must be walked through manually before this feature ships. + +**Prerequisites**: +- A private/secured GitHub Enterprise (or github.com private) repo containing a ruleset YAML file, plus a PAT with read access to it. +- A revoked/expired PAT (for the negative case) — easiest is to generate one and immediately revoke it. +- An Entra ID (Azure AD) app registration configured for public client device-code flow, with `tenantId` and `clientId`, and access to a SharePoint/site URL (or any URL) gated behind it. If no real Entra-gated ruleset is available, the device-code prompt itself (steps 6–7) can still be verified without completing the sign-in. + +--- + +## Part A: GitHub PAT — happy path + +1. `set-ruleset-config` with `scope: "session"`, `rulesetPath: ""`, `auth: { type: "github-pat" }`. +2. Either export `GITHUB_TOKEN=` in the MCP server's environment, or confirm the PAT is read correctly per FR-021 (config file never stores the raw token). +3. Call `grade-api` with no `rulesetPath` → expect a normal grade result, with `rulesetSource` indicating the remote ruleset was used (not a fallback to built-in). +4. Call `get-ruleset-config` → confirm `auth.tokenSource: "env-var"` (or `"config-file"` if applicable) and that no raw token value appears anywhere in the response. + +- [x] Remote ruleset fetched successfully using `GITHUB_TOKEN` +- [x] `get-ruleset-config` never leaks the raw token + +## Part B: GitHub PAT — auth failure recovery (the four options) + +5. Unset/replace `GITHUB_TOKEN` with the revoked PAT, repeat the `grade-api` call from step 3. + - [x] Response is `RULESET_AUTH_FAILED`, arriving well within 10 seconds (SC-001), not an unhandled error or silent built-in fallback (SC-008). **Expected `failureReason` is `"not-found"`, not `"auth-failed"`**: `raw.githubusercontent.com` returns a plain `404` for a revoked/invalid token against a private repo (the same response it gives for a genuinely wrong path), so the server cannot distinguish the two cases from the HTTP response alone — see `contracts/mcp-tools.md` `failureReason` table and `checklists/issues.md` Run 3. Only a real `401`/`403` (e.g. a malformed/missing `Authorization` header rejected outright) produces `"auth-failed"`. + - [x] Response includes all four recovery options: `retry`, `use-builtin-once`, `use-builtin-session`, `cancel` + - [x] Response includes an `instructions` field directing the AI to present the recovery options to the user and wait for an explicit choice; **in the conversation transcript, confirm the AI actually surfaced the four options to you rather than silently choosing one itself** (the original Run 3 issue in `checklists/issues.md`) +6. Re-call `grade-api` with `recoveryOption: "use-builtin-once"` → confirm grading proceeds against the built-in ruleset for just this call. +7. Re-call `grade-api` (no recoveryOption) → confirm it still tries the secured ruleset (the override from step 6 was one-shot, not sticky). +8. Re-call `grade-api` with `recoveryOption: "use-builtin-session"` → confirm grading proceeds against the built-in ruleset, then re-call again with no `recoveryOption` → confirm it now uses built-in automatically for the rest of the session. +9. Restore the valid PAT, set `recoveryOption: "retry"` → confirm it re-attempts the secured fetch (30s timeout per FR/spec) and succeeds. +10. Call `grade-api` with `recoveryOption: "cancel"` (while still in a failure state) → confirm `REQUEST_CANCELLED` is returned, not a grade result. + +- [x] `use-builtin-once` falls back for exactly one call +- [x] `use-builtin-session` persists for the remainder of the session +- [x] `retry` re-attempts with the 30s timeout and can recover +- [x] `cancel` returns `REQUEST_CANCELLED` + +## Part C: Network-unreachable case + +11. Point `rulesetPath` at a URL that is unroutable (e.g. an internal-only hostname unreachable from this machine) → confirm `failureReason: "network-unreachable"` and the same four recovery options. + +- [x] Network failure (not just 401/403) also produces structured recovery options + +## Part E: Not-found case (valid host, wrong path, no private-repo ambiguity) + +12. Point `rulesetPath` at a URL on a **public**, reachable host where the path itself is wrong (e.g. a public GitHub raw URL with a typo'd filename) → confirm `failureReason: "not-found"` (not `"network-unreachable"`), a `message` that does not use the word "network", and the same four recovery options. + +- [x] A genuine 404 on a reachable host with no auth in play produces `failureReason: "not-found"`, distinct from both `auth-failed` and `network-unreachable` + +## Part D: Entra ID device-code flow + +13. `set-ruleset-config` with `scope: "session"`, `rulesetPath: ""`, `auth: { type: "entra-id", tenantId: "", clientId: "" }`. +14. Ensure `~/.api-grade/entra-token-cache.json` does not exist (delete it if present) to force a fresh device-code flow. +15. Call `grade-api` → confirm response is `ENTRA_AUTH_REQUIRED` with a `deviceCodeUrl` and `userCode`, arriving promptly (not hanging waiting on user interaction). +16. Complete the device-code sign-in in a browser using the displayed code. +17. Re-call `grade-api` → confirm the previously-cached token is picked up silently (no second device-code prompt) and grading succeeds against the secured ruleset. +18. Restart the MCP server process entirely, re-call `grade-api` → confirm the token cache at `~/.api-grade/entra-token-cache.json` survived the restart and silent acquisition still works (FR-019's persistence requirement). + +- [ ] First call with no cached token returns `ENTRA_AUTH_REQUIRED` with usable device code + verification URL +- [ ] After completing sign-in, subsequent calls succeed silently (cached token reused) +- [ ] Token cache persists across MCP server restarts at `~/.api-grade/entra-token-cache.json` +- [ ] Cache file is written under the home directory only, never into the workspace + +--- + +## Sign-off + +- [x] Part A (PAT happy path) verified +- [x] Part B (PAT recovery options) verified +- [x] Part C (network-unreachable) verified +- [ ] Part D (Entra ID device-code flow) verified +- [x] Part E (not-found) verified + +**Verified by**: Matt +**Date**: 2026/06/20 +**Environment** (Claude Code / VS Code Copilot): VS Code Copilot + +Mark T030 verification complete in `tasks.md` notes once all four parts are checked, and consider adding at minimum a mocked-`fetch`/mocked-MSAL integration test for the `RULESET_AUTH_FAILED` / `ENTRA_AUTH_REQUIRED` paths in `grade.test.ts` so this doesn't regress silently in CI. diff --git a/specs/007-ai-support/plan.md b/specs/007-ai-support/plan.md index 65887b1..dc27d91 100644 --- a/specs/007-ai-support/plan.md +++ b/specs/007-ai-support/plan.md @@ -24,11 +24,15 @@ Deliver a new npm package (`@dawmatt/api-grade-mcp`) that exposes api-grade capa - Node.js built-in `fetch` (Node 20+) — HTTP requests for remote ruleset fetching; no additional HTTP client library required - Node.js built-in `fs/promises` — reading and writing `.api-grade/config.json` workspace and global config files +**Additional Dependencies (Docker Invocation Support)**: +- `node:20-alpine` base image — consistent with the existing root `Dockerfile` (CLI) build pattern; multi-stage build (builder + runtime) to keep the published image small +- No new runtime npm dependencies; the container runs the same compiled `dist/index.js` entry point used by the `npx`/`node` invocation + **Storage**: Primarily stateless per-request. US5 introduces two config file locations: `.api-grade/config.json` in the workspace root (workspace-level default ruleset), and `~/.api-grade/config.json` (global default ruleset). Session-level default is held in memory on the `McpServer` instance. Auth credentials (GitHub PAT, Entra ID tokens) are stored separately from ruleset paths per FR-021. **Testing**: Vitest + `@vitest/coverage-v8` (consistent with existing packages) -**Target Platform**: Node.js 20+ local execution (started by MCP host via `npx` or direct binary) +**Target Platform**: Node.js 20+ local execution (started by MCP host via `npx` or direct binary), OR a Docker container built from `packages/api-grade-mcp/Dockerfile` (started via `docker run -i `, stdio passed through with `-i`). Both invocation mechanisms are equivalent and expose identical tool behaviour (FR-026–FR-028). **Project Type**: MCP server — new fourth package in the monorepo, published to npmjs as `@dawmatt/api-grade-mcp` @@ -74,6 +78,15 @@ Deliver a new npm package (`@dawmatt/api-grade-mcp`) that exposes api-grade capa Tool contracts confirmed to align with `GradeResult` and `Diagnostic` types from `api-grade-core` without requiring changes to the core package. `RulesetConfig`, `AuthConfig`, `SessionState`, `RulesetResolution`, and `AuthFailureRecoveryResponse` are all MCP-layer types defined in `packages/api-grade-mcp/src/`. +**Post-Docker-support re-check** (Docker invocation is purely a packaging/distribution concern): + +| Principle | Status | Notes | +|-----------|--------|-------| +| II. Core-First Architecture | ✅ Pass | Container runs the identical compiled `dist/index.js`; no logic forked between invocation mechanisms | +| V. Cross-Platform & Zero-Cost Prerequisites | ✅ Pass | Docker Desktop/Engine is free; `node`/`npx` remains fully supported with no loss of functionality for users who don't use Docker | +| YAGNI | ✅ Pass | No new transport, no Docker Compose, no separate Docker-specific tool surface — same six MCP tools over stdio | +| AI Integration Requirements | ✅ Pass | Docker is an additional, optional invocation mechanism; FR-014's required verification still targets Claude Code and GitHub Copilot, configured to start the server via either mechanism | + ## Project Structure ### Documentation (this feature) @@ -98,7 +111,7 @@ docs/ │ ├── README.md # UPDATE: add @dawmatt/api-grade-mcp to monorepo packages table │ └── api-grade-mcp.md # UPDATE: add set-ruleset-config + get-ruleset-config tools; add configuration overview; link to docs/mcp/ └── mcp/ # NEW directory — user-facing MCP documentation (FR-025) - ├── quick-start.md # NEW: polished install + host config guide for all 3 required environments + ├── quick-start.md # NEW: polished install + host config guide for all 3 required environments; UPDATE: add Docker invocation alongside npx/node ├── configuration.md # NEW: ruleset configuration reference (3 scopes, config files, GitHub PAT, Entra ID, env vars) └── troubleshooting.md # NEW: auth failure recovery, recovery options walkthrough, token expiry, common setup issues ``` @@ -139,6 +152,8 @@ packages/api-grade-mcp/ │ ├── set-ruleset-config.test.ts # set-ruleset-config tool tests (US5) │ └── get-ruleset-config.test.ts # get-ruleset-config tool tests (US5) ├── package.json # @dawmatt/api-grade-mcp; bin: api-grade-mcp +├── Dockerfile # NEW: multi-stage build producing the Docker image invocation mechanism (FR-027) +├── .dockerignore # NEW: excludes node_modules, tests, src from the build context └── tsconfig.json ``` diff --git a/specs/007-ai-support/spec.md b/specs/007-ai-support/spec.md index c0f5c2e..b134091 100644 --- a/specs/007-ai-support/spec.md +++ b/specs/007-ai-support/spec.md @@ -26,6 +26,11 @@ - Q: What timeout applies when fetching a remote ruleset? → A: 5 seconds on the initial attempt (ensuring the auth-failure recovery response arrives well within SC-001's 10-second budget); 30 seconds when the user explicitly selects the `retry` recovery option (acknowledging they are willing to wait). - Q: How is the `use-builtin-session` recovery choice represented in session state without conflating it with "no default configured"? → A: A separate `sessionRulesetOverride: "builtin" | null` field on `SessionState`. When set to `"builtin"`, all grading tools bypass configured defaults for the remainder of the session. A subsequent `set-ruleset-config scope: session` call with a non-null `rulesetPath` clears the override implicitly; `set-ruleset-config` with `rulesetPath: null` does not clear the override. +### Session 2026-06-20 + +- Q: Some enterprise environments restrict direct `node`/`npx` execution on developer machines (e.g. locked-down package managers, no global Node install) but do allow running approved container images. How should the MCP server be made runnable in that environment? → A: Publish an official Docker image so the server can be started with `docker run` in addition to `node`/`npx`. Both invocation mechanisms expose the identical set of MCP tools over stdio; the container is purely an alternative packaging/distribution mechanism, not an alternative protocol or transport. +- Q: Does the Docker-based invocation change any tool behaviour, schema, or response shape? → A: No. The six MCP tools, their input schemas, and their response shapes are identical regardless of whether the server process was started via `node`, `npx`, or `docker run`. Only the startup command differs. + --- ## User Scenarios & Testing *(mandatory)* @@ -44,6 +49,7 @@ A developer using Claude Code or GitHub Copilot (VS Code) asks their AI tool to 2. **Given** an AI assistant has access to the api-grade capability, **When** it requests a grade for a valid AsyncAPI specification, **Then** it receives equivalent structured results demonstrating multi-format support. 3. **Given** an AI assistant requests a grade for a file path that does not exist, **When** the capability is invoked, **Then** it returns a clear, structured error message the AI can relay to the user. 4. **Given** the MCP server is configured in Claude Code or GitHub Copilot (VS Code Agent mode), **When** an API specification grade is requested in each tool, **Then** the grading capability is successfully invoked and returns a structured result in both environments. +5. **Given** a developer's environment permits running approved Docker images but restricts direct `node`/`npx` execution, **When** the developer configures their AI tool to start the api-grade MCP server via `docker run` instead of `npx`, **Then** the server starts successfully and returns identical structured grading results to the `npx`-based invocation. --- @@ -125,6 +131,7 @@ A developer using an AI assistant not only wants to know which issues are affect - What happens when a default ruleset is configured at multiple levels (session + workspace + global) simultaneously? → The most specific scope wins: session overrides workspace, workspace overrides global. - What happens when the user is on their corporate network initially, sets a workspace default pointing to an enterprise SharePoint ruleset, then disconnects from the VPN mid-session? → The next grading request that tries to use the configured default will fail to fetch the ruleset; the structured recovery options are returned so the user can choose how to proceed. - What happens when a GitHub Enterprise PAT stored in a workspace config file has expired or been revoked? → Authentication fails; structured recovery options are returned with guidance to check the token. +- What happens when the MCP server is started via Docker and needs to grade a spec file or load a workspace config from the host filesystem? → The host's project directory (and, for workspace-scoped ruleset defaults, the `.api-grade/` directory) must be bind-mounted into the container; the documentation MUST show the required `docker run -v` mount so file paths supplied by the AI tool resolve inside the container the same way they would on a direct `node`/`npx` invocation. ## Requirements *(mandatory)* @@ -153,6 +160,9 @@ A developer using an AI assistant not only wants to know which issues are affect - **FR-010**: All MCP tool definitions MUST include complete descriptions, parameter documentation, and example invocations so that AI tools can discover and correctly invoke them without additional configuration. - **FR-011**: The MCP server MUST operate entirely locally (no outbound network calls required for the MCP protocol layer itself) to satisfy the zero-cost prerequisite constraint. - **FR-014**: The MCP server MUST be explicitly verified to function correctly with Claude Code and GitHub Copilot (VS Code Agent mode) as primary supported AI tool targets. An implementation that functions in only one of these environments does not satisfy this requirement. +- **FR-026**: The MCP server MUST be runnable via two equivalent invocation mechanisms, selectable by the user: (1) direct execution on the host via `node`/`npx` (existing behaviour), and (2) execution inside a Docker container via `docker run`. Both mechanisms MUST expose the identical set of MCP tools, input schemas, and response shapes over stdio; the choice of invocation mechanism MUST NOT alter grading behaviour or results. +- **FR-027**: The system MUST publish an official Docker image for `@dawmatt/api-grade-mcp` (built from a `Dockerfile` in the package) so that AI tool hosts can be configured to start the server with `docker run -i ` (stdio passed through with `-i`) instead of `npx`. +- **FR-028**: The Docker-based invocation documentation MUST describe how to bind-mount the host's workspace directory into the container so that file paths supplied by the AI tool (spec paths, custom ruleset paths, `.api-grade/config.json`) resolve correctly inside the container, consistent with FR-015's workspace-config resolution behaviour. ### Key Entities @@ -166,6 +176,7 @@ A developer using an AI assistant not only wants to know which issues are affect - **Default Ruleset Configuration**: A persisted or in-memory setting that designates the ruleset to use when no per-request `rulesetPath` is supplied. Exists at three scopes — session (in-memory), workspace (`.api-grade/config.json`), and global (`~/.api-grade/config.json`) — with session taking precedence over workspace, and workspace over global. - **Auth Configuration**: Optional credentials (GitHub PAT, Entra ID tenant/client IDs) associated with a Default Ruleset Configuration that allow the MCP server to fetch rulesets from secured locations. Stored separately from ruleset paths to support safe source-control practices. - **Auth Failure Recovery**: The structured response returned when a configured default ruleset cannot be fetched due to an authentication, authorisation, or network failure. Contains the failure reason and four recovery options: retry, use built-in default for this request, use built-in default for this session, or cancel. +- **Container Image**: The official Docker image distribution of `@dawmatt/api-grade-mcp`, built from a `Dockerfile` and published alongside the npm package. Provides a second, equivalent invocation mechanism (`docker run`) to `node`/`npx`, with identical tool behaviour. ## Success Criteria *(mandatory)* @@ -180,6 +191,7 @@ A developer using an AI assistant not only wants to know which issues are affect - **SC-007**: A developer can configure a workspace-level default ruleset once via `set-ruleset-config`, restart the MCP server, and confirm that all subsequent grading requests in that workspace use the configured ruleset without re-supplying the path. - **SC-008**: When a configured default ruleset requires authentication and credentials are unavailable or invalid, 100% of grading requests return the four structured recovery options rather than an unhandled error or silent fallback to the built-in default. - **SC-009**: A developer unfamiliar with the MCP server can configure a workspace-level default ruleset with Entra ID authentication using only the published documentation under `docs/mcp/`, without consulting source code or design artefacts in `specs/`. +- **SC-010**: A developer can start the MCP server via `docker run` instead of `npx`, using only the published Docker invocation documentation, and confirm that a `grade-api` request returns a structured result identical in shape to the `npx`-based invocation for the same input file. ## Assumptions @@ -194,3 +206,5 @@ A developer using an AI assistant not only wants to know which issues are affect - All prerequisites for AI integration (e.g., tool registration, model access) have zero monetary cost, consistent with the project's cross-platform zero-cost prerequisite principle. - The MCP server supports concurrent requests; multiple grading operations may run simultaneously, bounded only by available system resources. The core grading logic is stateless with respect to individual requests. - The feature builds on the existing api-grade-core package and does not require changes to the core grading algorithm. +- Docker is an alternative invocation/packaging mechanism only. It does not introduce a new transport (still stdio, piped through `docker run -i`), does not change tool schemas or responses, and does not relax the zero-cost prerequisite (Docker Engine/Desktop is free for the relevant use cases; users who cannot or do not want to install Docker continue to use `node`/`npx` with no loss of functionality). +- Publishing the Docker image to a public registry (e.g. Docker Hub, GHCR) is in scope for documentation purposes (the quick-start guide shows `docker run` against a published image), but operating or maintaining the registry account/CI publish pipeline is an infrastructure concern tracked outside this spec. diff --git a/specs/007-ai-support/tasks.md b/specs/007-ai-support/tasks.md index e6aca3d..845184c 100644 --- a/specs/007-ai-support/tasks.md +++ b/specs/007-ai-support/tasks.md @@ -270,6 +270,23 @@ --- +## Phase 16: Enhancement — Docker Container as an Alternative Invocation Mechanism (FR-026–FR-028) + +**Purpose**: Let environments that restrict direct `node`/`npx` execution (but allow approved container images) run the api-grade MCP server via `docker run` instead, with identical tool behaviour. This is a packaging/distribution addition only — no MCP tool, schema, or response changes. + +- [X] T076 [P] Create `packages/api-grade-mcp/Dockerfile`: multi-stage build following the pattern of the root `Dockerfile` (CLI) — stage 1 (`node:20-alpine` builder) copies workspace manifests, runs `npm ci --ignore-scripts`, copies `tsconfig.json`/`src`/`packages/api-grade-core`, runs `npm run build`; stage 2 (`node:20-alpine` runtime) installs production deps only, copies compiled `dist/` from both `api-grade-mcp` and `api-grade-core`, runs as the non-root `node` user, `ENTRYPOINT ["node", "/app/dist/index.js"]` (no `CMD` args — stdio transport takes none) +- [X] T077 [P] Create `packages/api-grade-mcp/.dockerignore` excluding `node_modules`, `src`, `tests`, `*.test.ts`, `coverage`, `.git` from the build context +- [X] T078 Build the image locally (`docker build -t api-grade-mcp:test packages/api-grade-mcp -f packages/api-grade-mcp/Dockerfile `) and verify with a smoke test: run `docker run -i --rm -v "$PWD/tests/fixtures:/workspace:ro" -w /workspace api-grade-mcp:test`, send a minimal MCP `initialize` + `tools/list` JSON-RPC message over stdin, and confirm the six tool names are returned in the response before T079 documentation is written +- [X] T079 [P] Update `docs/mcp/quick-start.md`: add a "Run via Docker" subsection (after the existing `npx`/global-install Installation section) showing `docker pull ` / `docker run -i --rm -v "$PWD:/workspace" -w /workspace `, and add the equivalent `command: "docker"` / `args` block for each of the three host configs (Claude Code `.claude/settings.json`, Claude Desktop `claude_desktop_config.json`, GitHub Copilot `.vscode/mcp.json`) alongside the existing `npx` examples, explicitly noting the bind mount is required so spec/ruleset file paths resolve inside the container (FR-028) +- [X] T080 [P] Update `docs/mcp/troubleshooting.md`: add a "Docker invocation" section covering: spec/ruleset file not found (missing or incorrect `-v` bind mount; paths must be relative to the mounted `/workspace`, not the host path), workspace ruleset config not picked up (`.api-grade/config.json` must live inside the mounted directory), and permission-denied writing config (container runs as non-root `node` user; host-mounted directory must be writable by that UID) +- [X] T081 Update `README.md` Components section and `docs/package/api-grade-mcp.md`: note that the MCP server can be run via `npx`/`node` or via the published Docker image, linking to `docs/mcp/quick-start.md` for the Docker invocation steps +- [X] T082 [P] Add a `docker:build` script to `packages/api-grade-mcp/package.json` (`docker build -f Dockerfile -t dawmatt/api-grade-mcp:local ../..`) for local verification convenience; no CI quality-gate change required (image publishing is a release-time concern, not part of `npm run test:coverage` / `npm run build`) +- [X] T083 Run the full `packages/api-grade-mcp` test suite (`yarn workspace api-grade-mcp run test:coverage`) plus `npm run build --workspaces --if-present` to confirm the new Dockerfile/.dockerignore additions don't break the existing quality gate; re-run the T078 smoke test against the rebuilt image and confirm `grade-api` returns a result for a sample spec identical in shape to the `npx`-based invocation (SC-010) + +**Checkpoint**: The MCP server can be started via `docker run` with documented bind-mount setup and returns identical tool results to the `node`/`npx` invocation; no existing tool behaviour, schema, or quality-gate script changed. + +--- + ## Dependencies & Execution Order ### Phase Dependencies @@ -386,3 +403,4 @@ After Foundational phase is complete: - **Phase 14** renames `buildAuthFailureResponse()` to `buildRulesetFetchFailureResponse()` and the `AuthFailureRecoveryResponse` data-model entity to `RulesetFetchFailureResponse` — these names were the root cause of Run 4's confusion (the shape was never auth-specific, it covers every ruleset retrieval failure). T067 must update all four call sites (`grade.ts`, `grade-detailed.ts`, `assert-grade.ts`, `quick-fixes-only.ts`) in the same change to avoid a broken build. - **Phase 14**'s new `RULESET_INVALID_HOST` code and reused `RULESET_NOT_FOUND` code do not change `failureReason` values or `recoveryOptions` — only the top-level `error` field changes. The `instructions` field (T062) still applies to all three error codes since the recovery options are identical regardless of cause. - The "`recoveryOption` ... should be an allowable parameter in the request" item logged in `checklists/issues.md` Run 4 is not a missing *implementation* — `recoveryOption` was already added as an optional Zod field on all four grading tools in T030 and is documented in `contracts/mcp-tools.md` and `docs/package/api-grade-mcp.md`. It is, however, a real *discoverability* gap: `docs/package/api-reference.md` (linked from `docs/index.md` as the general "Package API Reference") only covers the `@dawmatt/api-grade-core` library and never links onward to the MCP tool docs, so a reader relying on it alone would not find `recoveryOption` documented anywhere. T075 fixes that gap with a scope note and a cross-reference link rather than a code change. +- **Phase 16** (Docker) is purely additive: it introduces no new MCP tool, no schema change, and no change to any existing test. The Dockerfile reuses the compiled `dist/` output already produced by the existing `build` script, mirroring the pattern of the root `Dockerfile` (CLI). Do not duplicate build logic in the Dockerfile — it must `npm run build` the same way CI does, so the two never drift. From bb88985dd55056618490e126aa21581e4fa7582f Mon Sep 17 00:00:00 2001 From: DawMatt Date: Sat, 20 Jun 2026 23:51:32 +1000 Subject: [PATCH 20/20] chore: release v0.2.0 --- package.json | 2 +- packages/api-grade-core/package.json | 2 +- packages/backstage-plugin-api-grade-backend/package.json | 2 +- packages/backstage-plugin-api-grade/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index a3212e6..d0d30d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dawmatt/api-grade", - "version": "0.1.20", + "version": "0.2.0", "description": "Grade API quality and share diagnostics using Spectral-compatible linting", "keywords": [ "api", diff --git a/packages/api-grade-core/package.json b/packages/api-grade-core/package.json index c78ee25..c8ea26f 100644 --- a/packages/api-grade-core/package.json +++ b/packages/api-grade-core/package.json @@ -1,6 +1,6 @@ { "name": "@dawmatt/api-grade-core", - "version": "0.1.20", + "version": "0.2.0", "description": "Core grading library for api-grade — standalone, framework-agnostic", "keywords": [ "api", diff --git a/packages/backstage-plugin-api-grade-backend/package.json b/packages/backstage-plugin-api-grade-backend/package.json index 53195fb..849afc9 100644 --- a/packages/backstage-plugin-api-grade-backend/package.json +++ b/packages/backstage-plugin-api-grade-backend/package.json @@ -1,6 +1,6 @@ { "name": "@dawmatt/backstage-plugin-api-grade-backend", - "version": "0.1.20", + "version": "0.2.0", "description": "Backstage backend plugin — grades API entity specs and returns results via HTTP", "keywords": [ "backstage", diff --git a/packages/backstage-plugin-api-grade/package.json b/packages/backstage-plugin-api-grade/package.json index 40886bb..f048041 100644 --- a/packages/backstage-plugin-api-grade/package.json +++ b/packages/backstage-plugin-api-grade/package.json @@ -1,6 +1,6 @@ { "name": "@dawmatt/backstage-plugin-api-grade", - "version": "0.1.20", + "version": "0.2.0", "description": "Backstage frontend plugin — displays API quality grades on API entity pages", "keywords": [ "backstage",