diff --git a/README.md b/README.md
index b4a8463..622a786 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
[](https://www.npmjs.com/package/@framework-doctor/cli)
[](https://www.npmjs.com/package/@framework-doctor/cli)
-Framework Doctor auto-detects your framework and runs the right health check. Supports **Svelte**, **React**, and **Vue**; Angular coming soon.
+Framework Doctor auto-detects your framework and runs the right health check. Supports **Svelte**, **React**, **Vue**, and **Angular**.
## Quick start
@@ -19,6 +19,7 @@ Or run a specific doctor directly:
npx -y @framework-doctor/react . # React
npx -y @framework-doctor/svelte . # Svelte
npx -y @framework-doctor/vue . # Vue
+npx -y @framework-doctor/angular . # Angular
```
## Try it
@@ -66,6 +67,15 @@ See [examples/README.md](examples/README.md) for more demo projects and commands
- `npx -y @framework-doctor/svelte . --diff main` - scan only files changed against `main`.
- `npx -y @framework-doctor/svelte . --project web` - select a specific workspace package.
+**Angular (direct):**
+
+- `npx -y @framework-doctor/angular .` - run a full scan
+- `npx -y @framework-doctor/angular ./path/to/project` - scan a specific project directory
+- `npx -y @framework-doctor/angular . --verbose` - include file and line details
+- `npx -y @framework-doctor/angular . --score` - print only the numeric score (CI-friendly)
+- `npx -y @framework-doctor/angular . --diff main` - scan only files changed against `main`
+- `npx -y @framework-doctor/angular . --project my-app` - select a specific workspace project
+
## Options
Svelte doctor:
@@ -90,6 +100,8 @@ Options:
React doctor options: `--no-lint`, `--no-dead-code`, `--verbose`, `--score`, `--no-analytics`, `--project`, `--diff`, `--offline`. See [packages/react-doctor/README.md](packages/react-doctor/README.md).
+Angular doctor options: `--no-lint`, `--no-dead-code`, `--verbose`, `--score`, `--no-analytics`, `--project`, `--diff`, `--offline`. See [packages/angular-doctor/README.md](packages/angular-doctor/README.md).
+
## Security checks
Svelte Doctor includes a security scan that flags:
@@ -104,7 +116,7 @@ To ignore a rule: `"svelte-doctor/no-at-html"`, `"svelte-doctor/no-new-function"
## Analytics
-Both doctors optionally send anonymous usage data when you opt in. Data is stored in your Supabase (see [supabase/README.md](supabase/README.md)). If your function enforces `TELEMETRY_KEY`, set `FRAMEWORK_DOCTOR_TELEMETRY_KEY` in the client environment. To disable: `--no-analytics`, `"analytics": false` in config, or `DO_NOT_TRACK=1`.
+The doctors optionally send anonymous usage data when you opt in. Data is stored in your Supabase (see [supabase/README.md](supabase/README.md)). If your function enforces `TELEMETRY_KEY`, set `FRAMEWORK_DOCTOR_TELEMETRY_KEY` in the client environment. To disable: `--no-analytics`, `"analytics": false` in config, or `DO_NOT_TRACK=1`.
## Configuration
diff --git a/action.yml b/action.yml
index efc5ce7..cf2a65c 100644
--- a/action.yml
+++ b/action.yml
@@ -36,10 +36,10 @@ runs:
INPUT_VERBOSE: ${{ inputs.verbose }}
INPUT_PROJECT: ${{ inputs.project }}
run: |
- FLAGS=""
- if [ "$INPUT_VERBOSE" = "true" ]; then FLAGS="$FLAGS --verbose"; fi
- if [ -n "$INPUT_PROJECT" ]; then FLAGS="$FLAGS --project $INPUT_PROJECT"; fi
- npx -y @framework-doctor/svelte "$INPUT_DIRECTORY" $FLAGS
+ ARGS=("$INPUT_DIRECTORY")
+ if [ "$INPUT_VERBOSE" = "true" ]; then ARGS+=(--verbose); fi
+ if [ -n "$INPUT_PROJECT" ]; then ARGS+=(--project "$INPUT_PROJECT"); fi
+ npx -y @framework-doctor/svelte "${ARGS[@]}"
- id: score
shell: bash
diff --git a/examples/README.md b/examples/README.md
index 4c4cb4c..be3f89a 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -40,3 +40,51 @@ npx -y @framework-doctor/cli examples/svelte/demo-app
- **Score** — A 0–100 health score for the project
Add `--verbose` to see file and line details for each finding.
+
+## Vue: demo-app
+
+A minimal Vue 3 + Vite app with intentional issues. See [vue/demo-app/README.md](vue/demo-app/README.md) for details.
+
+### Run from the repo
+
+```bash
+pnpm build
+pnpm exec framework-doctor examples/vue/demo-app
+# Or: pnpm exec vue-doctor examples/vue/demo-app
+```
+
+### Run with npx
+
+```bash
+npx -y @framework-doctor/cli examples/vue/demo-app
+```
+
+### What to expect
+
+- **Errors** — Security (v-html, eval, new Function, implied eval), accessibility
+- **Warnings** — Dead code, lint issues
+- **Score** — 0–100 health score
+
+## Angular: demo-app
+
+A minimal Angular app with intentional issues. See [angular/demo-app/README.md](angular/demo-app/README.md) for details.
+
+### Run from the repo
+
+```bash
+pnpm build
+pnpm exec framework-doctor examples/angular/demo-app
+# Or: pnpm exec angular-doctor examples/angular/demo-app
+```
+
+### Run with npx
+
+```bash
+npx -y @framework-doctor/cli examples/angular/demo-app
+```
+
+### What to expect
+
+- **Errors** — Security (eval, innerHTML, bypassSecurityTrust*)
+- **Warnings** — Dead code, lint issues
+- **Score** — 0–100 health score
diff --git a/examples/angular/demo-app/.editorconfig b/examples/angular/demo-app/.editorconfig
new file mode 100644
index 0000000..f166060
--- /dev/null
+++ b/examples/angular/demo-app/.editorconfig
@@ -0,0 +1,17 @@
+# Editor configuration, see https://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.ts]
+quote_type = single
+ij_typescript_use_double_quotes = false
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false
diff --git a/examples/angular/demo-app/.gitignore b/examples/angular/demo-app/.gitignore
new file mode 100644
index 0000000..cc7b141
--- /dev/null
+++ b/examples/angular/demo-app/.gitignore
@@ -0,0 +1,42 @@
+# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files.
+
+# Compiled output
+/dist
+/tmp
+/out-tsc
+/bazel-out
+
+# Node
+/node_modules
+npm-debug.log
+yarn-error.log
+
+# IDEs and editors
+.idea/
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# Visual Studio Code
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+.history/*
+
+# Miscellaneous
+/.angular/cache
+.sass-cache/
+/connect.lock
+/coverage
+/libpeerconnection.log
+testem.log
+/typings
+
+# System files
+.DS_Store
+Thumbs.db
diff --git a/examples/angular/demo-app/README.md b/examples/angular/demo-app/README.md
new file mode 100644
index 0000000..2ace27e
--- /dev/null
+++ b/examples/angular/demo-app/README.md
@@ -0,0 +1,29 @@
+# Framework Doctor Angular Demo
+
+A minimal Angular app with **intentional issues** for testing [Framework Doctor](https://github.com/pitis/framework-doctor).
+
+## Run the doctor
+
+From the framework-doctor repo root (after `pnpm install` and `pnpm build`):
+
+```bash
+pnpm exec framework-doctor examples/angular/demo-app
+# or directly:
+pnpm exec angular-doctor examples/angular/demo-app
+```
+
+## Intentional issues
+
+- **Security** — `eval()`, `bypassSecurityTrustHtml()` in `src/lib/security-test.ts`
+- **Dead code** — Unused exports (if present)
+- **Lint** — Various ESLint / Angular ESLint findings
+
+## Develop
+
+This project was generated with [Angular CLI](https://github.com/angular/angular-cli). To run the dev server:
+
+```bash
+ng serve
+```
+
+Open `http://localhost:4200/`. For code scaffolding, build, and tests see the [Angular CLI Overview](https://angular.dev/tools/cli).
diff --git a/examples/angular/demo-app/angular.json b/examples/angular/demo-app/angular.json
new file mode 100644
index 0000000..06cc9a8
--- /dev/null
+++ b/examples/angular/demo-app/angular.json
@@ -0,0 +1,57 @@
+{
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+ "version": 1,
+ "newProjectRoot": "projects",
+ "projects": {
+ "demo-app": {
+ "projectType": "application",
+ "schematics": {
+ "@schematics/angular:component": {
+ "style": "css",
+ "standalone": true
+ }
+ },
+ "root": "",
+ "sourceRoot": "src",
+ "prefix": "app",
+ "architect": {
+ "build": {
+ "builder": "@angular-devkit/build-angular:application",
+ "options": {
+ "outputPath": "dist/demo-app",
+ "index": "src/index.html",
+ "browser": "src/main.ts",
+ "polyfills": ["zone.js"],
+ "tsConfig": "tsconfig.app.json",
+ "assets": ["src/favicon.ico", "src/assets"],
+ "styles": ["src/styles.css"],
+ "scripts": []
+ },
+ "configurations": {
+ "production": {
+ "budgets": [
+ { "type": "initial", "maximumWarning": "500kb", "maximumError": "1mb" },
+ { "type": "anyComponentStyle", "maximumWarning": "2kb", "maximumError": "4kb" }
+ ],
+ "outputHashing": "all"
+ },
+ "development": {
+ "optimization": false,
+ "extractLicenses": false,
+ "sourceMap": true
+ }
+ },
+ "defaultConfiguration": "production"
+ },
+ "serve": {
+ "builder": "@angular-devkit/build-angular:dev-server",
+ "configurations": {
+ "production": { "buildTarget": "demo-app:build:production" },
+ "development": { "buildTarget": "demo-app:build:development" }
+ },
+ "defaultConfiguration": "development"
+ }
+ }
+ }
+ }
+}
diff --git a/examples/angular/demo-app/package.json b/examples/angular/demo-app/package.json
new file mode 100644
index 0000000..0acba05
--- /dev/null
+++ b/examples/angular/demo-app/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "framework-doctor-angular-demo",
+ "version": "1.0.0",
+ "private": true,
+ "description": "Demo Angular app for Framework Doctor - includes intentional issues",
+ "type": "module",
+ "scripts": {
+ "ng": "ng",
+ "start": "ng serve",
+ "build": "ng build",
+ "watch": "ng build --watch"
+ },
+ "dependencies": {
+ "@angular/animations": "^19.0.0",
+ "@angular/common": "^19.0.0",
+ "@angular/compiler": "^19.0.0",
+ "@angular/core": "^19.0.0",
+ "@angular/forms": "^19.0.0",
+ "@angular/platform-browser": "^19.0.0",
+ "@angular/platform-browser-dynamic": "^19.0.0",
+ "rxjs": "~7.8.0",
+ "tslib": "^2.3.0",
+ "zone.js": "~0.15.0"
+ },
+ "devDependencies": {
+ "@angular-devkit/build-angular": "^19.0.0",
+ "@angular/cli": "^19.0.0",
+ "@angular/compiler-cli": "^19.0.0",
+ "@types/node": "^20.0.0",
+ "typescript": "~5.6.0"
+ },
+ "packageManager": "pnpm@10.30.0"
+}
diff --git a/examples/angular/demo-app/src/app/app.component.css b/examples/angular/demo-app/src/app/app.component.css
new file mode 100644
index 0000000..9e2121e
--- /dev/null
+++ b/examples/angular/demo-app/src/app/app.component.css
@@ -0,0 +1,19 @@
+.container {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 2rem;
+ font-family: system-ui, sans-serif;
+}
+
+.example {
+ margin: 1rem 0;
+ padding: 1rem;
+ border: 1px solid #e0e0e0;
+ border-radius: 8px;
+}
+
+hr {
+ margin: 2rem 0;
+ border: none;
+ border-top: 1px solid #e0e0e0;
+}
diff --git a/examples/angular/demo-app/src/app/app.component.html b/examples/angular/demo-app/src/app/app.component.html
new file mode 100644
index 0000000..107993e
--- /dev/null
+++ b/examples/angular/demo-app/src/app/app.component.html
@@ -0,0 +1,17 @@
+
+
Framework Doctor Angular Demo
+
A minimal Angular app with intentional issues for angular-doctor testing.
+
+
+
+
+
+
+
angular-doctor test section (intentional issues)
+
+
diff --git a/examples/angular/demo-app/src/app/app.component.ts b/examples/angular/demo-app/src/app/app.component.ts
new file mode 100644
index 0000000..4398825
--- /dev/null
+++ b/examples/angular/demo-app/src/app/app.component.ts
@@ -0,0 +1,18 @@
+import { Component } from '@angular/core';
+import { DoctorTestComponent } from './doctor-test.component';
+
+@Component({
+ selector: 'app-root',
+ standalone: true,
+ imports: [DoctorTestComponent],
+ templateUrl: './app.component.html',
+ styleUrl: './app.component.css',
+})
+export default class AppComponent {
+ darkMode = false;
+ userRenderedContent = '
';
+
+ toggleDarkMode(): void {
+ this.darkMode = !this.darkMode;
+ }
+}
diff --git a/examples/angular/demo-app/src/app/app.config.ts b/examples/angular/demo-app/src/app/app.config.ts
new file mode 100644
index 0000000..034603c
--- /dev/null
+++ b/examples/angular/demo-app/src/app/app.config.ts
@@ -0,0 +1,5 @@
+import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';
+
+export const appConfig: ApplicationConfig = {
+ providers: [provideZoneChangeDetection({ eventCoalescing: true })],
+};
diff --git a/examples/angular/demo-app/src/app/doctor-test.component.ts b/examples/angular/demo-app/src/app/doctor-test.component.ts
new file mode 100644
index 0000000..7e87bdd
--- /dev/null
+++ b/examples/angular/demo-app/src/app/doctor-test.component.ts
@@ -0,0 +1,10 @@
+import { Component, input } from '@angular/core';
+
+@Component({
+ selector: 'app-doctor-test',
+ standalone: true,
+ template: ``,
+})
+export class DoctorTestComponent {
+ label = input.required();
+}
diff --git a/examples/angular/demo-app/src/favicon.ico b/examples/angular/demo-app/src/favicon.ico
new file mode 100644
index 0000000..48cdce8
--- /dev/null
+++ b/examples/angular/demo-app/src/favicon.ico
@@ -0,0 +1 @@
+placeholder
diff --git a/examples/angular/demo-app/src/index.html b/examples/angular/demo-app/src/index.html
new file mode 100644
index 0000000..cfec8d0
--- /dev/null
+++ b/examples/angular/demo-app/src/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ Framework Doctor Angular Demo
+
+
+
+
+
+
+
+
diff --git a/examples/angular/demo-app/src/lib/orphan-utils.ts b/examples/angular/demo-app/src/lib/orphan-utils.ts
new file mode 100644
index 0000000..fda26d6
--- /dev/null
+++ b/examples/angular/demo-app/src/lib/orphan-utils.ts
@@ -0,0 +1,8 @@
+/**
+ * INTENTIONAL: Unused file for angular-doctor testing.
+ * This file is not imported anywhere - knip will report it as unused.
+ */
+
+export const ORPHAN_CONSTANT = 42;
+
+export const orphanHelper = (value: number): number => value * 2;
diff --git a/examples/angular/demo-app/src/lib/security-test.ts b/examples/angular/demo-app/src/lib/security-test.ts
new file mode 100644
index 0000000..529e3d5
--- /dev/null
+++ b/examples/angular/demo-app/src/lib/security-test.ts
@@ -0,0 +1,18 @@
+/**
+ * INTENTIONAL SECURITY ISSUES for angular-doctor testing.
+ * These are dangerous patterns that should be flagged by linters.
+ */
+
+import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
+
+export const dangerousEval = (userInput: string): unknown => eval(userInput);
+
+export const dangerousFunction = (userCode: string): (() => void) =>
+ new Function(userCode) as () => void;
+
+export const dangerousTimeout = (): void => {
+ setTimeout("console.log('arbitrary code')", 100);
+};
+
+export const dangerousBypass = (sanitizer: DomSanitizer, html: string): SafeHtml =>
+ sanitizer.bypassSecurityTrustHtml(html);
diff --git a/examples/angular/demo-app/src/main.ts b/examples/angular/demo-app/src/main.ts
new file mode 100644
index 0000000..7fd1cdd
--- /dev/null
+++ b/examples/angular/demo-app/src/main.ts
@@ -0,0 +1,5 @@
+import { bootstrapApplication } from '@angular/platform-browser';
+import { appConfig } from './app/app.config';
+import AppComponent from './app/app.component';
+
+bootstrapApplication(AppComponent, appConfig);
diff --git a/examples/angular/demo-app/src/styles.css b/examples/angular/demo-app/src/styles.css
new file mode 100644
index 0000000..abe6d10
--- /dev/null
+++ b/examples/angular/demo-app/src/styles.css
@@ -0,0 +1,7 @@
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+}
diff --git a/examples/angular/demo-app/tsconfig.app.json b/examples/angular/demo-app/tsconfig.app.json
new file mode 100644
index 0000000..5b9d3c5
--- /dev/null
+++ b/examples/angular/demo-app/tsconfig.app.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/app",
+ "types": []
+ },
+ "files": ["src/main.ts"],
+ "include": ["src/**/*.d.ts"]
+}
diff --git a/examples/angular/demo-app/tsconfig.json b/examples/angular/demo-app/tsconfig.json
new file mode 100644
index 0000000..730f1a4
--- /dev/null
+++ b/examples/angular/demo-app/tsconfig.json
@@ -0,0 +1,29 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "outDir": "./dist/out-tsc",
+ "strict": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true,
+ "skipLibCheck": true,
+ "isolatedModules": true,
+ "esModuleInterop": true,
+ "sourceMap": true,
+ "declaration": false,
+ "experimentalDecorators": true,
+ "moduleResolution": "bundler",
+ "importHelpers": true,
+ "target": "ES2022",
+ "module": "ES2022",
+ "lib": ["ES2022", "dom"],
+ "useDefineForClassFields": false
+ },
+ "angularCompilerOptions": {
+ "enableI18nLegacyMessageIdFormat": false,
+ "strictInjectionParameters": true,
+ "strictInputAccessModifiers": true,
+ "strictTemplates": true
+ }
+}
diff --git a/examples/angular/demo-app/tsconfig.spec.json b/examples/angular/demo-app/tsconfig.spec.json
new file mode 100644
index 0000000..5fb748d
--- /dev/null
+++ b/examples/angular/demo-app/tsconfig.spec.json
@@ -0,0 +1,15 @@
+/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
+/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/spec",
+ "types": [
+ "jasmine"
+ ]
+ },
+ "include": [
+ "src/**/*.spec.ts",
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/examples/react/demo-app/index.html b/examples/react/demo-app/index.html
new file mode 100644
index 0000000..5a68b77
--- /dev/null
+++ b/examples/react/demo-app/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Framework Doctor React Demo
+
+
+
+
+
+
diff --git a/examples/react/demo-app/package.json b/examples/react/demo-app/package.json
new file mode 100644
index 0000000..aaeb855
--- /dev/null
+++ b/examples/react/demo-app/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "framework-doctor-react-demo",
+ "version": "1.0.0",
+ "private": true,
+ "description": "Demo React app for Framework Doctor - includes intentional issues",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0"
+ },
+ "devDependencies": {
+ "@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
+ "@vitejs/plugin-react": "^4.3.4",
+ "typescript": "^5.0.0",
+ "vite": "^6.0.0"
+ },
+ "packageManager": "pnpm@10.30.0"
+}
diff --git a/examples/react/demo-app/public/favicon.svg b/examples/react/demo-app/public/favicon.svg
new file mode 100644
index 0000000..a6f9e41
--- /dev/null
+++ b/examples/react/demo-app/public/favicon.svg
@@ -0,0 +1 @@
+
diff --git a/examples/react/demo-app/src/App.tsx b/examples/react/demo-app/src/App.tsx
new file mode 100644
index 0000000..744fcd4
--- /dev/null
+++ b/examples/react/demo-app/src/App.tsx
@@ -0,0 +1,30 @@
+import { useState } from 'react';
+import DoctorTestComponent from './components/DoctorTestComponent';
+
+const userRenderedContent = '
';
+
+const App = () => {
+ const [darkMode, setDarkMode] = useState(false);
+
+ return (
+
+
Framework Doctor React Demo
+
A minimal React app with intentional issues for react-doctor testing.
+
+
+
+
+
+
+
react-doctor test section (intentional issues)
+
+
+ );
+};
+
+export default App;
diff --git a/examples/react/demo-app/src/components/DoctorTestComponent.tsx b/examples/react/demo-app/src/components/DoctorTestComponent.tsx
new file mode 100644
index 0000000..002c29e
--- /dev/null
+++ b/examples/react/demo-app/src/components/DoctorTestComponent.tsx
@@ -0,0 +1,9 @@
+interface Props {
+ label: string;
+}
+
+const DoctorTestComponent = ({ label }: Props) => (
+
+);
+
+export default DoctorTestComponent;
diff --git a/examples/react/demo-app/src/lib/SecurityTest.ts b/examples/react/demo-app/src/lib/SecurityTest.ts
new file mode 100644
index 0000000..e26dfb4
--- /dev/null
+++ b/examples/react/demo-app/src/lib/SecurityTest.ts
@@ -0,0 +1,13 @@
+/**
+ * INTENTIONAL SECURITY ISSUES for react-doctor testing.
+ * These are dangerous patterns that should be flagged by linters.
+ */
+
+export const dangerousEval = (userInput: string): unknown => eval(userInput);
+
+export const dangerousFunction = (userCode: string): (() => void) =>
+ new Function(userCode) as () => void;
+
+export const dangerousTimeout = (): void => {
+ setTimeout("console.log('arbitrary code')", 100);
+};
diff --git a/examples/react/demo-app/src/lib/orphanUtils.ts b/examples/react/demo-app/src/lib/orphanUtils.ts
new file mode 100644
index 0000000..33c594f
--- /dev/null
+++ b/examples/react/demo-app/src/lib/orphanUtils.ts
@@ -0,0 +1,8 @@
+/**
+ * INTENTIONAL: Unused file for react-doctor testing.
+ * This file is not imported anywhere - knip will report it as unused.
+ */
+
+export const ORPHAN_CONSTANT = 42;
+
+export const orphanHelper = (value: number): number => value * 2;
diff --git a/examples/react/demo-app/src/main.tsx b/examples/react/demo-app/src/main.tsx
new file mode 100644
index 0000000..7fabfa8
--- /dev/null
+++ b/examples/react/demo-app/src/main.tsx
@@ -0,0 +1,10 @@
+import { StrictMode } from 'react';
+import { createRoot } from 'react-dom/client';
+import App from './App';
+import './style.css';
+
+createRoot(document.getElementById('root')!).render(
+
+
+ ,
+);
diff --git a/examples/react/demo-app/src/style.css b/examples/react/demo-app/src/style.css
new file mode 100644
index 0000000..846a77c
--- /dev/null
+++ b/examples/react/demo-app/src/style.css
@@ -0,0 +1,13 @@
+#root {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 2rem;
+ font-family: system-ui, sans-serif;
+}
+
+.example {
+ margin: 1rem 0;
+ padding: 1rem;
+ border: 1px solid #e0e0e0;
+ border-radius: 8px;
+}
diff --git a/examples/react/demo-app/src/vite-env.d.ts b/examples/react/demo-app/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/examples/react/demo-app/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/examples/react/demo-app/tsconfig.json b/examples/react/demo-app/tsconfig.json
new file mode 100644
index 0000000..d343a63
--- /dev/null
+++ b/examples/react/demo-app/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src/**/*.ts", "src/**/*.tsx"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/examples/react/demo-app/tsconfig.node.json b/examples/react/demo-app/tsconfig.node.json
new file mode 100644
index 0000000..494bfe0
--- /dev/null
+++ b/examples/react/demo-app/tsconfig.node.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler"
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/examples/react/demo-app/vite.config.d.ts b/examples/react/demo-app/vite.config.d.ts
new file mode 100644
index 0000000..340562a
--- /dev/null
+++ b/examples/react/demo-app/vite.config.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import("vite").UserConfig;
+export default _default;
diff --git a/examples/react/demo-app/vite.config.js b/examples/react/demo-app/vite.config.js
new file mode 100644
index 0000000..5129e81
--- /dev/null
+++ b/examples/react/demo-app/vite.config.js
@@ -0,0 +1,5 @@
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+export default defineConfig({
+ plugins: [react()],
+});
diff --git a/examples/react/demo-app/vite.config.ts b/examples/react/demo-app/vite.config.ts
new file mode 100644
index 0000000..0466183
--- /dev/null
+++ b/examples/react/demo-app/vite.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+
+export default defineConfig({
+ plugins: [react()],
+});
diff --git a/package.json b/package.json
index a5f2f52..9a9434f 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,9 @@
"changeset": "changeset",
"version": "changeset version",
"release": "pnpm build && changeset publish",
- "prepare": "husky"
+ "prepare": "husky",
+ "demo:angular": "pnpm build && pnpm exec framework-doctor examples/angular/demo-app",
+ "demo:react": "pnpm build && pnpm exec framework-doctor examples/react/demo-app"
},
"devDependencies": {
"@framework-doctor/cli": "workspace:*",
diff --git a/packages/angular-doctor/.oxlintrc.json b/packages/angular-doctor/.oxlintrc.json
new file mode 100644
index 0000000..3a6f2ad
--- /dev/null
+++ b/packages/angular-doctor/.oxlintrc.json
@@ -0,0 +1 @@
+{ "plugins": ["typescript", "import"], "rules": {} }
diff --git a/packages/angular-doctor/CHANGELOG.md b/packages/angular-doctor/CHANGELOG.md
new file mode 100644
index 0000000..855c00c
--- /dev/null
+++ b/packages/angular-doctor/CHANGELOG.md
@@ -0,0 +1,9 @@
+# @framework-doctor/angular
+
+## 1.0.4
+
+### Patch Changes
+
+- angular doctor
+- Updated dependencies
+ - @framework-doctor/core@1.0.4
diff --git a/packages/angular-doctor/README.md b/packages/angular-doctor/README.md
new file mode 100644
index 0000000..af9eac1
--- /dev/null
+++ b/packages/angular-doctor/README.md
@@ -0,0 +1,105 @@
+# Angular Doctor
+
+[](https://npmjs.com/package/@framework-doctor/angular)
+[](https://npmjs.com/package/@framework-doctor/angular)
+
+Diagnose and improve your Angular codebase health.
+
+One command scans your codebase for security, performance, correctness, and dead code issues, then outputs a **0–100 score** with actionable diagnostics.
+
+## Install
+
+Run at your project root:
+
+```bash
+npx -y @framework-doctor/angular .
+```
+
+Or use the unified CLI (auto-detects Angular):
+
+```bash
+npx -y @framework-doctor/cli .
+```
+
+## Options
+
+```
+Usage: angular-doctor [directory] [options]
+
+Options:
+ -v, --version display the version number
+ --no-lint skip linting
+ --no-dead-code skip dead code detection
+ --verbose show file details per rule
+ --score output only the score (CI-friendly)
+ -y, --yes skip prompts, scan all workspace projects
+ --no-analytics disable anonymous analytics
+ --project select workspace project (comma-separated for multiple)
+ --diff [base] scan only files changed vs base branch
+ --offline skip remote scoring (local score only)
+ -h, --help display help for command
+```
+
+## Configuration
+
+Create `angular-doctor.config.json`:
+
+```json
+{
+ "ignore": {
+ "rules": ["angular-doctor/no-eval", "angular-doctor/no-inner-html-binding"],
+ "files": ["src/generated/**"]
+ },
+ "lint": true,
+ "deadCode": true,
+ "verbose": false,
+ "diff": false,
+ "analytics": true
+}
+```
+
+Or use the `angularDoctor` key in `package.json`:
+
+```json
+{
+ "angularDoctor": {
+ "deadCode": true,
+ "ignore": { "rules": ["angular-doctor/no-eval"] }
+ }
+}
+```
+
+## Security checks
+
+Angular Doctor flags:
+
+- **`eval()`** — Code injection risk
+- **`new Function()`** — Code injection risk
+- **`setTimeout("string")` / `setInterval("string")`** — Implied eval
+- **`innerHTML` binding** — Raw HTML can lead to XSS if content is unsanitized
+- **`bypassSecurityTrust*`** — Bypassing Angular’s sanitizer can lead to XSS
+
+## Analytics
+
+Angular Doctor optionally sends anonymous usage data when you opt in. Data is sent to your Supabase Edge Function (see [supabase/README.md](../../supabase/README.md)) when `FRAMEWORK_DOCTOR_TELEMETRY_URL` is configured. If your function enforces `TELEMETRY_KEY`, set `FRAMEWORK_DOCTOR_TELEMETRY_KEY` in the client environment. Limited to framework type, score range, diagnostic count. No code or paths are collected.
+
+- **Opt-in**: On first run (when analytics is configured), you’ll be prompted. Your choice is stored in `~/.framework-doctor/config.json`.
+- **Disable**: Use `--no-analytics`, set `"analytics": false` in config, or `DO_NOT_TRACK=1`.
+- **Skipped automatically**: CI and other non-interactive environments (e.g. Cursor Agent, Claude Code).
+
+## Contributing
+
+```bash
+git clone https://github.com/pitis/framework-doctor
+cd framework-doctor
+pnpm install
+pnpm build
+```
+
+Run locally:
+
+```bash
+pnpm exec angular-doctor /path/to/your/angular-project
+# or directly:
+node packages/angular-doctor/dist/cli.js /path/to/your/angular-project
+```
diff --git a/packages/angular-doctor/package.json b/packages/angular-doctor/package.json
new file mode 100644
index 0000000..439d3c3
--- /dev/null
+++ b/packages/angular-doctor/package.json
@@ -0,0 +1,89 @@
+{
+ "name": "@framework-doctor/angular",
+ "version": "1.0.4",
+ "description": "Diagnose Angular codebase health",
+ "author": {
+ "name": "Pitis Radu",
+ "url": "https://github.com/pitis"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=9.0.0"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/pitis/framework-doctor.git",
+ "directory": "packages/angular-doctor"
+ },
+ "homepage": "https://github.com/pitis/framework-doctor/tree/main/packages/angular-doctor#readme",
+ "bugs": {
+ "url": "https://github.com/pitis/framework-doctor/issues"
+ },
+ "keywords": [
+ "diagnostics",
+ "linter",
+ "angular",
+ "performance",
+ "cli",
+ "code-health",
+ "dead-code",
+ "quality"
+ ],
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/pitis"
+ },
+ "type": "module",
+ "bin": {
+ "angular-doctor": "./dist/cli.js"
+ },
+ "files": [
+ "dist"
+ ],
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.js"
+ },
+ "./api": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.js"
+ }
+ },
+ "scripts": {
+ "dev": "tsdown --watch",
+ "build": "rimraf dist && cross-env NODE_ENV=production tsdown",
+ "lint": "oxlint src tests",
+ "lint:fix": "oxlint --fix src tests",
+ "typecheck": "tsc --noEmit",
+ "test": "pnpm build && vitest run",
+ "prepublishOnly": "pnpm run build"
+ },
+ "dependencies": {
+ "@framework-doctor/core": "workspace:*",
+ "@eslint/js": "^9.28.0",
+ "angular-eslint": "catalog:",
+ "typescript-eslint": "catalog:",
+ "commander": "catalog:",
+ "eslint": "catalog:",
+ "knip": "catalog:",
+ "ora": "catalog:",
+ "oxlint": "catalog:",
+ "picocolors": "catalog:",
+ "prompts": "^2.4.2"
+ },
+ "devDependencies": {
+ "@types/node": "catalog:",
+ "@types/prompts": "catalog:",
+ "cross-env": "catalog:",
+ "rimraf": "catalog:",
+ "tsdown": "catalog:",
+ "typescript": "catalog:",
+ "vitest": "catalog:"
+ },
+ "packageManager": "pnpm@10.30.0"
+}
diff --git a/packages/angular-doctor/src/cli.ts b/packages/angular-doctor/src/cli.ts
new file mode 100644
index 0000000..f13cc99
--- /dev/null
+++ b/packages/angular-doctor/src/cli.ts
@@ -0,0 +1,244 @@
+import {
+ addAnalyticsOption,
+ highlighter,
+ isAutomatedEnvironment,
+ logger,
+} from '@framework-doctor/core';
+import { Command } from 'commander';
+import path from 'node:path';
+import prompts from 'prompts';
+import { scan } from './scan.js';
+import type { AngularDoctorConfig, Diagnostic, DiffInfo, ScanOptions } from './types.js';
+import { filterSourceFiles, getDiffInfo } from './utils/get-diff-files.js';
+import { handleError } from './utils/handle-error.js';
+import { loadConfig } from './utils/load-config.js';
+import { selectProjects } from './utils/select-projects.js';
+import { maybePromptSkillInstall } from './utils/skill-prompt.js';
+import {
+ maybePromptAnalyticsConsent,
+ sendScanEvent,
+ shouldSendAnalytics,
+} from './utils/telemetry.js';
+
+const VERSION = process.env.VERSION ?? '0.0.0';
+
+interface CliFlags {
+ lint: boolean;
+ deadCode: boolean;
+ verbose: boolean;
+ score: boolean;
+ yes: boolean;
+ analytics: boolean;
+ project?: string;
+ diff?: boolean | string;
+ offline?: boolean;
+}
+
+const exitWithCancelHint = () => {
+ logger.break();
+ logger.log('Cancelled.');
+ logger.break();
+ process.exit(0);
+};
+
+process.on('SIGINT', exitWithCancelHint);
+process.on('SIGTERM', exitWithCancelHint);
+
+const resolveCliScanOptions = (
+ flags: CliFlags,
+ userConfig: AngularDoctorConfig | null,
+ programInstance: Command,
+): ScanOptions => {
+ const isCliOverride = (optionName: string) =>
+ programInstance.getOptionValueSource(optionName) === 'cli';
+
+ return {
+ lint: isCliOverride('lint') ? flags.lint : (userConfig?.lint ?? flags.lint),
+ deadCode: isCliOverride('deadCode') ? flags.deadCode : (userConfig?.deadCode ?? flags.deadCode),
+ verbose: isCliOverride('verbose') ? Boolean(flags.verbose) : (userConfig?.verbose ?? false),
+ scoreOnly: flags.score,
+ };
+};
+
+const resolveDiffMode = async (
+ diffInfo: DiffInfo | null,
+ effectiveDiff: boolean | string | undefined,
+ shouldSkipPrompts: boolean,
+ isScoreOnly: boolean,
+): Promise => {
+ if (effectiveDiff !== undefined && effectiveDiff !== false) {
+ if (diffInfo) return true;
+ if (!isScoreOnly) {
+ logger.warn('No feature branch or uncommitted changes detected. Running full scan.');
+ logger.break();
+ }
+ return false;
+ }
+
+ if (effectiveDiff === false || !diffInfo) return false;
+
+ const changedSourceFiles = filterSourceFiles(diffInfo.changedFiles);
+ if (changedSourceFiles.length === 0) return false;
+ if (shouldSkipPrompts) return true;
+ if (isScoreOnly) return false;
+
+ const promptMessage = diffInfo.isCurrentChanges
+ ? `Found ${changedSourceFiles.length} uncommitted changed files. Only scan current changes?`
+ : `On branch ${diffInfo.currentBranch} (${changedSourceFiles.length} changed files vs ${diffInfo.baseBranch}). Only scan this branch?`;
+
+ const { shouldScanChangedOnly } = await prompts(
+ {
+ type: 'confirm',
+ name: 'shouldScanChangedOnly',
+ message: promptMessage,
+ initial: true,
+ },
+ {
+ onCancel: () => {
+ logger.break();
+ logger.log('Cancelled.');
+ logger.break();
+ process.exit(0);
+ },
+ },
+ );
+ return Boolean(shouldScanChangedOnly);
+};
+
+const program = new Command()
+ .name('angular-doctor')
+ .description('Diagnose Angular codebase health')
+ .version(VERSION, '-v, --version', 'display the version number')
+ .argument('[directory]', 'project directory to scan', '.')
+ .option('--no-lint', 'skip linting')
+ .option('--no-dead-code', 'skip dead code detection')
+ .option('--verbose', 'show file details per rule')
+ .option('--score', 'output only the score')
+ .option('-y, --yes', 'skip prompts, scan all workspace projects')
+ .option('--project ', 'select workspace project (comma-separated for multiple)')
+ .option('--diff [base]', 'scan only files changed vs base branch')
+ .option('--offline', 'skip remote scoring (local score only)');
+
+addAnalyticsOption(program);
+
+program
+ .action(async (directory: string, flags: CliFlags) => {
+ const isScoreOnly = flags.score;
+
+ try {
+ const resolvedDirectory = path.resolve(directory);
+ const userConfig = loadConfig(resolvedDirectory);
+
+ if (!isScoreOnly) {
+ logger.log(`angular-doctor v${VERSION}`);
+ logger.break();
+ }
+
+ const scanOptions = resolveCliScanOptions(flags, userConfig, program);
+ const shouldSkipPrompts = flags.yes || isAutomatedEnvironment() || !process.stdin.isTTY;
+ const projectDirectories = await selectProjects(
+ resolvedDirectory,
+ flags.project,
+ shouldSkipPrompts,
+ );
+
+ const isDiffCliOverride = program.getOptionValueSource('diff') === 'cli';
+ const effectiveDiff = isDiffCliOverride ? flags.diff : userConfig?.diff;
+ const explicitBaseBranch = typeof effectiveDiff === 'string' ? effectiveDiff : undefined;
+ const diffInfo = getDiffInfo(resolvedDirectory, explicitBaseBranch);
+ const isDiffMode = await resolveDiffMode(
+ diffInfo,
+ effectiveDiff,
+ shouldSkipPrompts,
+ isScoreOnly,
+ );
+
+ if (isDiffMode && diffInfo && !isScoreOnly) {
+ if (diffInfo.isCurrentChanges) {
+ logger.log('Scanning uncommitted changes');
+ } else {
+ logger.log(
+ `Scanning changes: ${highlighter.info(diffInfo.currentBranch)} → ${highlighter.info(diffInfo.baseBranch)}`,
+ );
+ }
+ logger.break();
+ }
+
+ const allDiagnostics: Diagnostic[] = [];
+ const telemetryUrl = process.env.FRAMEWORK_DOCTOR_TELEMETRY_URL ?? '';
+ const isAutomated = isAutomatedEnvironment();
+
+ if (!isScoreOnly && !isAutomated && !flags.yes) {
+ await maybePromptAnalyticsConsent(shouldSkipPrompts);
+ }
+
+ for (const projectDirectory of projectDirectories) {
+ let includePaths: string[] | undefined;
+ if (isDiffMode) {
+ const projectDiffInfo = getDiffInfo(projectDirectory, explicitBaseBranch);
+ if (projectDiffInfo) {
+ const changedSourceFiles = filterSourceFiles(projectDiffInfo.changedFiles);
+ if (changedSourceFiles.length === 0) {
+ if (!isScoreOnly) {
+ logger.dim(`No changed source files in ${projectDirectory}, skipping.`);
+ logger.break();
+ }
+ continue;
+ }
+ includePaths = changedSourceFiles;
+ }
+ }
+
+ if (!isScoreOnly) {
+ logger.dim(`Scanning ${projectDirectory}...`);
+ logger.break();
+ }
+ const scanResult = await scan(projectDirectory, { ...scanOptions, includePaths });
+ allDiagnostics.push(...scanResult.diagnostics);
+
+ if (
+ telemetryUrl &&
+ scanResult.scoreResult &&
+ shouldSendAnalytics(
+ { analytics: flags.analytics, yes: flags.yes },
+ userConfig?.analytics,
+ isAutomated,
+ )
+ ) {
+ sendScanEvent(
+ telemetryUrl,
+ scanResult.projectInfo,
+ scanResult.scoreResult,
+ scanResult.diagnostics.length,
+ {
+ isDiffMode: Boolean(includePaths?.length),
+ cliVersion: VERSION,
+ },
+ );
+ }
+
+ if (!isScoreOnly) {
+ logger.break();
+ }
+ }
+
+ if (!isScoreOnly && !shouldSkipPrompts) {
+ await maybePromptSkillInstall(shouldSkipPrompts);
+ }
+ } catch (error) {
+ handleError(error);
+ }
+ })
+ .addHelpText(
+ 'after',
+ `
+${highlighter.dim('Learn more:')}
+ ${highlighter.info('https://github.com/pitis/framework-doctor')}
+`,
+ );
+
+const main = async () => {
+ await program.parseAsync();
+};
+
+main();
diff --git a/packages/angular-doctor/src/constants.ts b/packages/angular-doctor/src/constants.ts
new file mode 100644
index 0000000..fb4d2fd
--- /dev/null
+++ b/packages/angular-doctor/src/constants.ts
@@ -0,0 +1,15 @@
+export {
+ ERROR_RULE_PENALTY,
+ MILLISECONDS_PER_SECOND,
+ PERFECT_SCORE,
+ SCORE_BAR_WIDTH_CHARS,
+ SCORE_GOOD_THRESHOLD,
+ SCORE_OK_THRESHOLD,
+ SUMMARY_BOX_HORIZONTAL_PADDING_CHARS,
+ SUMMARY_BOX_OUTER_INDENT_CHARS,
+ WARNING_RULE_PENALTY,
+} from '@framework-doctor/core';
+
+export const SOURCE_FILE_PATTERN = /\.(html|ts|mts|cts|mjs|cjs)$/;
+
+export const OFFLINE_FLAG_MESSAGE = 'Score not available.';
diff --git a/packages/angular-doctor/src/index.ts b/packages/angular-doctor/src/index.ts
new file mode 100644
index 0000000..dbf380b
--- /dev/null
+++ b/packages/angular-doctor/src/index.ts
@@ -0,0 +1,33 @@
+import path from 'node:path';
+import { performance } from 'node:perf_hooks';
+import { scan } from './scan.js';
+import type { DiagnoseOptions, DiagnoseResult } from './types.js';
+import { discoverProject } from './utils/discover-project.js';
+
+export type {
+ AngularDoctorConfig,
+ DiagnoseOptions,
+ DiagnoseResult,
+ Diagnostic,
+ ProjectInfo,
+ ScanOptions,
+ ScoreResult,
+} from './types.js';
+export { filterSourceFiles, getDiffInfo } from './utils/get-diff-files.js';
+
+export const diagnose = async (
+ directory: string,
+ options: DiagnoseOptions = {},
+): Promise => {
+ const start = performance.now();
+ const root = path.resolve(directory);
+ const project = discoverProject(root);
+ const result = await scan(root, options);
+
+ return {
+ diagnostics: result.diagnostics,
+ score: result.scoreResult,
+ project,
+ elapsedMilliseconds: performance.now() - start,
+ };
+};
diff --git a/packages/angular-doctor/src/scan.ts b/packages/angular-doctor/src/scan.ts
new file mode 100644
index 0000000..95e6ff5
--- /dev/null
+++ b/packages/angular-doctor/src/scan.ts
@@ -0,0 +1,393 @@
+import type { FramedLine } from '@framework-doctor/core';
+import {
+ buildCountsSummaryLine,
+ buildScoreBar,
+ buildScoreBreakdownLines,
+ colorizeByScore,
+ createFramedLine,
+ getDoctorFace,
+ groupBy,
+ highlighter,
+ indentMultilineText,
+ logger,
+ PERFECT_SCORE,
+ printFramedBox,
+ spinner,
+} from '@framework-doctor/core';
+import { performance } from 'node:perf_hooks';
+import { OFFLINE_FLAG_MESSAGE } from './constants.js';
+import type {
+ AngularDoctorConfig,
+ Diagnostic,
+ ProjectInfo,
+ ScanOptions,
+ ScanResult,
+ ScoreResult,
+} from './types.js';
+import { calculateScore } from './utils/calculate-score.js';
+import { combineDiagnostics, computeAngularIncludePaths } from './utils/combine-diagnostics.js';
+import { discoverProject } from './utils/discover-project.js';
+import { loadConfig } from './utils/load-config.js';
+import { runEslint } from './utils/run-eslint.js';
+import { runKnip } from './utils/run-knip.js';
+import { runSecurityScan } from './utils/run-security-scan.js';
+import { writeDiagnosticsDirectory } from './utils/write-diagnostics-dir.js';
+
+const SEVERITY_ORDER: Record = {
+ error: 0,
+ warning: 1,
+};
+
+const colorizeBySeverity = (text: string, severity: Diagnostic['severity']): string =>
+ severity === 'error' ? highlighter.error(text) : highlighter.warn(text);
+
+const sortBySeverity = (diagnosticGroups: [string, Diagnostic[]][]): [string, Diagnostic[]][] =>
+ diagnosticGroups.toSorted(([, diagnosticsA], [, diagnosticsB]) => {
+ const severityA = SEVERITY_ORDER[diagnosticsA[0].severity];
+ const severityB = SEVERITY_ORDER[diagnosticsB[0].severity];
+ return severityA - severityB;
+ });
+
+const buildFileLineMap = (diagnostics: Diagnostic[]): Map => {
+ const fileLines = new Map();
+ for (const diagnostic of diagnostics) {
+ const lines = fileLines.get(diagnostic.filePath) ?? [];
+ if (diagnostic.line > 0) {
+ lines.push(diagnostic.line);
+ }
+ fileLines.set(diagnostic.filePath, lines);
+ }
+ return fileLines;
+};
+
+const hasHighOrCriticalSecurityFindings = (diagnostics: Diagnostic[]): boolean =>
+ diagnostics.some(
+ (diagnostic) => diagnostic.category === 'security' && diagnostic.severity === 'error',
+ );
+
+const printProjectDetection = (
+ projectInfo: ProjectInfo,
+ userConfig: AngularDoctorConfig | null,
+ isDiffMode: boolean,
+ includePaths: string[],
+): void => {
+ const languageLabel = projectInfo.hasTypeScript ? 'TypeScript' : 'JavaScript';
+
+ const completeStep = (message: string) => {
+ spinner(message).start().succeed(message);
+ };
+
+ completeStep(`Detecting framework. Found ${highlighter.info('Angular')}.`);
+ completeStep(
+ `Detecting Angular version. Found ${highlighter.info(`Angular ${projectInfo.angularVersion ?? 'unknown'}`)}.`,
+ );
+ completeStep(`Detecting language. Found ${highlighter.info(languageLabel)}.`);
+
+ if (isDiffMode) {
+ completeStep(`Scanning ${highlighter.info(`${includePaths.length}`)} changed source files.`);
+ } else {
+ completeStep(`Found ${highlighter.info(`${projectInfo.sourceFileCount}`)} source files.`);
+ }
+
+ if (userConfig) {
+ completeStep(`Loaded ${highlighter.info('angular-doctor config')}.`);
+ }
+
+ logger.break();
+};
+
+const printDiagnostics = (diagnostics: Diagnostic[], isVerbose: boolean): void => {
+ const ruleGroups = groupBy(
+ diagnostics,
+ (diagnostic) => `${diagnostic.plugin}/${diagnostic.rule}`,
+ );
+
+ const sortedRuleGroups = sortBySeverity([...ruleGroups.entries()]);
+
+ for (const [, ruleDiagnostics] of sortedRuleGroups) {
+ const firstDiagnostic = ruleDiagnostics[0];
+ const severitySymbol = firstDiagnostic.severity === 'error' ? '✗' : '⚠';
+ const icon = colorizeBySeverity(severitySymbol, firstDiagnostic.severity);
+ const count = ruleDiagnostics.length;
+ const countLabel = count > 1 ? colorizeBySeverity(` (${count})`, firstDiagnostic.severity) : '';
+
+ logger.log(` ${icon} ${firstDiagnostic.message}${countLabel}`);
+ if (firstDiagnostic.help) {
+ logger.dim(indentMultilineText(firstDiagnostic.help, ' '));
+ }
+
+ if (isVerbose) {
+ const fileLines = buildFileLineMap(ruleDiagnostics);
+
+ for (const [filePath, lines] of fileLines) {
+ const lineLabel = lines.length > 0 ? `: ${lines.join(', ')}` : '';
+ logger.dim(` ${filePath}${lineLabel}`);
+ }
+ }
+
+ logger.break();
+ }
+};
+
+const printBranding = (score?: number): void => {
+ if (score !== undefined) {
+ const [eyes, mouth] = getDoctorFace(score);
+ const colorize = (text: string) => colorizeByScore(text, score);
+ logger.log(colorize(' ┌─────┐'));
+ logger.log(colorize(` │ ${eyes} │`));
+ logger.log(colorize(` │ ${mouth} │`));
+ logger.log(colorize(' └─────┘'));
+ }
+ logger.log(' Angular Doctor');
+ logger.break();
+};
+
+const printScoreGauge = (score: number, label: string): void => {
+ const scoreDisplay = colorizeByScore(`${score}`, score);
+ const labelDisplay = colorizeByScore(label, score);
+ const bar = buildScoreBar(score);
+ logger.log(` ${scoreDisplay} / ${PERFECT_SCORE} ${labelDisplay}`);
+ logger.break();
+ logger.log(` ${bar.rendered}`);
+ logger.break();
+};
+
+const buildBrandingLines = (
+ scoreResult: ScoreResult | null,
+ noScoreMessage: string,
+ verbose: boolean,
+): FramedLine[] => {
+ const lines: FramedLine[] = [];
+
+ if (scoreResult) {
+ const [eyes, mouth] = getDoctorFace(scoreResult.score);
+ const scoreColorizer = (text: string): string => colorizeByScore(text, scoreResult.score);
+
+ lines.push(createFramedLine('┌─────┐', scoreColorizer('┌─────┐')));
+ lines.push(createFramedLine(`│ ${eyes} │`, scoreColorizer(`│ ${eyes} │`)));
+ lines.push(createFramedLine(`│ ${mouth} │`, scoreColorizer(`│ ${mouth} │`)));
+ lines.push(createFramedLine('└─────┘', scoreColorizer('└─────┘')));
+ lines.push(createFramedLine('Angular Doctor', 'Angular Doctor'));
+ lines.push(createFramedLine(''));
+
+ const scoreLinePlainText = `${scoreResult.score} / ${PERFECT_SCORE} ${scoreResult.label}`;
+ const scoreLineRenderedText = `${colorizeByScore(String(scoreResult.score), scoreResult.score)} / ${PERFECT_SCORE} ${colorizeByScore(scoreResult.label, scoreResult.score)}`;
+ lines.push(createFramedLine(scoreLinePlainText, scoreLineRenderedText));
+ lines.push(createFramedLine(''));
+ const bar = buildScoreBar(scoreResult.score);
+ lines.push(createFramedLine(bar.plain, bar.rendered));
+ if (verbose && scoreResult.breakdown) {
+ lines.push(createFramedLine(''));
+ lines.push(...buildScoreBreakdownLines(scoreResult.breakdown));
+ }
+ lines.push(createFramedLine(''));
+ } else {
+ lines.push(createFramedLine('Angular Doctor', 'Angular Doctor'));
+ lines.push(createFramedLine(''));
+ lines.push(createFramedLine(noScoreMessage, highlighter.dim(noScoreMessage)));
+ lines.push(createFramedLine(''));
+ }
+
+ return lines;
+};
+
+const toCountsFramedLine = (
+ diagnostics: Diagnostic[],
+ totalSourceFileCount: number,
+ elapsedMilliseconds: number,
+): FramedLine => {
+ const { plain, rendered } = buildCountsSummaryLine(
+ diagnostics,
+ totalSourceFileCount,
+ elapsedMilliseconds,
+ );
+ return createFramedLine(plain, rendered);
+};
+
+const printSummary = (
+ diagnostics: Diagnostic[],
+ elapsedMilliseconds: number,
+ scoreResult: ScoreResult | null,
+ projectName: string,
+ totalSourceFileCount: number,
+ noScoreMessage: string,
+ verbose: boolean,
+): void => {
+ const summaryFramedLines = [
+ ...buildBrandingLines(scoreResult, noScoreMessage, verbose),
+ toCountsFramedLine(diagnostics, totalSourceFileCount, elapsedMilliseconds),
+ ];
+ printFramedBox(summaryFramedLines);
+
+ try {
+ const diagnosticsDirectory = writeDiagnosticsDirectory(diagnostics);
+ logger.break();
+ logger.dim(` Full diagnostics written to ${diagnosticsDirectory}`);
+ } catch {
+ logger.break();
+ }
+};
+
+interface ResolvedScanOptions {
+ lint: boolean;
+ deadCode: boolean;
+ verbose: boolean;
+ scoreOnly: boolean;
+ includePaths: string[];
+}
+
+const mergeScanOptions = (
+ inputOptions: ScanOptions,
+ userConfig: AngularDoctorConfig | null,
+): ResolvedScanOptions => ({
+ lint: inputOptions.lint ?? userConfig?.lint ?? true,
+ deadCode: inputOptions.deadCode ?? userConfig?.deadCode ?? true,
+ verbose: inputOptions.verbose ?? userConfig?.verbose ?? false,
+ scoreOnly: inputOptions.scoreOnly ?? false,
+ includePaths: inputOptions.includePaths ?? [],
+});
+
+export const scan = async (
+ directory: string,
+ inputOptions: ScanOptions = {},
+): Promise => {
+ const startTime = performance.now();
+ const projectInfo = discoverProject(directory);
+ const userConfig = loadConfig(directory);
+ const options = mergeScanOptions(inputOptions, userConfig);
+ const { includePaths } = options;
+ const isDiffMode = includePaths.length > 0;
+
+ if (!projectInfo.angularVersion) {
+ throw new Error('No Angular dependency found in package.json');
+ }
+
+ if (!options.scoreOnly) {
+ printProjectDetection(projectInfo, userConfig, isDiffMode, includePaths);
+ }
+
+ const angularIncludePaths = computeAngularIncludePaths(includePaths) ?? includePaths;
+
+ let didLintFail = false;
+ let didDeadCodeFail = false;
+
+ const lintPromise = options.lint
+ ? (async () => {
+ const lintSpinner = options.scoreOnly ? null : spinner('Running lint checks...').start();
+ try {
+ const lintDiagnostics = await runEslint(directory, angularIncludePaths);
+ lintSpinner?.succeed('Running lint checks.');
+ return lintDiagnostics;
+ } catch (error) {
+ didLintFail = true;
+ lintSpinner?.fail('Lint checks failed (non-fatal, skipping).');
+ logger.error(String(error));
+ return [];
+ }
+ })()
+ : Promise.resolve([]);
+
+ const deadCodePromise =
+ options.deadCode && !isDiffMode
+ ? (async () => {
+ const deadCodeSpinner = options.scoreOnly
+ ? null
+ : spinner('Detecting dead code...').start();
+ try {
+ const knipDiagnostics = await runKnip(directory);
+ deadCodeSpinner?.succeed('Detecting dead code.');
+ return knipDiagnostics;
+ } catch (error) {
+ didDeadCodeFail = true;
+ deadCodeSpinner?.fail('Dead code detection failed (non-fatal, skipping).');
+ logger.error(String(error));
+ return [];
+ }
+ })()
+ : Promise.resolve([]);
+
+ const securityPromise = options.lint
+ ? runSecurityScan(directory, includePaths)
+ : Promise.resolve([]);
+
+ const [lintDiagnostics, deadCodeDiagnostics, securityDiagnostics] = await Promise.all([
+ lintPromise,
+ deadCodePromise,
+ securityPromise,
+ ]);
+
+ const diagnostics = combineDiagnostics(
+ lintDiagnostics,
+ deadCodeDiagnostics,
+ securityDiagnostics,
+ directory,
+ isDiffMode,
+ userConfig,
+ );
+
+ const elapsedMilliseconds = performance.now() - startTime;
+
+ const skippedChecks: string[] = [];
+ if (didLintFail) skippedChecks.push('lint');
+ if (didDeadCodeFail) skippedChecks.push('dead code');
+ const hasSkippedChecks = skippedChecks.length > 0;
+
+ const totalFilesScanned = isDiffMode ? includePaths.length : projectInfo.sourceFileCount;
+ const scoreResult = await calculateScore(diagnostics, totalFilesScanned, {
+ hasHighOrCriticalSecurityFindings: hasHighOrCriticalSecurityFindings(diagnostics),
+ });
+ const noScoreMessage = OFFLINE_FLAG_MESSAGE;
+
+ if (options.scoreOnly) {
+ if (scoreResult) {
+ logger.log(`${scoreResult.score}`);
+ } else {
+ logger.dim(noScoreMessage);
+ }
+ return { diagnostics, scoreResult, skippedChecks, projectInfo };
+ }
+
+ if (diagnostics.length === 0) {
+ if (hasSkippedChecks) {
+ const skippedLabel = skippedChecks.join(' and ');
+ logger.warn(
+ `No issues detected, but ${skippedLabel} checks failed — results are incomplete.`,
+ );
+ } else {
+ logger.success('No issues found!');
+ }
+ logger.break();
+ if (hasSkippedChecks) {
+ printBranding();
+ logger.dim(' Score not shown — some checks could not complete.');
+ } else if (scoreResult) {
+ printBranding(scoreResult.score);
+ printScoreGauge(scoreResult.score, scoreResult.label);
+ } else {
+ logger.dim(` ${noScoreMessage}`);
+ }
+ return { diagnostics, scoreResult, skippedChecks, projectInfo };
+ }
+
+ printDiagnostics(diagnostics, options.verbose);
+
+ const displayedSourceFileCount = isDiffMode ? includePaths.length : projectInfo.sourceFileCount;
+
+ printSummary(
+ diagnostics,
+ elapsedMilliseconds,
+ scoreResult,
+ projectInfo.projectName,
+ displayedSourceFileCount,
+ noScoreMessage,
+ options.verbose,
+ );
+
+ if (hasSkippedChecks) {
+ const skippedLabel = skippedChecks.join(' and ');
+ logger.break();
+ logger.warn(` Note: ${skippedLabel} checks failed — score may be incomplete.`);
+ }
+
+ return { diagnostics, scoreResult, skippedChecks, projectInfo };
+};
diff --git a/packages/angular-doctor/src/types.ts b/packages/angular-doctor/src/types.ts
new file mode 100644
index 0000000..b033ca9
--- /dev/null
+++ b/packages/angular-doctor/src/types.ts
@@ -0,0 +1,64 @@
+import type { BaseDoctorConfig, Diagnostic, ScoreResult } from '@framework-doctor/core';
+
+export interface ProjectInfo {
+ rootDirectory: string;
+ projectName: string;
+ angularVersion: string | null;
+ hasTypeScript: boolean;
+ sourceFileCount: number;
+}
+
+export type {
+ Diagnostic,
+ DiffInfo,
+ IgnoreConfig,
+ ScoreGuardrailInput,
+ ScoreResult,
+} from '@framework-doctor/core';
+
+export interface ScanOptions {
+ lint?: boolean;
+ deadCode?: boolean;
+ verbose?: boolean;
+ scoreOnly?: boolean;
+ includePaths?: string[];
+}
+
+export interface ScanResult {
+ diagnostics: Diagnostic[];
+ scoreResult: ScoreResult | null;
+ skippedChecks: string[];
+ projectInfo: ProjectInfo;
+}
+
+export interface AngularDoctorConfig extends BaseDoctorConfig {}
+
+export interface WorkspacePackage {
+ name: string;
+ directory: string;
+}
+
+export interface HandleErrorOptions {
+ shouldExit: boolean;
+}
+
+export interface PackageJson {
+ name?: string;
+ dependencies?: Record;
+ devDependencies?: Record;
+ peerDependencies?: Record;
+ workspaces?: string[] | { packages: string[] };
+}
+
+export interface DiagnoseOptions {
+ lint?: boolean;
+ deadCode?: boolean;
+ includePaths?: string[];
+}
+
+export interface DiagnoseResult {
+ diagnostics: Diagnostic[];
+ score: ScoreResult | null;
+ project: ProjectInfo;
+ elapsedMilliseconds: number;
+}
diff --git a/packages/angular-doctor/src/utils/calculate-score.ts b/packages/angular-doctor/src/utils/calculate-score.ts
new file mode 100644
index 0000000..fd08022
--- /dev/null
+++ b/packages/angular-doctor/src/utils/calculate-score.ts
@@ -0,0 +1,3 @@
+import { calculateScore as calculateScoreFromCore } from '@framework-doctor/core';
+
+export const calculateScore = calculateScoreFromCore;
diff --git a/packages/angular-doctor/src/utils/combine-diagnostics.ts b/packages/angular-doctor/src/utils/combine-diagnostics.ts
new file mode 100644
index 0000000..01f2ffb
--- /dev/null
+++ b/packages/angular-doctor/src/utils/combine-diagnostics.ts
@@ -0,0 +1,20 @@
+import { SOURCE_FILE_PATTERN } from '../constants.js';
+import type { AngularDoctorConfig, Diagnostic } from '../types.js';
+import { filterIgnoredDiagnostics } from './filter-diagnostics.js';
+
+export const computeAngularIncludePaths = (includePaths: string[]): string[] | undefined =>
+ includePaths.length > 0
+ ? includePaths.filter((filePath) => SOURCE_FILE_PATTERN.test(filePath))
+ : undefined;
+
+export const combineDiagnostics = (
+ lintDiagnostics: Diagnostic[],
+ deadCodeDiagnostics: Diagnostic[],
+ securityDiagnostics: Diagnostic[],
+ directory: string,
+ isDiffMode: boolean,
+ userConfig: AngularDoctorConfig | null,
+): Diagnostic[] => {
+ const allDiagnostics = [...lintDiagnostics, ...deadCodeDiagnostics, ...securityDiagnostics];
+ return userConfig ? filterIgnoredDiagnostics(allDiagnostics, userConfig) : allDiagnostics;
+};
diff --git a/packages/angular-doctor/src/utils/discover-project.ts b/packages/angular-doctor/src/utils/discover-project.ts
new file mode 100644
index 0000000..6424b6c
--- /dev/null
+++ b/packages/angular-doctor/src/utils/discover-project.ts
@@ -0,0 +1,171 @@
+import { spawnSync } from 'node:child_process';
+import fs from 'node:fs';
+import path from 'node:path';
+import { SOURCE_FILE_PATTERN } from '../constants.js';
+import type { PackageJson, ProjectInfo, WorkspacePackage } from '../types.js';
+import { readPackageJson } from './read-package-json.js';
+
+const collectDependencies = (packageJson: PackageJson): Record => ({
+ ...packageJson.peerDependencies,
+ ...packageJson.dependencies,
+ ...packageJson.devDependencies,
+});
+
+const hasAngularDependency = (packageJson: PackageJson): boolean => {
+ const allDeps = collectDependencies(packageJson);
+ return Object.prototype.hasOwnProperty.call(allDeps, '@angular/core');
+};
+
+const parsePnpmWorkspacePatterns = (rootDirectory: string): string[] => {
+ const workspacePath = path.join(rootDirectory, 'pnpm-workspace.yaml');
+ if (!fs.existsSync(workspacePath)) return [];
+
+ const content = fs.readFileSync(workspacePath, 'utf-8');
+ const patterns: string[] = [];
+ let isInsidePackagesBlock = false;
+
+ for (const line of content.split('\n')) {
+ const trimmed = line.trim();
+ if (trimmed === 'packages:') {
+ isInsidePackagesBlock = true;
+ continue;
+ }
+ if (isInsidePackagesBlock && trimmed.startsWith('-')) {
+ patterns.push(trimmed.replace(/^-\s*/, '').replace(/["']/g, ''));
+ } else if (isInsidePackagesBlock && trimmed.length > 0 && !trimmed.startsWith('#')) {
+ isInsidePackagesBlock = false;
+ }
+ }
+
+ return patterns;
+};
+
+const getWorkspacePatterns = (rootDirectory: string, packageJson: PackageJson): string[] => {
+ const pnpmPatterns = parsePnpmWorkspacePatterns(rootDirectory);
+ if (pnpmPatterns.length > 0) return pnpmPatterns;
+
+ if (Array.isArray(packageJson.workspaces)) {
+ return packageJson.workspaces;
+ }
+
+ const workspaces = packageJson.workspaces;
+ if (workspaces && typeof workspaces === 'object' && 'packages' in workspaces) {
+ return workspaces.packages;
+ }
+
+ return [];
+};
+
+const resolveWorkspaceDirectories = (rootDirectory: string, pattern: string): string[] => {
+ const cleanPattern = pattern.replace(/["']/g, '').replace(/\/\*\*$/, '/*');
+
+ if (!cleanPattern.includes('*')) {
+ const directoryPath = path.join(rootDirectory, cleanPattern);
+ if (fs.existsSync(directoryPath) && fs.existsSync(path.join(directoryPath, 'package.json'))) {
+ return [directoryPath];
+ }
+ return [];
+ }
+
+ const wildcardIndex = cleanPattern.indexOf('*');
+ const baseDirectory = path.join(rootDirectory, cleanPattern.slice(0, wildcardIndex));
+ const suffixAfterWildcard = cleanPattern.slice(wildcardIndex + 1);
+
+ if (!fs.existsSync(baseDirectory) || !fs.statSync(baseDirectory).isDirectory()) {
+ return [];
+ }
+
+ return fs
+ .readdirSync(baseDirectory)
+ .map((entry) => path.join(baseDirectory, entry, suffixAfterWildcard))
+ .filter(
+ (entryPath) =>
+ fs.existsSync(entryPath) &&
+ fs.statSync(entryPath).isDirectory() &&
+ fs.existsSync(path.join(entryPath, 'package.json')),
+ );
+};
+
+export const discoverAngularSubprojects = (rootDirectory: string): WorkspacePackage[] => {
+ if (!fs.existsSync(rootDirectory) || !fs.statSync(rootDirectory).isDirectory()) return [];
+
+ const entries = fs.readdirSync(rootDirectory, { withFileTypes: true });
+ const packages: WorkspacePackage[] = [];
+
+ for (const entry of entries) {
+ if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {
+ continue;
+ }
+
+ const subdirectory = path.join(rootDirectory, entry.name);
+ const packageJsonPath = path.join(subdirectory, 'package.json');
+ if (!fs.existsSync(packageJsonPath)) continue;
+
+ const packageJson = readPackageJson(packageJsonPath);
+ if (!hasAngularDependency(packageJson)) continue;
+
+ const name = packageJson.name ?? entry.name;
+ packages.push({ name, directory: subdirectory });
+ }
+
+ return packages;
+};
+
+export const listWorkspacePackages = (rootDirectory: string): WorkspacePackage[] => {
+ const packageJsonPath = path.join(rootDirectory, 'package.json');
+ if (!fs.existsSync(packageJsonPath)) return [];
+
+ const packageJson = readPackageJson(packageJsonPath);
+ const patterns = getWorkspacePatterns(rootDirectory, packageJson);
+ if (patterns.length === 0) return [];
+
+ const packages: WorkspacePackage[] = [];
+
+ for (const pattern of patterns) {
+ const directories = resolveWorkspaceDirectories(rootDirectory, pattern);
+ for (const workspaceDirectory of directories) {
+ const workspacePackageJson = readPackageJson(path.join(workspaceDirectory, 'package.json'));
+
+ if (!hasAngularDependency(workspacePackageJson)) continue;
+
+ const name = workspacePackageJson.name ?? path.basename(workspaceDirectory);
+ packages.push({ name, directory: workspaceDirectory });
+ }
+ }
+
+ return packages;
+};
+
+const countSourceFiles = (rootDirectory: string): number => {
+ const result = spawnSync('git', ['ls-files', '--cached', '--others', '--exclude-standard'], {
+ cwd: rootDirectory,
+ encoding: 'utf-8',
+ maxBuffer: 10 * 1024 * 1024,
+ });
+
+ if (result.status !== 0 || result.error) return 0;
+
+ return result.stdout
+ .split('\n')
+ .filter((relativePath) => relativePath.length > 0 && SOURCE_FILE_PATTERN.test(relativePath))
+ .length;
+};
+
+export const discoverProject = (directory: string): ProjectInfo => {
+ const packageJsonPath = path.join(directory, 'package.json');
+ if (!fs.existsSync(packageJsonPath)) {
+ throw new Error(`No package.json found in ${directory}`);
+ }
+
+ const packageJson = readPackageJson(packageJsonPath);
+ const dependencies = collectDependencies(packageJson);
+ const angularVersion = dependencies['@angular/core'] ?? null;
+
+ return {
+ rootDirectory: directory,
+ projectName: packageJson.name ?? path.basename(directory),
+ angularVersion,
+ hasTypeScript: fs.existsSync(path.join(directory, 'tsconfig.json')),
+ sourceFileCount: countSourceFiles(directory),
+ };
+};
diff --git a/packages/angular-doctor/src/utils/filter-diagnostics.ts b/packages/angular-doctor/src/utils/filter-diagnostics.ts
new file mode 100644
index 0000000..9f6cb51
--- /dev/null
+++ b/packages/angular-doctor/src/utils/filter-diagnostics.ts
@@ -0,0 +1,28 @@
+import { compileGlobPattern } from '@framework-doctor/core';
+import type { AngularDoctorConfig, Diagnostic } from '../types.js';
+
+export const filterIgnoredDiagnostics = (
+ diagnostics: Diagnostic[],
+ config: AngularDoctorConfig | null,
+): Diagnostic[] => {
+ if (!config) return diagnostics;
+
+ const ignoredRules = new Set(Array.isArray(config.ignore?.rules) ? config.ignore.rules : []);
+ const ignoredFilePatterns = Array.isArray(config.ignore?.files)
+ ? config.ignore.files.map(compileGlobPattern)
+ : [];
+
+ if (ignoredRules.size === 0 && ignoredFilePatterns.length === 0) {
+ return diagnostics;
+ }
+
+ return diagnostics.filter((diagnostic) => {
+ const ruleIdentifier = `${diagnostic.plugin}/${diagnostic.rule}`;
+ if (ignoredRules.has(ruleIdentifier)) return false;
+
+ const normalizedPath = diagnostic.filePath.replace(/\\/g, '/').replace(/^\.\//, '');
+ if (ignoredFilePatterns.some((pattern) => pattern.test(normalizedPath))) return false;
+
+ return true;
+ });
+};
diff --git a/packages/angular-doctor/src/utils/get-diff-files.ts b/packages/angular-doctor/src/utils/get-diff-files.ts
new file mode 100644
index 0000000..ad4868a
--- /dev/null
+++ b/packages/angular-doctor/src/utils/get-diff-files.ts
@@ -0,0 +1,10 @@
+import {
+ filterSourceFiles as filterSourceFilesCore,
+ getDiffInfo as getDiffInfoCore,
+ SOURCE_FILE_PATTERN_ANGULAR,
+} from '@framework-doctor/core';
+
+export const getDiffInfo = getDiffInfoCore;
+
+export const filterSourceFiles = (files: string[]): string[] =>
+ filterSourceFilesCore(files, SOURCE_FILE_PATTERN_ANGULAR);
diff --git a/packages/angular-doctor/src/utils/handle-error.ts b/packages/angular-doctor/src/utils/handle-error.ts
new file mode 100644
index 0000000..65da7ea
--- /dev/null
+++ b/packages/angular-doctor/src/utils/handle-error.ts
@@ -0,0 +1,24 @@
+import { logger } from '@framework-doctor/core';
+import type { HandleErrorOptions } from '../types.js';
+
+const DEFAULT_HANDLE_ERROR_OPTIONS: HandleErrorOptions = {
+ shouldExit: true,
+};
+
+export const handleError = (
+ error: unknown,
+ options: HandleErrorOptions = DEFAULT_HANDLE_ERROR_OPTIONS,
+): void => {
+ logger.break();
+ logger.error('Something went wrong. Please check the error below for more details.');
+ logger.error('If the problem persists, please open an issue on GitHub.');
+ logger.error('');
+ if (error instanceof Error) {
+ logger.error(error.message);
+ }
+ logger.break();
+ if (options.shouldExit) {
+ process.exit(1);
+ }
+ process.exitCode = 1;
+};
diff --git a/packages/angular-doctor/src/utils/load-config.ts b/packages/angular-doctor/src/utils/load-config.ts
new file mode 100644
index 0000000..c504c12
--- /dev/null
+++ b/packages/angular-doctor/src/utils/load-config.ts
@@ -0,0 +1,8 @@
+import { loadConfig as loadConfigFromCore } from '@framework-doctor/core';
+import type { AngularDoctorConfig } from '../types.js';
+
+const CONFIG_FILENAME = 'angular-doctor.config.json';
+const PACKAGE_JSON_CONFIG_KEY = 'angularDoctor';
+
+export const loadConfig = (rootDirectory: string): AngularDoctorConfig | null =>
+ loadConfigFromCore(rootDirectory, CONFIG_FILENAME, PACKAGE_JSON_CONFIG_KEY);
diff --git a/packages/angular-doctor/src/utils/read-package-json.ts b/packages/angular-doctor/src/utils/read-package-json.ts
new file mode 100644
index 0000000..7d4f356
--- /dev/null
+++ b/packages/angular-doctor/src/utils/read-package-json.ts
@@ -0,0 +1,5 @@
+import { readJson } from '@framework-doctor/core';
+import type { PackageJson } from '../types.js';
+
+export const readPackageJson = (packageJsonPath: string): PackageJson =>
+ readJson(packageJsonPath);
diff --git a/packages/angular-doctor/src/utils/run-eslint.ts b/packages/angular-doctor/src/utils/run-eslint.ts
new file mode 100644
index 0000000..82c9bab
--- /dev/null
+++ b/packages/angular-doctor/src/utils/run-eslint.ts
@@ -0,0 +1,106 @@
+import { spawnSync } from 'node:child_process';
+import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
+import { createRequire } from 'node:module';
+import { tmpdir } from 'node:os';
+import path from 'node:path';
+import type { Diagnostic } from '../types.js';
+
+interface LintMessage {
+ ruleId: string | null;
+ message: string;
+ line: number;
+ column: number;
+ severity: number;
+}
+
+interface JsonOutput {
+ filePath: string;
+ messages: LintMessage[];
+}
+
+const parseLintResult = (result: JsonOutput, rootDirectory: string): Diagnostic[] =>
+ result.messages.map((message) => {
+ const [plugin, rule] = (message.ruleId ?? 'eslint/unknown').split('/');
+ return {
+ filePath: result.filePath,
+ plugin,
+ rule: rule ?? 'unknown',
+ severity: message.severity === 2 ? 'error' : 'warning',
+ message: message.message,
+ help: '',
+ line: message.line,
+ column: message.column,
+ category: 'correctness',
+ };
+ });
+
+const createEslintConfigContent = (): string => `const eslint = require('@eslint/js');
+const tseslint = require('typescript-eslint');
+const angular = require('angular-eslint');
+
+module.exports = tseslint.config(
+ {
+ files: ['**/*.ts'],
+ extends: [
+ eslint.configs.recommended,
+ ...tseslint.configs.recommended,
+ ...angular.configs.tsRecommended,
+ ],
+ processor: angular.processInlineTemplates,
+ rules: {},
+ },
+ {
+ files: ['**/*.html'],
+ extends: [
+ ...angular.configs.templateRecommended,
+ ...angular.configs.templateAccessibility,
+ ],
+ rules: {},
+ },
+);
+`;
+
+export const runEslint = async (
+ rootDirectory: string,
+ includePaths: string[],
+): Promise => {
+ const tempDir = mkdtempSync(path.join(tmpdir(), 'angular-doctor-eslint-'));
+ const configPath = path.join(tempDir, 'eslint.config.cjs');
+
+ try {
+ writeFileSync(configPath, createEslintConfigContent(), 'utf-8');
+
+ const require = createRequire(import.meta.url);
+ const eslintPackagePath = require.resolve('eslint/package.json');
+ const eslintDir = path.dirname(eslintPackagePath);
+ const eslintBin = path.join(eslintDir, 'bin/eslint.js');
+
+ const targetPaths = includePaths.length > 0 ? includePaths : ['.'];
+ const result = spawnSync(
+ process.execPath,
+ [eslintBin, '--config', configPath, '--format', 'json', ...targetPaths],
+ {
+ cwd: rootDirectory,
+ encoding: 'utf-8',
+ },
+ );
+
+ const output = result.stdout?.trim() || result.stderr?.trim() || '[]';
+ let results: JsonOutput[] = [];
+ try {
+ results = JSON.parse(output) as JsonOutput[];
+ } catch {
+ return [];
+ }
+
+ const diagnostics: Diagnostic[] = [];
+ for (const lintResult of results) {
+ if (lintResult.messages?.length > 0) {
+ diagnostics.push(...parseLintResult(lintResult, rootDirectory));
+ }
+ }
+ return diagnostics;
+ } finally {
+ rmSync(tempDir, { recursive: true, force: true });
+ }
+};
diff --git a/packages/angular-doctor/src/utils/run-knip.ts b/packages/angular-doctor/src/utils/run-knip.ts
new file mode 100644
index 0000000..d66c4fe
--- /dev/null
+++ b/packages/angular-doctor/src/utils/run-knip.ts
@@ -0,0 +1,95 @@
+import { spawnSync } from 'node:child_process';
+import { createRequire } from 'node:module';
+import path from 'node:path';
+import type { Diagnostic } from '../types.js';
+
+interface KnipExport {
+ name: string;
+ line?: number;
+ col?: number;
+}
+
+interface KnipIssue {
+ file: string;
+ exports?: KnipExport[];
+ types?: KnipExport[];
+ devDependencies?: Array<{ name: string }>;
+}
+
+interface KnipJsonOutput {
+ files?: string[];
+ issues?: KnipIssue[];
+}
+
+const asDiagnostics = (
+ items: Array<{ file: string; message: string; rule: string; line?: number; column?: number }>,
+ rootDirectory: string,
+): Diagnostic[] =>
+ items.map((item) => ({
+ filePath: path.resolve(rootDirectory, item.file),
+ plugin: 'knip',
+ rule: item.rule,
+ severity: 'warning',
+ message: item.message,
+ help: 'Remove dead code or keep it in an explicit public API boundary.',
+ line: item.line ?? 0,
+ column: item.column ?? 0,
+ category: 'maintainability',
+ }));
+
+export const runKnip = async (rootDirectory: string): Promise => {
+ const require = createRequire(import.meta.url);
+ const knipMainPath = require.resolve('knip');
+ const knipBin = path.join(path.dirname(knipMainPath), '../bin/knip.js');
+
+ const run = spawnSync(process.execPath, [knipBin, '--reporter', 'json'], {
+ cwd: rootDirectory,
+ encoding: 'utf-8',
+ });
+
+ const stdout = run.stdout.toString().trim();
+ if (!stdout) return [];
+
+ let payload: KnipJsonOutput | null = null;
+ try {
+ payload = JSON.parse(stdout) as KnipJsonOutput;
+ } catch {
+ return [];
+ }
+
+ const items: Array<{
+ file: string;
+ message: string;
+ rule: string;
+ line?: number;
+ column?: number;
+ }> = [];
+
+ for (const file of payload.files ?? []) {
+ items.push({ file, message: `Unused file: ${file}`, rule: 'files' });
+ }
+
+ for (const issue of payload.issues ?? []) {
+ const { file } = issue;
+ for (const exp of issue.exports ?? []) {
+ items.push({
+ file,
+ message: `Unused export: ${exp.name}`,
+ rule: 'exports',
+ line: exp.line,
+ column: exp.col,
+ });
+ }
+ for (const typeItem of issue.types ?? []) {
+ items.push({
+ file,
+ message: `Unused type: ${typeItem.name}`,
+ rule: 'types',
+ line: typeItem.line,
+ column: typeItem.col,
+ });
+ }
+ }
+
+ return asDiagnostics(items, rootDirectory);
+};
diff --git a/packages/angular-doctor/src/utils/run-security-scan.ts b/packages/angular-doctor/src/utils/run-security-scan.ts
new file mode 100644
index 0000000..74339ef
--- /dev/null
+++ b/packages/angular-doctor/src/utils/run-security-scan.ts
@@ -0,0 +1,22 @@
+import {
+ NO_BYPASS_SECURITY_TRUST_RULE,
+ NO_INNER_HTML_BINDING_RULE,
+ runSecurityScan as runSecurityScanCore,
+ SOURCE_FILE_PATTERN_WITH_ANGULAR,
+ UNIVERSAL_SECURITY_RULES,
+} from '@framework-doctor/core';
+
+const ANGULAR_PLUGIN = 'angular-doctor';
+
+const ANGULAR_SECURITY_RULES = [
+ ...UNIVERSAL_SECURITY_RULES,
+ NO_INNER_HTML_BINDING_RULE,
+ NO_BYPASS_SECURITY_TRUST_RULE,
+];
+
+export const runSecurityScan = async (rootDirectory: string, includePaths: string[]) =>
+ runSecurityScanCore(rootDirectory, includePaths, {
+ plugin: ANGULAR_PLUGIN,
+ rules: ANGULAR_SECURITY_RULES,
+ filePattern: SOURCE_FILE_PATTERN_WITH_ANGULAR,
+ });
diff --git a/packages/angular-doctor/src/utils/select-projects.ts b/packages/angular-doctor/src/utils/select-projects.ts
new file mode 100644
index 0000000..b40c1a0
--- /dev/null
+++ b/packages/angular-doctor/src/utils/select-projects.ts
@@ -0,0 +1,95 @@
+import { highlighter, logger } from '@framework-doctor/core';
+import path from 'node:path';
+import prompts from 'prompts';
+import type { WorkspacePackage } from '../types.js';
+import { discoverAngularSubprojects, listWorkspacePackages } from './discover-project.js';
+
+const onCancel = () => {
+ logger.break();
+ logger.log('Cancelled.');
+ logger.break();
+ process.exit(0);
+};
+
+export const selectProjects = async (
+ rootDirectory: string,
+ projectFlag: string | undefined,
+ skipPrompts: boolean,
+): Promise => {
+ let packages = listWorkspacePackages(rootDirectory);
+ if (packages.length === 0) {
+ packages = discoverAngularSubprojects(rootDirectory);
+ }
+
+ if (packages.length === 0) return [rootDirectory];
+ if (packages.length === 1) {
+ logger.log(
+ `${highlighter.success('✔')} Select projects to scan ${highlighter.dim('›')} ${packages[0].name}`,
+ );
+ return [packages[0].directory];
+ }
+
+ if (projectFlag) return resolveProjectFlag(projectFlag, packages);
+
+ if (skipPrompts) {
+ printDiscoveredProjects(packages);
+ return packages.map((workspacePackage) => workspacePackage.directory);
+ }
+
+ return promptProjectSelection(packages, rootDirectory);
+};
+
+const resolveProjectFlag = (
+ projectFlag: string,
+ workspacePackages: WorkspacePackage[],
+): string[] => {
+ const requestedNames = projectFlag.split(',').map((name) => name.trim());
+ const resolvedDirectories: string[] = [];
+
+ for (const requestedName of requestedNames) {
+ const matched = workspacePackages.find(
+ (workspacePackage) =>
+ workspacePackage.name === requestedName ||
+ path.basename(workspacePackage.directory) === requestedName,
+ );
+
+ if (!matched) {
+ const availableNames = workspacePackages
+ .map((workspacePackage) => workspacePackage.name)
+ .join(', ');
+ throw new Error(`Project "${requestedName}" not found. Available: ${availableNames}`);
+ }
+
+ resolvedDirectories.push(matched.directory);
+ }
+
+ return resolvedDirectories;
+};
+
+const printDiscoveredProjects = (packages: WorkspacePackage[]): void => {
+ logger.log(
+ `${highlighter.success('✔')} Select projects to scan ${highlighter.dim('›')} ${packages.map((workspacePackage) => workspacePackage.name).join(', ')}`,
+ );
+};
+
+const promptProjectSelection = async (
+ workspacePackages: WorkspacePackage[],
+ rootDirectory: string,
+): Promise => {
+ const { selectedDirectories } = await prompts(
+ {
+ type: 'multiselect',
+ name: 'selectedDirectories',
+ message: 'Select projects to scan',
+ choices: workspacePackages.map((workspacePackage) => ({
+ title: workspacePackage.name,
+ description: path.relative(rootDirectory, workspacePackage.directory),
+ value: workspacePackage.directory,
+ })),
+ min: 1,
+ },
+ { onCancel },
+ );
+
+ return selectedDirectories ?? [];
+};
diff --git a/packages/angular-doctor/src/utils/skill-prompt.ts b/packages/angular-doctor/src/utils/skill-prompt.ts
new file mode 100644
index 0000000..a2241d2
--- /dev/null
+++ b/packages/angular-doctor/src/utils/skill-prompt.ts
@@ -0,0 +1,203 @@
+import { highlighter, logger, readGlobalConfig, writeGlobalConfig } from '@framework-doctor/core';
+import { spawnSync } from 'node:child_process';
+import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
+import { homedir } from 'node:os';
+import { join } from 'node:path';
+import prompts from 'prompts';
+
+const HOME_DIRECTORY = homedir();
+
+const SKILL_NAME = 'angular-doctor';
+const WINDSURF_MARKER = '# Angular Doctor';
+
+const SKILL_DESCRIPTION =
+ 'Run after making Angular changes to catch issues early. Use when reviewing code, finishing a feature, or fixing bugs in an Angular project.';
+
+const SKILL_BODY = `Scans your Angular codebase for security, performance, correctness, and architecture issues. Outputs a 0-100 score with actionable diagnostics.
+
+## Usage
+
+\`\`\`bash
+npx -y @framework-doctor/angular@latest . --verbose --diff
+\`\`\`
+
+Or use the unified CLI (auto-detects Angular):
+
+\`\`\`bash
+npx -y @framework-doctor/cli . --verbose --diff
+\`\`\`
+
+## Workflow
+
+Run after making changes to catch issues early. Fix errors first, then re-run to verify the score improved.`;
+
+const SKILL_CONTENT = `---
+name: ${SKILL_NAME}
+description: ${SKILL_DESCRIPTION}
+version: 1.0.0
+---
+
+# Angular Doctor
+
+${SKILL_BODY}
+`;
+
+const AGENTS_CONTENT = `# Angular Doctor
+
+${SKILL_DESCRIPTION}
+
+${SKILL_BODY}
+`;
+
+const CODEX_AGENT_CONFIG = `interface:
+ display_name: "${SKILL_NAME}"
+ short_description: "Diagnose and fix Angular codebase health issues"
+`;
+
+interface SkillTarget {
+ name: string;
+ detect: () => boolean;
+ install: () => void;
+}
+
+const writeSkillFiles = (directory: string): void => {
+ mkdirSync(directory, { recursive: true });
+ writeFileSync(join(directory, 'SKILL.md'), SKILL_CONTENT);
+ writeFileSync(join(directory, 'AGENTS.md'), AGENTS_CONTENT);
+};
+
+const isCommandAvailable = (command: string): boolean => {
+ try {
+ const whichCommand = process.platform === 'win32' ? 'where' : 'which';
+ const result = spawnSync(whichCommand, [command], { stdio: 'ignore' });
+ return result.status === 0 && !result.error;
+ } catch {
+ return false;
+ }
+};
+
+const SKILL_TARGETS: SkillTarget[] = [
+ {
+ name: 'Claude Code',
+ detect: () => existsSync(join(HOME_DIRECTORY, '.claude')),
+ install: () => writeSkillFiles(join(HOME_DIRECTORY, '.claude', 'skills', SKILL_NAME)),
+ },
+ {
+ name: 'Amp Code',
+ detect: () => existsSync(join(HOME_DIRECTORY, '.amp')),
+ install: () => writeSkillFiles(join(HOME_DIRECTORY, '.config', 'amp', 'skills', SKILL_NAME)),
+ },
+ {
+ name: 'Cursor',
+ detect: () => existsSync(join(HOME_DIRECTORY, '.cursor')),
+ install: () => writeSkillFiles(join(HOME_DIRECTORY, '.cursor', 'skills', SKILL_NAME)),
+ },
+ {
+ name: 'OpenCode',
+ detect: () =>
+ isCommandAvailable('opencode') || existsSync(join(HOME_DIRECTORY, '.config', 'opencode')),
+ install: () =>
+ writeSkillFiles(join(HOME_DIRECTORY, '.config', 'opencode', 'skills', SKILL_NAME)),
+ },
+ {
+ name: 'Windsurf',
+ detect: () =>
+ existsSync(join(HOME_DIRECTORY, '.codeium')) ||
+ existsSync(join(HOME_DIRECTORY, 'Library', 'Application Support', 'Windsurf')),
+ install: () => {
+ const memoriesDirectory = join(HOME_DIRECTORY, '.codeium', 'windsurf', 'memories');
+ mkdirSync(memoriesDirectory, { recursive: true });
+ const rulesFile = join(memoriesDirectory, 'global_rules.md');
+
+ if (existsSync(rulesFile)) {
+ const existingContent = readFileSync(rulesFile, 'utf-8');
+ if (existingContent.includes(WINDSURF_MARKER)) return;
+ appendFileSync(rulesFile, `\n${WINDSURF_MARKER}\n\n${SKILL_CONTENT}`);
+ } else {
+ writeFileSync(rulesFile, `${WINDSURF_MARKER}\n\n${SKILL_CONTENT}`);
+ }
+ },
+ },
+ {
+ name: 'Antigravity',
+ detect: () =>
+ isCommandAvailable('agy') || existsSync(join(HOME_DIRECTORY, '.gemini', 'antigravity')),
+ install: () =>
+ writeSkillFiles(join(HOME_DIRECTORY, '.gemini', 'antigravity', 'skills', SKILL_NAME)),
+ },
+ {
+ name: 'Gemini CLI',
+ detect: () => isCommandAvailable('gemini') || existsSync(join(HOME_DIRECTORY, '.gemini')),
+ install: () => writeSkillFiles(join(HOME_DIRECTORY, '.gemini', 'skills', SKILL_NAME)),
+ },
+ {
+ name: 'Codex',
+ detect: () => isCommandAvailable('codex') || existsSync(join(HOME_DIRECTORY, '.codex')),
+ install: () => {
+ const skillDirectory = join(HOME_DIRECTORY, '.codex', 'skills', SKILL_NAME);
+ writeSkillFiles(skillDirectory);
+ const agentsDirectory = join(skillDirectory, 'agents');
+ mkdirSync(agentsDirectory, { recursive: true });
+ writeFileSync(join(agentsDirectory, 'openai.yaml'), CODEX_AGENT_CONFIG);
+ },
+ },
+];
+
+const installSkill = (): void => {
+ let installedCount = 0;
+
+ for (const target of SKILL_TARGETS) {
+ if (!target.detect()) continue;
+ try {
+ target.install();
+ logger.log(` ${highlighter.success('✔')} ${target.name}`);
+ installedCount++;
+ } catch {
+ logger.dim(` ✗ ${target.name} (failed)`);
+ }
+ }
+
+ try {
+ const projectSkillDirectory = join('.agents', SKILL_NAME);
+ writeSkillFiles(projectSkillDirectory);
+ logger.log(` ${highlighter.success('✔')} .agents/`);
+ installedCount++;
+ } catch {
+ logger.dim(' ✗ .agents/ (failed)');
+ }
+
+ logger.break();
+ if (installedCount === 0) {
+ logger.dim('No supported tools detected.');
+ } else {
+ logger.success('Done! The skill will activate when working on Angular projects.');
+ }
+};
+
+export const maybePromptSkillInstall = async (shouldSkipPrompts: boolean): Promise => {
+ const config = readGlobalConfig();
+ if (config.skillPromptDismissed) return;
+ if (shouldSkipPrompts) return;
+
+ logger.break();
+ logger.log(`${highlighter.info('💡')} Have your coding agent fix these issues automatically?`);
+ logger.dim(
+ ` Install the ${highlighter.info('angular-doctor')} skill to teach Cursor, Claude Code,`,
+ );
+ logger.dim(' and other AI agents how to diagnose and fix Angular issues.');
+ logger.break();
+
+ const { shouldInstall } = await prompts({
+ type: 'confirm',
+ name: 'shouldInstall',
+ message: 'Install skill? (recommended)',
+ initial: true,
+ });
+
+ if (shouldInstall) {
+ logger.break();
+ installSkill();
+ }
+
+ writeGlobalConfig({ ...config, skillPromptDismissed: true });
+};
diff --git a/packages/angular-doctor/src/utils/telemetry.ts b/packages/angular-doctor/src/utils/telemetry.ts
new file mode 100644
index 0000000..330617b
--- /dev/null
+++ b/packages/angular-doctor/src/utils/telemetry.ts
@@ -0,0 +1,52 @@
+import {
+ maybePromptAnalyticsConsent as coreMaybePromptAnalyticsConsent,
+ sendScanEvent as coreSendScanEvent,
+ shouldSendAnalytics as coreShouldSendAnalytics,
+ highlighter,
+ logger,
+ type TelemetryEventPayload,
+} from '@framework-doctor/core';
+import prompts from 'prompts';
+import type { ProjectInfo, ScoreResult } from '../types.js';
+
+export const shouldSendAnalytics = coreShouldSendAnalytics;
+
+export const maybePromptAnalyticsConsent = async (shouldSkipPrompts: boolean): Promise =>
+ coreMaybePromptAnalyticsConsent(shouldSkipPrompts, async () => {
+ logger.break();
+ logger.log(`${highlighter.info('?')} Help improve angular-doctor?`);
+ logger.dim(' Anonymous usage (framework, score range). No code or paths sent.');
+ logger.break();
+
+ const { analyticsEnabled } = await prompts({
+ type: 'confirm',
+ name: 'analyticsEnabled',
+ message: 'Share anonymous analytics?',
+ initial: true,
+ });
+ return Boolean(analyticsEnabled);
+ });
+
+const buildPayload = (
+ projectInfo: ProjectInfo,
+ scoreResult: ScoreResult,
+ diagnosticCount: number,
+ options: { isDiffMode: boolean; cliVersion: string },
+): TelemetryEventPayload => ({
+ doctor_family: 'angular',
+ framework: 'angular',
+ score: scoreResult.score,
+ diagnostic_count: diagnosticCount,
+ has_typescript: projectInfo.hasTypeScript,
+ is_diff_mode: options.isDiffMode,
+ cli_version: options.cliVersion,
+});
+
+export const sendScanEvent = (
+ telemetryUrl: string,
+ projectInfo: ProjectInfo,
+ scoreResult: ScoreResult,
+ diagnosticCount: number,
+ options: { isDiffMode: boolean; cliVersion: string },
+): void =>
+ coreSendScanEvent(telemetryUrl, buildPayload(projectInfo, scoreResult, diagnosticCount, options));
diff --git a/packages/angular-doctor/src/utils/write-diagnostics-dir.ts b/packages/angular-doctor/src/utils/write-diagnostics-dir.ts
new file mode 100644
index 0000000..fda8889
--- /dev/null
+++ b/packages/angular-doctor/src/utils/write-diagnostics-dir.ts
@@ -0,0 +1,76 @@
+import { groupBy } from '@framework-doctor/core';
+import { randomUUID } from 'node:crypto';
+import { mkdirSync, writeFileSync } from 'node:fs';
+import { tmpdir } from 'node:os';
+import { join } from 'node:path';
+import type { Diagnostic } from '../types.js';
+
+const SEVERITY_ORDER: Record = {
+ error: 0,
+ warning: 1,
+};
+
+const sortBySeverity = (groups: [string, Diagnostic[]][]): [string, Diagnostic[]][] =>
+ groups.toSorted(([, diagnosticsA], [, diagnosticsB]) => {
+ const severityA = SEVERITY_ORDER[diagnosticsA[0].severity];
+ const severityB = SEVERITY_ORDER[diagnosticsB[0].severity];
+ return severityA - severityB;
+ });
+
+const buildFileLineMap = (diagnostics: Diagnostic[]): Map => {
+ const fileLines = new Map();
+ for (const diagnostic of diagnostics) {
+ const lines = fileLines.get(diagnostic.filePath) ?? [];
+ if (diagnostic.line > 0) {
+ lines.push(diagnostic.line);
+ }
+ fileLines.set(diagnostic.filePath, lines);
+ }
+ return fileLines;
+};
+
+const formatRuleSummary = (ruleKey: string, ruleDiagnostics: Diagnostic[]): string => {
+ const firstDiagnostic = ruleDiagnostics[0];
+ const fileLines = buildFileLineMap(ruleDiagnostics);
+
+ const sections = [
+ `Rule: ${ruleKey}`,
+ `Severity: ${firstDiagnostic.severity}`,
+ `Category: ${firstDiagnostic.category}`,
+ `Count: ${ruleDiagnostics.length}`,
+ '',
+ firstDiagnostic.message,
+ ];
+
+ if (firstDiagnostic.help) {
+ sections.push('', `Suggestion: ${firstDiagnostic.help}`);
+ }
+
+ sections.push('', 'Files:');
+ for (const [filePath, lines] of fileLines) {
+ const lineLabel = lines.length > 0 ? `: ${lines.join(', ')}` : '';
+ sections.push(` ${filePath}${lineLabel}`);
+ }
+
+ return sections.join('\n') + '\n';
+};
+
+export const writeDiagnosticsDirectory = (diagnostics: Diagnostic[]): string => {
+ const outputDirectory = join(tmpdir(), `angular-doctor-${randomUUID()}`);
+ mkdirSync(outputDirectory);
+
+ const ruleGroups = groupBy(
+ diagnostics,
+ (diagnostic) => `${diagnostic.plugin}/${diagnostic.rule}`,
+ );
+ const sortedRuleGroups = sortBySeverity([...ruleGroups.entries()]);
+
+ for (const [ruleKey, ruleDiagnostics] of sortedRuleGroups) {
+ const fileName = ruleKey.replace(/\//g, '--') + '.txt';
+ writeFileSync(join(outputDirectory, fileName), formatRuleSummary(ruleKey, ruleDiagnostics));
+ }
+
+ writeFileSync(join(outputDirectory, 'diagnostics.json'), JSON.stringify(diagnostics, null, 2));
+
+ return outputDirectory;
+};
diff --git a/packages/angular-doctor/tests/colorize-by-score.test.ts b/packages/angular-doctor/tests/colorize-by-score.test.ts
new file mode 100644
index 0000000..1004b52
--- /dev/null
+++ b/packages/angular-doctor/tests/colorize-by-score.test.ts
@@ -0,0 +1,46 @@
+import { colorizeByScore } from '@framework-doctor/core';
+import { describe, expect, it } from 'vitest';
+
+describe('colorizeByScore', () => {
+ it('returns a string for high scores', () => {
+ const result = colorizeByScore('Great', 90);
+ expect(typeof result).toBe('string');
+ expect(result).toContain('Great');
+ });
+
+ it('returns a string for medium scores', () => {
+ const result = colorizeByScore('OK', 60);
+ expect(typeof result).toBe('string');
+ expect(result).toContain('OK');
+ });
+
+ it('returns a string for low scores', () => {
+ const result = colorizeByScore('Critical', 30);
+ expect(typeof result).toBe('string');
+ expect(result).toContain('Critical');
+ });
+
+ it('does not throw at good threshold boundary (75)', () => {
+ expect(() => colorizeByScore('text', 75)).not.toThrow();
+ expect(() => colorizeByScore('text', 74)).not.toThrow();
+ expect(colorizeByScore('text', 75)).toContain('text');
+ expect(colorizeByScore('text', 74)).toContain('text');
+ });
+
+ it('does not throw at ok threshold boundary (50)', () => {
+ expect(() => colorizeByScore('text', 50)).not.toThrow();
+ expect(() => colorizeByScore('text', 49)).not.toThrow();
+ expect(colorizeByScore('text', 50)).toContain('text');
+ expect(colorizeByScore('text', 49)).toContain('text');
+ });
+
+ it('handles score of zero', () => {
+ const result = colorizeByScore('zero', 0);
+ expect(result).toContain('zero');
+ });
+
+ it('handles perfect score', () => {
+ const result = colorizeByScore('perfect', 100);
+ expect(result).toContain('perfect');
+ });
+});
diff --git a/packages/angular-doctor/tests/combine-diagnostics.test.ts b/packages/angular-doctor/tests/combine-diagnostics.test.ts
new file mode 100644
index 0000000..d67befa
--- /dev/null
+++ b/packages/angular-doctor/tests/combine-diagnostics.test.ts
@@ -0,0 +1,79 @@
+import { describe, expect, it } from 'vitest';
+import type { AngularDoctorConfig, Diagnostic } from '../src/types.js';
+import {
+ combineDiagnostics,
+ computeAngularIncludePaths,
+} from '../src/utils/combine-diagnostics.js';
+
+const createDiagnostic = (overrides: Partial = {}): Diagnostic => ({
+ filePath: 'src/app.component.ts',
+ plugin: 'angular-doctor',
+ rule: 'test-rule',
+ severity: 'warning',
+ message: 'test message',
+ help: 'test help',
+ line: 1,
+ column: 1,
+ category: 'Test',
+ ...overrides,
+});
+
+describe('computeAngularIncludePaths', () => {
+ it('returns undefined for empty include paths', () => {
+ expect(computeAngularIncludePaths([])).toBeUndefined();
+ });
+
+ it('filters to only Angular source files (html, ts, mts, cts, mjs, cjs)', () => {
+ const paths = [
+ 'src/app.component.html',
+ 'src/utils.ts',
+ 'src/button.component.ts',
+ 'config.js',
+ ];
+ const result = computeAngularIncludePaths(paths);
+ expect(result).toEqual(['src/app.component.html', 'src/utils.ts', 'src/button.component.ts']);
+ });
+
+ it('returns empty array when no source files exist', () => {
+ const paths = ['readme.md', 'package.json'];
+ const result = computeAngularIncludePaths(paths);
+ expect(result).toEqual([]);
+ });
+});
+
+describe('combineDiagnostics', () => {
+ it('merges lint and dead code diagnostics', () => {
+ const lintDiagnostics = [createDiagnostic({ rule: 'lint-rule' })];
+ const deadCodeDiagnostics = [createDiagnostic({ rule: 'dead-code-rule' })];
+
+ const result = combineDiagnostics(lintDiagnostics, deadCodeDiagnostics, [], '/tmp', true, null);
+ expect(result).toHaveLength(2);
+ expect(result[0].rule).toBe('lint-rule');
+ expect(result[1].rule).toBe('dead-code-rule');
+ });
+
+ it('returns empty array when both inputs are empty in diff mode', () => {
+ const result = combineDiagnostics([], [], [], '/tmp', true, null);
+ expect(result).toEqual([]);
+ });
+
+ it('applies config filtering when userConfig is provided', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: '@angular-eslint', rule: 'component-selector' }),
+ createDiagnostic({ plugin: 'angular-doctor', rule: 'no-giant-component' }),
+ ];
+ const config: AngularDoctorConfig = {
+ ignore: { rules: ['@angular-eslint/component-selector'] },
+ };
+
+ const result = combineDiagnostics(diagnostics, [], [], '/tmp', true, config);
+ expect(result).toHaveLength(1);
+ expect(result[0].rule).toBe('no-giant-component');
+ });
+
+ it('skips config filtering when userConfig is null', () => {
+ const diagnostics = [createDiagnostic(), createDiagnostic()];
+ const result = combineDiagnostics(diagnostics, [], [], '/tmp', true, null);
+ expect(result).toHaveLength(2);
+ });
+});
diff --git a/packages/angular-doctor/tests/discover-project.test.ts b/packages/angular-doctor/tests/discover-project.test.ts
new file mode 100644
index 0000000..a2befbc
--- /dev/null
+++ b/packages/angular-doctor/tests/discover-project.test.ts
@@ -0,0 +1,37 @@
+import path from 'node:path';
+import { describe, expect, it } from 'vitest';
+import { discoverProject, listWorkspacePackages } from '../src/utils/discover-project.js';
+
+const FIXTURES_DIRECTORY = path.resolve(import.meta.dirname, 'fixtures');
+
+describe('discoverProject', () => {
+ it('detects Angular version from package.json', () => {
+ const projectInfo = discoverProject(path.join(FIXTURES_DIRECTORY, 'basic-angular'));
+ expect(projectInfo.angularVersion).toBe('^19.0.0');
+ });
+
+ it('detects TypeScript when tsconfig.json exists', () => {
+ const projectInfo = discoverProject(path.join(FIXTURES_DIRECTORY, 'basic-angular'));
+ expect(projectInfo.hasTypeScript).toBe(true);
+ });
+
+ it('detects Angular version from peerDependencies', () => {
+ const projectInfo = discoverProject(path.join(FIXTURES_DIRECTORY, 'component-library'));
+ expect(projectInfo.angularVersion).toBe('^19.0.0 || ^18.0.0');
+ });
+
+ it('throws when package.json is missing', () => {
+ expect(() => discoverProject('/nonexistent/path')).toThrow('No package.json found');
+ });
+});
+
+describe('listWorkspacePackages', () => {
+ it('resolves nested workspace patterns like apps/*/ClientApp', () => {
+ const packages = listWorkspacePackages(path.join(FIXTURES_DIRECTORY, 'nested-workspaces'));
+ const packageNames = packages.map((workspacePackage) => workspacePackage.name);
+
+ expect(packageNames).toContain('my-app-client');
+ expect(packageNames).toContain('ui');
+ expect(packages).toHaveLength(2);
+ });
+});
diff --git a/packages/angular-doctor/tests/filter-diagnostics.test.ts b/packages/angular-doctor/tests/filter-diagnostics.test.ts
new file mode 100644
index 0000000..bb8f655
--- /dev/null
+++ b/packages/angular-doctor/tests/filter-diagnostics.test.ts
@@ -0,0 +1,137 @@
+import { describe, expect, it } from 'vitest';
+import type { AngularDoctorConfig, Diagnostic } from '../src/types.js';
+import { filterIgnoredDiagnostics } from '../src/utils/filter-diagnostics.js';
+
+const createDiagnostic = (overrides: Partial = {}): Diagnostic => ({
+ filePath: 'src/app.component.ts',
+ plugin: '@angular-eslint',
+ rule: 'component-selector',
+ severity: 'warning',
+ message: 'test message',
+ help: 'test help',
+ line: 1,
+ column: 1,
+ category: 'Correctness',
+ ...overrides,
+});
+
+describe('filterIgnoredDiagnostics', () => {
+ it('returns all diagnostics when config has no ignore rules', () => {
+ const diagnostics = [createDiagnostic()];
+ const config: AngularDoctorConfig = {};
+ expect(filterIgnoredDiagnostics(diagnostics, config)).toEqual(diagnostics);
+ });
+
+ it('filters diagnostics matching ignored rules', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: '@angular-eslint', rule: 'component-selector' }),
+ createDiagnostic({ plugin: '@angular-eslint', rule: 'template/accessibility-label-for' }),
+ createDiagnostic({ plugin: 'angular-doctor', rule: 'no-giant-component' }),
+ ];
+ const config: AngularDoctorConfig = {
+ ignore: {
+ rules: [
+ '@angular-eslint/component-selector',
+ '@angular-eslint/template/accessibility-label-for',
+ ],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].rule).toBe('no-giant-component');
+ });
+
+ it('filters diagnostics matching ignored file patterns', () => {
+ const diagnostics = [
+ createDiagnostic({ filePath: 'src/generated/types.ts' }),
+ createDiagnostic({ filePath: 'src/generated/api/client.ts' }),
+ createDiagnostic({ filePath: 'src/components/button.component.ts' }),
+ ];
+ const config: AngularDoctorConfig = {
+ ignore: {
+ files: ['src/generated/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].filePath).toBe('src/components/button.component.ts');
+ });
+
+ it('filters by both rules and files together', () => {
+ const diagnostics = [
+ createDiagnostic({
+ plugin: '@angular-eslint',
+ rule: 'component-selector',
+ filePath: 'src/app.component.ts',
+ }),
+ createDiagnostic({ plugin: 'knip', rule: 'exports', filePath: 'src/generated/api.ts' }),
+ createDiagnostic({
+ plugin: 'angular-doctor',
+ rule: 'no-giant-component',
+ filePath: 'src/components/app.component.ts',
+ }),
+ ];
+ const config: AngularDoctorConfig = {
+ ignore: {
+ rules: ['@angular-eslint/component-selector'],
+ files: ['src/generated/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].rule).toBe('no-giant-component');
+ });
+
+ it('keeps all diagnostics when no rules or files match', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: '@angular-eslint', rule: 'component-selector' }),
+ createDiagnostic({ plugin: 'knip', rule: 'exports' }),
+ ];
+ const config: AngularDoctorConfig = {
+ ignore: {
+ rules: ['nonexistent/rule'],
+ files: ['nonexistent/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(2);
+ });
+
+ it('filters file paths with ./ prefix against patterns without it', () => {
+ const diagnostics = [
+ createDiagnostic({ filePath: './src/components/ui/button.component.ts' }),
+ createDiagnostic({ filePath: './src/marketing/hero.component.ts' }),
+ createDiagnostic({ filePath: './src/pages/home.component.ts' }),
+ ];
+ const config: AngularDoctorConfig = {
+ ignore: {
+ files: ['src/components/ui/**', 'src/marketing/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].filePath).toBe('./src/pages/home.component.ts');
+ });
+
+ it('handles knip rule identifiers', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: 'knip', rule: 'exports' }),
+ createDiagnostic({ plugin: 'knip', rule: 'types' }),
+ createDiagnostic({ plugin: 'knip', rule: 'files' }),
+ ];
+ const config: AngularDoctorConfig = {
+ ignore: {
+ rules: ['knip/exports', 'knip/types'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].rule).toBe('files');
+ });
+});
diff --git a/packages/angular-doctor/tests/find-monorepo-root.test.ts b/packages/angular-doctor/tests/find-monorepo-root.test.ts
new file mode 100644
index 0000000..40f3845
--- /dev/null
+++ b/packages/angular-doctor/tests/find-monorepo-root.test.ts
@@ -0,0 +1,33 @@
+import { findMonorepoRoot, isMonorepoRoot } from '@framework-doctor/core';
+import path from 'node:path';
+import { describe, expect, it } from 'vitest';
+
+const FIXTURES_DIRECTORY = path.resolve(import.meta.dirname, 'fixtures');
+
+describe('isMonorepoRoot', () => {
+ it('returns true for a directory with pnpm-workspace.yaml or workspaces', () => {
+ const nestedWorkspaces = path.join(FIXTURES_DIRECTORY, 'nested-workspaces');
+ expect(isMonorepoRoot(nestedWorkspaces)).toBe(true);
+ });
+
+ it('returns false for a non-monorepo project', () => {
+ const basicAngular = path.join(FIXTURES_DIRECTORY, 'basic-angular');
+ expect(isMonorepoRoot(basicAngular)).toBe(false);
+ });
+
+ it('returns false for a nonexistent directory', () => {
+ expect(isMonorepoRoot('/nonexistent/path')).toBe(false);
+ });
+});
+
+describe('findMonorepoRoot', () => {
+ it('returns null when no monorepo root exists above directory', () => {
+ expect(findMonorepoRoot('/tmp')).toBeNull();
+ });
+
+ it('finds monorepo root from a nested workspace package', () => {
+ const nestedPackage = path.join(FIXTURES_DIRECTORY, 'nested-workspaces', 'packages', 'ui');
+ const monorepoRoot = findMonorepoRoot(nestedPackage);
+ expect(monorepoRoot).toBe(path.join(FIXTURES_DIRECTORY, 'nested-workspaces'));
+ });
+});
diff --git a/packages/angular-doctor/tests/fixtures/basic-angular/package.json b/packages/angular-doctor/tests/fixtures/basic-angular/package.json
new file mode 100644
index 0000000..58e4ac6
--- /dev/null
+++ b/packages/angular-doctor/tests/fixtures/basic-angular/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "basic-angular",
+ "dependencies": {
+ "@angular/core": "^19.0.0"
+ }
+}
diff --git a/packages/angular-doctor/tests/fixtures/basic-angular/tsconfig.json b/packages/angular-doctor/tests/fixtures/basic-angular/tsconfig.json
new file mode 100644
index 0000000..22b5bda
--- /dev/null
+++ b/packages/angular-doctor/tests/fixtures/basic-angular/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "strict": true,
+ "target": "ESNext",
+ "module": "ESNext",
+ "moduleResolution": "bundler"
+ }
+}
diff --git a/packages/angular-doctor/tests/fixtures/component-library/package.json b/packages/angular-doctor/tests/fixtures/component-library/package.json
new file mode 100644
index 0000000..b64fe8c
--- /dev/null
+++ b/packages/angular-doctor/tests/fixtures/component-library/package.json
@@ -0,0 +1,7 @@
+{
+ "name": "angular-component-library",
+ "private": true,
+ "peerDependencies": {
+ "@angular/core": "^19.0.0 || ^18.0.0"
+ }
+}
diff --git a/packages/angular-doctor/tests/fixtures/nested-workspaces/apps/my-app/ClientApp/package.json b/packages/angular-doctor/tests/fixtures/nested-workspaces/apps/my-app/ClientApp/package.json
new file mode 100644
index 0000000..71e589c
--- /dev/null
+++ b/packages/angular-doctor/tests/fixtures/nested-workspaces/apps/my-app/ClientApp/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "my-app-client",
+ "dependencies": {
+ "@angular/core": "^19.0.0"
+ }
+}
diff --git a/packages/angular-doctor/tests/fixtures/nested-workspaces/package.json b/packages/angular-doctor/tests/fixtures/nested-workspaces/package.json
new file mode 100644
index 0000000..3d06325
--- /dev/null
+++ b/packages/angular-doctor/tests/fixtures/nested-workspaces/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "nested-workspaces-fixture",
+ "private": true,
+ "workspaces": [
+ "apps/*/ClientApp",
+ "packages/*"
+ ]
+}
diff --git a/packages/angular-doctor/tests/fixtures/nested-workspaces/packages/ui/package.json b/packages/angular-doctor/tests/fixtures/nested-workspaces/packages/ui/package.json
new file mode 100644
index 0000000..d84c892
--- /dev/null
+++ b/packages/angular-doctor/tests/fixtures/nested-workspaces/packages/ui/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "ui",
+ "dependencies": {
+ "@angular/core": "^19.0.0"
+ }
+}
diff --git a/packages/angular-doctor/tests/indent-multiline-text.test.ts b/packages/angular-doctor/tests/indent-multiline-text.test.ts
new file mode 100644
index 0000000..cb2bb35
--- /dev/null
+++ b/packages/angular-doctor/tests/indent-multiline-text.test.ts
@@ -0,0 +1,21 @@
+import { indentMultilineText } from '@framework-doctor/core';
+import { describe, expect, it } from 'vitest';
+
+describe('indentMultilineText', () => {
+ it('adds the prefix to a single line', () => {
+ const indentedText = indentMultilineText('Error: Something happened', ' ');
+
+ expect(indentedText).toBe(' Error: Something happened');
+ });
+
+ it('adds the prefix to every line in multiline text', () => {
+ const explanation =
+ 'Error: Calling setState synchronously within an effect can trigger cascading renders\n\nEffects are intended to synchronize state between React and external systems.\n* Update external systems with the latest state from React.\n* Subscribe for updates from external systems and set state in a callback.';
+
+ const indentedText = indentMultilineText(explanation, ' ');
+
+ expect(indentedText).toBe(
+ ' Error: Calling setState synchronously within an effect can trigger cascading renders\n \n Effects are intended to synchronize state between React and external systems.\n * Update external systems with the latest state from React.\n * Subscribe for updates from external systems and set state in a callback.',
+ );
+ });
+});
diff --git a/packages/angular-doctor/tests/load-config.test.ts b/packages/angular-doctor/tests/load-config.test.ts
new file mode 100644
index 0000000..15ea9df
--- /dev/null
+++ b/packages/angular-doctor/tests/load-config.test.ts
@@ -0,0 +1,192 @@
+import fs from 'node:fs';
+import os from 'node:os';
+import path from 'node:path';
+import { afterAll, beforeAll, describe, expect, it } from 'vitest';
+import { loadConfig } from '../src/utils/load-config.js';
+
+const tempRootDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'angular-doctor-config-test-'));
+
+afterAll(() => {
+ fs.rmSync(tempRootDirectory, { recursive: true, force: true });
+});
+
+describe('loadConfig', () => {
+ describe('angular-doctor.config.json', () => {
+ let configDirectory: string;
+
+ beforeAll(() => {
+ configDirectory = path.join(tempRootDirectory, 'with-config-file');
+ fs.mkdirSync(configDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(configDirectory, 'angular-doctor.config.json'),
+ JSON.stringify({
+ ignore: {
+ rules: ['@angular-eslint/component-selector', 'knip/exports'],
+ files: ['src/generated/**'],
+ },
+ }),
+ );
+ });
+
+ it('loads config from angular-doctor.config.json', () => {
+ const config = loadConfig(configDirectory);
+ expect(config).toEqual({
+ ignore: {
+ rules: ['@angular-eslint/component-selector', 'knip/exports'],
+ files: ['src/generated/**'],
+ },
+ });
+ });
+ });
+
+ describe('package.json angularDoctor key', () => {
+ let packageJsonDirectory: string;
+
+ beforeAll(() => {
+ packageJsonDirectory = path.join(tempRootDirectory, 'with-package-json-config');
+ fs.mkdirSync(packageJsonDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(packageJsonDirectory, 'package.json'),
+ JSON.stringify({
+ name: 'test-project',
+ angularDoctor: {
+ ignore: {
+ rules: ['@angular-eslint/template/accessibility-label-for'],
+ },
+ },
+ }),
+ );
+ });
+
+ it('loads config from package.json angularDoctor key', () => {
+ const config = loadConfig(packageJsonDirectory);
+ expect(config).toEqual({
+ ignore: {
+ rules: ['@angular-eslint/template/accessibility-label-for'],
+ },
+ });
+ });
+ });
+
+ describe('config file takes precedence', () => {
+ let precedenceDirectory: string;
+
+ beforeAll(() => {
+ precedenceDirectory = path.join(tempRootDirectory, 'precedence');
+ fs.mkdirSync(precedenceDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(precedenceDirectory, 'angular-doctor.config.json'),
+ JSON.stringify({ ignore: { rules: ['from-config-file'] } }),
+ );
+ fs.writeFileSync(
+ path.join(precedenceDirectory, 'package.json'),
+ JSON.stringify({
+ name: 'test',
+ angularDoctor: { ignore: { rules: ['from-package-json'] } },
+ }),
+ );
+ });
+
+ it('prefers angular-doctor.config.json over package.json', () => {
+ const config = loadConfig(precedenceDirectory);
+ expect(config?.ignore?.rules).toEqual(['from-config-file']);
+ });
+ });
+
+ describe('no config', () => {
+ let emptyDirectory: string;
+
+ beforeAll(() => {
+ emptyDirectory = path.join(tempRootDirectory, 'no-config');
+ fs.mkdirSync(emptyDirectory, { recursive: true });
+ });
+
+ it('returns null when no config is found', () => {
+ const config = loadConfig(emptyDirectory);
+ expect(config).toBeNull();
+ });
+ });
+
+ describe('scan options in config', () => {
+ let optionsDirectory: string;
+
+ beforeAll(() => {
+ optionsDirectory = path.join(tempRootDirectory, 'with-scan-options');
+ fs.mkdirSync(optionsDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(optionsDirectory, 'angular-doctor.config.json'),
+ JSON.stringify({
+ ignore: { rules: ['@angular-eslint/component-selector'] },
+ lint: true,
+ deadCode: false,
+ verbose: true,
+ diff: 'main',
+ }),
+ );
+ });
+
+ it('loads scan options alongside ignore config', () => {
+ const config = loadConfig(optionsDirectory);
+ expect(config).toEqual({
+ ignore: { rules: ['@angular-eslint/component-selector'] },
+ lint: true,
+ deadCode: false,
+ verbose: true,
+ diff: 'main',
+ });
+ });
+
+ it('loads diff as boolean', () => {
+ const boolDiffDirectory = path.join(tempRootDirectory, 'with-bool-diff');
+ fs.mkdirSync(boolDiffDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(boolDiffDirectory, 'angular-doctor.config.json'),
+ JSON.stringify({ diff: true }),
+ );
+ const config = loadConfig(boolDiffDirectory);
+ expect(config?.diff).toBe(true);
+ });
+ });
+
+ describe('invalid config', () => {
+ let invalidJsonDirectory: string;
+ let nonObjectDirectory: string;
+
+ beforeAll(() => {
+ invalidJsonDirectory = path.join(tempRootDirectory, 'invalid-json');
+ fs.mkdirSync(invalidJsonDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(invalidJsonDirectory, 'angular-doctor.config.json'),
+ 'not valid json{{{',
+ );
+
+ nonObjectDirectory = path.join(tempRootDirectory, 'non-object-config');
+ fs.mkdirSync(nonObjectDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(nonObjectDirectory, 'angular-doctor.config.json'),
+ JSON.stringify([1, 2, 3]),
+ );
+ });
+
+ it('returns null for malformed JSON', () => {
+ const config = loadConfig(invalidJsonDirectory);
+ expect(config).toBeNull();
+ });
+
+ it('returns null when config is not an object', () => {
+ const config = loadConfig(nonObjectDirectory);
+ expect(config).toBeNull();
+ });
+
+ it('ignores non-object angularDoctor key in package.json', () => {
+ const arrayConfigDirectory = path.join(tempRootDirectory, 'array-pkg-config');
+ fs.mkdirSync(arrayConfigDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(arrayConfigDirectory, 'package.json'),
+ JSON.stringify({ name: 'test', angularDoctor: 'not-an-object' }),
+ );
+ const config = loadConfig(arrayConfigDirectory);
+ expect(config).toBeNull();
+ });
+ });
+});
diff --git a/packages/angular-doctor/tests/match-glob-pattern.test.ts b/packages/angular-doctor/tests/match-glob-pattern.test.ts
new file mode 100644
index 0000000..aa6bf30
--- /dev/null
+++ b/packages/angular-doctor/tests/match-glob-pattern.test.ts
@@ -0,0 +1,48 @@
+import { matchGlobPattern } from '@framework-doctor/core';
+import { describe, expect, it } from 'vitest';
+
+describe('matchGlobPattern', () => {
+ it('matches exact file paths', () => {
+ expect(matchGlobPattern('src/app.component.ts', 'src/app.component.ts')).toBe(true);
+ expect(matchGlobPattern('src/app.component.ts', 'src/other.component.ts')).toBe(false);
+ });
+
+ it('matches single wildcard for filenames', () => {
+ expect(matchGlobPattern('src/app.component.html', 'src/*.html')).toBe(true);
+ expect(matchGlobPattern('src/utils.ts', 'src/*.html')).toBe(false);
+ expect(matchGlobPattern('src/nested/app.component.html', 'src/*.html')).toBe(false);
+ });
+
+ it('matches double wildcard at the end', () => {
+ expect(matchGlobPattern('src/generated/foo.ts', 'src/generated/**')).toBe(true);
+ expect(matchGlobPattern('src/generated/bar/baz.ts', 'src/generated/**')).toBe(true);
+ expect(matchGlobPattern('src/other/foo.ts', 'src/generated/**')).toBe(false);
+ });
+
+ it('matches double wildcard with trailing slash and filename', () => {
+ expect(matchGlobPattern('src/foo/test.ts', 'src/**/test.ts')).toBe(true);
+ expect(matchGlobPattern('src/foo/bar/test.ts', 'src/**/test.ts')).toBe(true);
+ expect(matchGlobPattern('src/test.ts', 'src/**/test.ts')).toBe(true);
+ });
+
+ it('matches double wildcard at the start', () => {
+ expect(matchGlobPattern('src/components/button.component.ts', '**/*.ts')).toBe(true);
+ expect(matchGlobPattern('app.component.ts', '**/*.ts')).toBe(true);
+ expect(matchGlobPattern('deep/nested/path/file.ts', '**/*.ts')).toBe(true);
+ expect(matchGlobPattern('file.js', '**/*.ts')).toBe(false);
+ });
+
+ it('matches question mark as single character', () => {
+ expect(matchGlobPattern('src/a.ts', 'src/?.ts')).toBe(true);
+ expect(matchGlobPattern('src/ab.ts', 'src/?.ts')).toBe(false);
+ });
+
+ it('escapes regex special characters in patterns', () => {
+ expect(matchGlobPattern('src/file.test.ts', 'src/*.test.ts')).toBe(true);
+ expect(matchGlobPattern('src/filetestts', 'src/*.test.ts')).toBe(false);
+ });
+
+ it('normalizes backslashes to forward slashes', () => {
+ expect(matchGlobPattern('src\\generated\\foo.ts', 'src/generated/**')).toBe(true);
+ });
+});
diff --git a/packages/angular-doctor/tests/placeholder.test.ts b/packages/angular-doctor/tests/placeholder.test.ts
new file mode 100644
index 0000000..73033b7
--- /dev/null
+++ b/packages/angular-doctor/tests/placeholder.test.ts
@@ -0,0 +1,8 @@
+import { describe, expect, it } from 'vitest';
+
+describe('angular-doctor', () => {
+ it('exports diagnose', async () => {
+ const { diagnose } = await import('../src/index.js');
+ expect(typeof diagnose).toBe('function');
+ });
+});
diff --git a/packages/angular-doctor/tests/scan.test.ts b/packages/angular-doctor/tests/scan.test.ts
new file mode 100644
index 0000000..5600354
--- /dev/null
+++ b/packages/angular-doctor/tests/scan.test.ts
@@ -0,0 +1,84 @@
+import fs from 'node:fs';
+import os from 'node:os';
+import path from 'node:path';
+import { afterAll, describe, expect, it, vi } from 'vitest';
+import { scan } from '../src/scan.js';
+
+const FIXTURES_DIRECTORY = path.resolve(import.meta.dirname, 'fixtures');
+
+vi.mock('ora', () => ({
+ default: () => ({
+ text: '',
+ start: function () {
+ return this;
+ },
+ stop: function () {
+ return this;
+ },
+ succeed: () => {},
+ fail: () => {},
+ }),
+}));
+
+const noAngularTempDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'angular-doctor-test-'));
+fs.writeFileSync(
+ path.join(noAngularTempDirectory, 'package.json'),
+ JSON.stringify({ name: 'no-angular', dependencies: {} }),
+);
+
+afterAll(() => {
+ fs.rmSync(noAngularTempDirectory, { recursive: true, force: true });
+});
+
+describe('scan', () => {
+ it('completes without throwing on a valid Angular project', async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ await scan(path.join(FIXTURES_DIRECTORY, 'basic-angular'), {
+ lint: true,
+ deadCode: false,
+ });
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ });
+
+ it('throws when Angular dependency is missing', async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ await expect(scan(noAngularTempDirectory, { lint: true, deadCode: false })).rejects.toThrow(
+ 'No Angular dependency found in package.json',
+ );
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ });
+
+ it('skips lint when option is disabled', async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ await scan(path.join(FIXTURES_DIRECTORY, 'basic-angular'), {
+ lint: false,
+ deadCode: false,
+ });
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ });
+
+ it('runs lint and dead code in parallel when both enabled', async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ const startTime = performance.now();
+ await scan(path.join(FIXTURES_DIRECTORY, 'basic-angular'), {
+ lint: true,
+ deadCode: true,
+ });
+ const elapsedMilliseconds = performance.now() - startTime;
+
+ expect(elapsedMilliseconds).toBeLessThan(30_000);
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ });
+});
diff --git a/packages/angular-doctor/tests/score.test.ts b/packages/angular-doctor/tests/score.test.ts
new file mode 100644
index 0000000..d65b444
--- /dev/null
+++ b/packages/angular-doctor/tests/score.test.ts
@@ -0,0 +1,117 @@
+import { describe, expect, it } from 'vitest';
+import { calculateScore } from '../src/utils/calculate-score.js';
+
+const baseDiagnostic = {
+ message: '',
+ help: '',
+ line: 1,
+ column: 1,
+ category: 'correctness',
+};
+
+describe('calculateScore', () => {
+ it('returns perfect score when there are no diagnostics', () => {
+ expect(calculateScore([], 8)).toEqual({ score: 100, label: 'Great' });
+ });
+
+ it('penalizes errors more than warnings', () => {
+ const result = calculateScore(
+ [
+ {
+ ...baseDiagnostic,
+ filePath: 'src/a.component.ts',
+ plugin: '@angular-eslint',
+ rule: 'x',
+ severity: 'error',
+ },
+ {
+ ...baseDiagnostic,
+ filePath: 'src/b.component.ts',
+ plugin: '@angular-eslint',
+ rule: 'y',
+ severity: 'warning',
+ },
+ ],
+ 8,
+ );
+
+ expect(result.score).toBe(91);
+ expect(result.label).toBe('Great');
+ expect(result.breakdown).toBeDefined();
+ expect(result.breakdown?.typesPenalty).toBe(3.5);
+ expect(result.breakdown?.volumePenalty).toBeCloseTo(2.6);
+ expect(result.breakdown?.spreadPenalty).toBe(3);
+ });
+
+ it('uses zero spread penalty when totalFilesScanned is zero', () => {
+ const result = calculateScore(
+ [
+ {
+ ...baseDiagnostic,
+ filePath: 'src/a.component.ts',
+ plugin: '@angular-eslint',
+ rule: 'x',
+ severity: 'error',
+ },
+ ],
+ 0,
+ );
+
+ expect(result.breakdown?.spreadPenalty).toBe(0);
+ });
+
+ it('produces ~81 for 6 errors, 7 warnings, 2/8 files with UE=2, UW=4', () => {
+ const diagnostics: Parameters[0] = [];
+ for (let i = 0; i < 6; i++) {
+ diagnostics.push({
+ ...baseDiagnostic,
+ filePath: i < 3 ? 'src/a.component.ts' : 'src/b.component.ts',
+ plugin: '@angular-eslint',
+ rule: i < 4 ? 'rule-a' : 'rule-b',
+ severity: 'error',
+ });
+ }
+ for (let i = 0; i < 7; i++) {
+ diagnostics.push({
+ ...baseDiagnostic,
+ filePath: i < 4 ? 'src/a.component.ts' : 'src/b.component.ts',
+ plugin: 'eslint',
+ rule: `rule-${i % 4}`,
+ severity: 'warning',
+ });
+ }
+
+ const result = calculateScore(diagnostics, 8);
+
+ expect(result.score).toBe(81);
+ expect(result.label).toBe('Great');
+ expect(result.breakdown?.uniqueErrorRules).toBe(2);
+ expect(result.breakdown?.uniqueWarningRules).toBe(4);
+ expect(result.breakdown?.errorCount).toBe(6);
+ expect(result.breakdown?.warningCount).toBe(7);
+ expect(result.breakdown?.filesWithDiagnostics).toBe(2);
+ expect(result.breakdown?.totalFilesScanned).toBe(8);
+ });
+
+ it('caps score at 59 when guardrail input is triggered', () => {
+ const result = calculateScore(
+ [
+ {
+ ...baseDiagnostic,
+ filePath: 'src/a.component.ts',
+ plugin: 'eslint',
+ rule: 'no-console',
+ severity: 'warning',
+ },
+ ],
+ 8,
+ {
+ hasHighOrCriticalSecurityFindings: true,
+ },
+ );
+
+ expect(result.score).toBe(59);
+ expect(result.breakdown?.didApplyGuardrail).toBe(true);
+ expect(result.breakdown?.guardrailReasons).toEqual(['high/critical security findings']);
+ });
+});
diff --git a/packages/angular-doctor/tsconfig.json b/packages/angular-doctor/tsconfig.json
new file mode 100644
index 0000000..bf2f530
--- /dev/null
+++ b/packages/angular-doctor/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "noEmit": true,
+ "declarationMap": true
+ },
+ "include": ["src", "tests"]
+}
diff --git a/packages/angular-doctor/tsdown.config.ts b/packages/angular-doctor/tsdown.config.ts
new file mode 100644
index 0000000..9aabe6b
--- /dev/null
+++ b/packages/angular-doctor/tsdown.config.ts
@@ -0,0 +1,33 @@
+import fs from 'node:fs';
+import { defineConfig } from 'tsdown';
+
+const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8')) as {
+ version: string;
+};
+
+export default defineConfig([
+ {
+ entry: {
+ cli: './src/cli.ts',
+ },
+ external: ['knip', 'eslint', 'angular-eslint'],
+ dts: true,
+ target: 'node18',
+ platform: 'node',
+ env: {
+ VERSION: process.env.VERSION ?? packageJson.version,
+ },
+ fixedExtension: false,
+ banner: '#!/usr/bin/env node',
+ },
+ {
+ entry: {
+ index: './src/index.ts',
+ },
+ external: ['knip', 'eslint', 'angular-eslint'],
+ dts: true,
+ target: 'node18',
+ platform: 'node',
+ fixedExtension: false,
+ },
+]);
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index 2ca93fb..47bd233 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,16 @@
# @framework-doctor/cli
+## 1.0.4
+
+### Patch Changes
+
+- angular doctor
+- Updated dependencies
+ - @framework-doctor/angular@1.0.4
+ - @framework-doctor/svelte@1.0.4
+ - @framework-doctor/react@1.0.4
+ - @framework-doctor/vue@1.0.4
+
## 1.0.3
### Patch Changes
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 52e9abd..e15be18 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@framework-doctor/cli",
- "version": "1.0.3",
+ "version": "1.0.4",
"description": "Auto-detect framework and run the right doctor",
"author": {
"name": "Pitis Radu",
@@ -45,8 +45,9 @@
"prepublishOnly": "pnpm run build"
},
"dependencies": {
- "@framework-doctor/svelte": "workspace:*",
+ "@framework-doctor/angular": "workspace:*",
"@framework-doctor/react": "workspace:*",
+ "@framework-doctor/svelte": "workspace:*",
"@framework-doctor/vue": "workspace:*"
},
"devDependencies": {
diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts
index 2ab9e55..f6f9202 100644
--- a/packages/cli/src/cli.ts
+++ b/packages/cli/src/cli.ts
@@ -68,10 +68,13 @@ const runDoctor = (framework: Framework, args: string[]): number => {
}
if (framework === 'angular') {
- console.error(
- `\n Angular Doctor is coming soon. For now, use the framework-specific package when available.\n`,
- );
- return 1;
+ const cliPath = resolveDoctorCli('@framework-doctor/angular');
+ const fullArgs = [dirArg, ...restArgs];
+ const result = spawnSync(process.execPath, [cliPath, ...fullArgs], {
+ stdio: 'inherit',
+ cwd,
+ });
+ return result.status ?? 1;
}
console.error(`
diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md
index e483ca7..d985731 100644
--- a/packages/core/CHANGELOG.md
+++ b/packages/core/CHANGELOG.md
@@ -1,5 +1,11 @@
# @framework-doctor/core
+## 1.0.4
+
+### Patch Changes
+
+- angular doctor
+
## 1.0.3
### Patch Changes
diff --git a/packages/core/package.json b/packages/core/package.json
index 1c6f080..2e291c1 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,6 +1,6 @@
{
"name": "@framework-doctor/core",
- "version": "1.0.3",
+ "version": "1.0.4",
"description": "Shared utilities for Framework Doctor (telemetry, config)",
"author": {
"name": "Pitis Radu",
diff --git a/packages/core/src/get-diff-files.ts b/packages/core/src/get-diff-files.ts
index 6f0313b..3765b22 100644
--- a/packages/core/src/get-diff-files.ts
+++ b/packages/core/src/get-diff-files.ts
@@ -1,16 +1,17 @@
-import { execSync } from 'node:child_process';
+import { spawnSync } from 'node:child_process';
import type { DiffInfo } from './types.js';
const DEFAULT_BRANCH_CANDIDATES = ['main', 'master'];
const getCurrentBranch = (directory: string): string | null => {
try {
- const branch = execSync('git rev-parse --abbrev-ref HEAD', {
+ const result = spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
cwd: directory,
+ encoding: 'utf-8',
stdio: 'pipe',
- })
- .toString()
- .trim();
+ });
+ if (result.status !== 0 || result.error) return null;
+ const branch = result.stdout?.trim() ?? '';
return branch === 'HEAD' ? null : branch;
} catch {
return null;
@@ -19,45 +20,54 @@ const getCurrentBranch = (directory: string): string | null => {
const detectDefaultBranch = (directory: string): string | null => {
try {
- const reference = execSync('git symbolic-ref refs/remotes/origin/HEAD', {
+ const result = spawnSync('git', ['symbolic-ref', 'refs/remotes/origin/HEAD'], {
cwd: directory,
+ encoding: 'utf-8',
stdio: 'pipe',
- })
- .toString()
- .trim();
- return reference.replace('refs/remotes/origin/', '');
+ });
+ if (result.status === 0 && !result.error && result.stdout) {
+ return result.stdout.trim().replace('refs/remotes/origin/', '');
+ }
} catch {
- for (const candidate of DEFAULT_BRANCH_CANDIDATES) {
- try {
- execSync(`git rev-parse --verify ${candidate}`, {
- cwd: directory,
- stdio: 'pipe',
- });
- return candidate;
- } catch {
- // try next candidate
- }
+ // fall through to candidates
+ }
+ for (const candidate of DEFAULT_BRANCH_CANDIDATES) {
+ try {
+ const verifyResult = spawnSync('git', ['rev-parse', '--verify', candidate], {
+ cwd: directory,
+ stdio: 'pipe',
+ });
+ if (verifyResult.status === 0 && !verifyResult.error) return candidate;
+ } catch {
+ // try next candidate
}
- return null;
}
+ return null;
};
const getChangedFilesSinceBranch = (directory: string, baseBranch: string): string[] => {
try {
- const mergeBase = execSync(`git merge-base ${baseBranch} HEAD`, {
- cwd: directory,
- stdio: 'pipe',
- })
- .toString()
- .trim();
-
- const output = execSync(`git diff --name-only --diff-filter=ACMR --relative ${mergeBase}`, {
+ const mergeBaseResult = spawnSync('git', ['merge-base', baseBranch, 'HEAD'], {
cwd: directory,
+ encoding: 'utf-8',
stdio: 'pipe',
- })
- .toString()
- .trim();
-
+ });
+ if (mergeBaseResult.status !== 0 || mergeBaseResult.error || !mergeBaseResult.stdout) {
+ return [];
+ }
+ const mergeBase = mergeBaseResult.stdout.trim();
+
+ const diffResult = spawnSync(
+ 'git',
+ ['diff', '--name-only', '--diff-filter=ACMR', '--relative', mergeBase],
+ {
+ cwd: directory,
+ encoding: 'utf-8',
+ stdio: 'pipe',
+ },
+ );
+ if (diffResult.status !== 0 || diffResult.error) return [];
+ const output = diffResult.stdout?.trim() ?? '';
if (!output) return [];
return output.split('\n').filter(Boolean);
} catch {
@@ -67,12 +77,17 @@ const getChangedFilesSinceBranch = (directory: string, baseBranch: string): stri
const getUncommittedChangedFiles = (directory: string): string[] => {
try {
- const output = execSync('git diff --name-only --diff-filter=ACMR --relative HEAD', {
- cwd: directory,
- stdio: 'pipe',
- })
- .toString()
- .trim();
+ const result = spawnSync(
+ 'git',
+ ['diff', '--name-only', '--diff-filter=ACMR', '--relative', 'HEAD'],
+ {
+ cwd: directory,
+ encoding: 'utf-8',
+ stdio: 'pipe',
+ },
+ );
+ if (result.status !== 0 || result.error) return [];
+ const output = result.stdout?.trim() ?? '';
if (!output) return [];
return output.split('\n').filter(Boolean);
} catch {
@@ -110,6 +125,8 @@ export const SOURCE_FILE_PATTERN_REACT = /\.(tsx?|jsx?)$/;
export const SOURCE_FILE_PATTERN_VUE = /\.(vue|ts|tsx|js|jsx|mts|cts|mjs|cjs)$/;
+export const SOURCE_FILE_PATTERN_ANGULAR = /\.(html|ts|mts|cts|mjs|cjs)$/;
+
export const filterSourceFiles = (
filePaths: string[],
pattern: RegExp = SOURCE_FILE_PATTERN_JS_TS,
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index c490ce2..b558b66 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -21,6 +21,7 @@ export {
WARNING_VOLUME_COEFFICIENT,
} from './constants.js';
export {
+ SOURCE_FILE_PATTERN_ANGULAR,
SOURCE_FILE_PATTERN_JS_TS,
SOURCE_FILE_PATTERN_REACT,
SOURCE_FILE_PATTERN_SVELTE,
@@ -38,7 +39,10 @@ export { loadConfig } from './load-config.js';
export {
DANGEROUSLY_SET_INNER_HTML_RULE,
NO_AT_HTML_RULE,
+ NO_BYPASS_SECURITY_TRUST_RULE,
+ NO_INNER_HTML_BINDING_RULE,
NO_V_HTML_RULE,
+ SOURCE_FILE_PATTERN_WITH_ANGULAR,
SOURCE_FILE_PATTERN_WITH_VUE,
UNIVERSAL_SECURITY_RULES,
getFilesToScan,
diff --git a/packages/core/src/security/angular-rules.ts b/packages/core/src/security/angular-rules.ts
new file mode 100644
index 0000000..b9d3edb
--- /dev/null
+++ b/packages/core/src/security/angular-rules.ts
@@ -0,0 +1,23 @@
+import type { SecurityRule } from './rule.js';
+
+const ANGULAR_TEMPLATE_EXTENSIONS = ['.html', '.ts'];
+
+export const NO_INNER_HTML_BINDING_RULE: SecurityRule = {
+ id: 'no-inner-html-binding',
+ pattern: /\[innerHTML\]\s*=/g,
+ message: 'Binding to [innerHTML] can lead to XSS if content is unsanitized.',
+ help: 'Sanitize user-controlled content (e.g. with DomSanitizer.sanitize()) or avoid [innerHTML] for untrusted input.',
+ severity: 'error',
+ fileExtensions: ANGULAR_TEMPLATE_EXTENSIONS,
+};
+
+const ANGULAR_TS_EXTENSIONS = ['.ts', '.mts', '.cts'];
+
+export const NO_BYPASS_SECURITY_TRUST_RULE: SecurityRule = {
+ id: 'no-bypass-security-trust',
+ pattern: /\.bypassSecurityTrust\w+\s*\(/g,
+ message: 'bypassSecurityTrust* disables Angular sanitization and can lead to XSS.',
+ help: 'Avoid bypassing security for user-controlled content. Use DomSanitizer.sanitize() or trusted sources only.',
+ severity: 'error',
+ fileExtensions: ANGULAR_TS_EXTENSIONS,
+};
diff --git a/packages/core/src/security/get-files-to-scan.ts b/packages/core/src/security/get-files-to-scan.ts
index 80799b5..8e029fe 100644
--- a/packages/core/src/security/get-files-to-scan.ts
+++ b/packages/core/src/security/get-files-to-scan.ts
@@ -6,6 +6,8 @@ export const SOURCE_FILE_PATTERN_FULL = /\.(svelte|ts|tsx|js|jsx|mts|cts|mjs|cjs
export const SOURCE_FILE_PATTERN_WITH_VUE = /\.(vue|svelte|ts|tsx|js|jsx|mts|cts|mjs|cjs)$/;
+export const SOURCE_FILE_PATTERN_WITH_ANGULAR = /\.(html|ts|mts|cts|mjs|cjs)$/;
+
export const getFilesToScan = (
rootDirectory: string,
includePaths: string[],
diff --git a/packages/core/src/security/index.ts b/packages/core/src/security/index.ts
index aa78a72..05a0b47 100644
--- a/packages/core/src/security/index.ts
+++ b/packages/core/src/security/index.ts
@@ -1,4 +1,9 @@
-export { SOURCE_FILE_PATTERN_WITH_VUE, getFilesToScan } from './get-files-to-scan.js';
+export { NO_BYPASS_SECURITY_TRUST_RULE, NO_INNER_HTML_BINDING_RULE } from './angular-rules.js';
+export {
+ SOURCE_FILE_PATTERN_WITH_ANGULAR,
+ SOURCE_FILE_PATTERN_WITH_VUE,
+ getFilesToScan,
+} from './get-files-to-scan.js';
export { DANGEROUSLY_SET_INNER_HTML_RULE } from './react-rules.js';
export type { SecurityRule } from './rule.js';
export { runSecurityScan } from './run-security-scan.js';
diff --git a/packages/react-doctor/CHANGELOG.md b/packages/react-doctor/CHANGELOG.md
index 786a357..a87d63b 100644
--- a/packages/react-doctor/CHANGELOG.md
+++ b/packages/react-doctor/CHANGELOG.md
@@ -1,5 +1,13 @@
# react-doctor
+## 1.0.4
+
+### Patch Changes
+
+- angular doctor
+- Updated dependencies
+ - @framework-doctor/core@1.0.4
+
## 1.0.3
### Patch Changes
diff --git a/packages/react-doctor/package.json b/packages/react-doctor/package.json
index 22be9ec..4e0284f 100644
--- a/packages/react-doctor/package.json
+++ b/packages/react-doctor/package.json
@@ -1,6 +1,6 @@
{
"name": "@framework-doctor/react",
- "version": "1.0.3",
+ "version": "1.0.4",
"description": "Diagnose and fix performance issues in your React app",
"author": {
"name": "Pitis Radu",
diff --git a/packages/react-doctor/src/utils/check-reduced-motion.ts b/packages/react-doctor/src/utils/check-reduced-motion.ts
index 01a8551..2ff9b60 100644
--- a/packages/react-doctor/src/utils/check-reduced-motion.ts
+++ b/packages/react-doctor/src/utils/check-reduced-motion.ts
@@ -1,4 +1,4 @@
-import { execSync } from 'node:child_process';
+import { spawnSync } from 'node:child_process';
import fs from 'node:fs';
import path from 'node:path';
import { MOTION_LIBRARY_PACKAGES } from '../plugin/constants.js';
@@ -6,7 +6,7 @@ import type { Diagnostic } from '../types.js';
import { readPackageJson } from './read-package-json.js';
const REDUCED_MOTION_GREP_PATTERN = 'prefers-reduced-motion|useReducedMotion';
-const REDUCED_MOTION_FILE_GLOBS = '"*.ts" "*.tsx" "*.js" "*.jsx" "*.css" "*.scss"';
+const REDUCED_MOTION_FILE_GLOBS = ['*.ts', '*.tsx', '*.js', '*.jsx', '*.css', '*.scss'] as const;
const MISSING_REDUCED_MOTION_DIAGNOSTIC: Diagnostic = {
filePath: 'package.json',
@@ -39,11 +39,13 @@ export const checkReducedMotion = (rootDirectory: string): Diagnostic[] => {
if (!hasMotionLibrary) return [];
try {
- execSync(`git grep -ql -E "${REDUCED_MOTION_GREP_PATTERN}" -- ${REDUCED_MOTION_FILE_GLOBS}`, {
- cwd: rootDirectory,
- stdio: 'pipe',
- });
- return [];
+ const result = spawnSync(
+ 'git',
+ ['grep', '-ql', '-E', REDUCED_MOTION_GREP_PATTERN, '--', ...REDUCED_MOTION_FILE_GLOBS],
+ { cwd: rootDirectory, encoding: 'utf-8', stdio: 'pipe' },
+ );
+ if (result.status === 0 && !result.error) return [];
+ return [MISSING_REDUCED_MOTION_DIAGNOSTIC];
} catch {
return [MISSING_REDUCED_MOTION_DIAGNOSTIC];
}
diff --git a/packages/react-doctor/src/utils/resolve-compatible-node.ts b/packages/react-doctor/src/utils/resolve-compatible-node.ts
index f2db9c0..f64b5e0 100644
--- a/packages/react-doctor/src/utils/resolve-compatible-node.ts
+++ b/packages/react-doctor/src/utils/resolve-compatible-node.ts
@@ -1,4 +1,4 @@
-import { execSync } from 'node:child_process';
+import { execSync, spawnSync } from 'node:child_process';
import { existsSync, readdirSync } from 'node:fs';
import os from 'node:os';
import path from 'node:path';
@@ -71,7 +71,9 @@ const findCompatibleNvmBinary = (): string | null => {
const getNodeVersionFromBinary = (binaryPath: string): string | null => {
try {
- return execSync(`"${binaryPath}" --version`, { encoding: 'utf-8' }).trim();
+ const result = spawnSync(binaryPath, ['--version'], { encoding: 'utf-8' });
+ if (result.status !== 0 || result.error) return null;
+ return result.stdout?.trim() ?? null;
} catch {
return null;
}
@@ -85,8 +87,9 @@ export const installNodeViaNvm = (): boolean => {
if (!existsSync(nvmScript)) return false;
try {
- execSync(`bash -c ". '${nvmScript}' && nvm install ${OXLINT_RECOMMENDED_NODE_MAJOR}"`, {
+ execSync(`bash -c '. "$NVM_SCRIPT_PATH" && nvm install ${OXLINT_RECOMMENDED_NODE_MAJOR}'`, {
stdio: 'inherit',
+ env: { ...process.env, NVM_SCRIPT_PATH: nvmScript },
});
return findCompatibleNvmBinary() !== null;
} catch {
diff --git a/packages/react-doctor/src/utils/skill-prompt.ts b/packages/react-doctor/src/utils/skill-prompt.ts
index a42c46e..42d7fcf 100644
--- a/packages/react-doctor/src/utils/skill-prompt.ts
+++ b/packages/react-doctor/src/utils/skill-prompt.ts
@@ -1,5 +1,5 @@
import { highlighter, logger, readGlobalConfig, writeGlobalConfig } from '@framework-doctor/core';
-import { execSync } from 'node:child_process';
+import { spawnSync } from 'node:child_process';
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
import { homedir } from 'node:os';
import { join } from 'node:path';
@@ -69,8 +69,8 @@ const writeSkillFiles = (directory: string): void => {
const isCommandAvailable = (command: string): boolean => {
try {
const whichCommand = process.platform === 'win32' ? 'where' : 'which';
- execSync(`${whichCommand} ${command}`, { stdio: 'ignore' });
- return true;
+ const result = spawnSync(whichCommand, [command], { stdio: 'ignore' });
+ return result.status === 0 && !result.error;
} catch {
return false;
}
diff --git a/packages/svelte-doctor/CHANGELOG.md b/packages/svelte-doctor/CHANGELOG.md
index 7ddc2e1..372809e 100644
--- a/packages/svelte-doctor/CHANGELOG.md
+++ b/packages/svelte-doctor/CHANGELOG.md
@@ -1,5 +1,13 @@
# svelte-doctor
+## 1.0.4
+
+### Patch Changes
+
+- angular doctor
+- Updated dependencies
+ - @framework-doctor/core@1.0.4
+
## 1.0.3
### Patch Changes
diff --git a/packages/svelte-doctor/package.json b/packages/svelte-doctor/package.json
index 3dd0342..0ac798c 100644
--- a/packages/svelte-doctor/package.json
+++ b/packages/svelte-doctor/package.json
@@ -1,6 +1,6 @@
{
"name": "@framework-doctor/svelte",
- "version": "1.0.3",
+ "version": "1.0.4",
"description": "Diagnose and improve Svelte codebase health",
"author": {
"name": "Pitis Radu",
diff --git a/packages/svelte-doctor/src/utils/check-reduced-motion.ts b/packages/svelte-doctor/src/utils/check-reduced-motion.ts
index d5ac3b5..b2d9eed 100644
--- a/packages/svelte-doctor/src/utils/check-reduced-motion.ts
+++ b/packages/svelte-doctor/src/utils/check-reduced-motion.ts
@@ -1,4 +1,4 @@
-import { execSync } from 'node:child_process';
+import { spawnSync } from 'node:child_process';
import fs from 'node:fs';
import path from 'node:path';
import type { Diagnostic } from '../types.js';
@@ -6,7 +6,15 @@ import { readPackageJson } from './read-package-json.js';
const MOTION_LIBRARY_PACKAGES = new Set(['framer-motion', 'motion']);
const REDUCED_MOTION_GREP_PATTERN = 'prefers-reduced-motion|useReducedMotion';
-const REDUCED_MOTION_FILE_GLOBS = '"*.svelte" "*.ts" "*.tsx" "*.js" "*.jsx" "*.css" "*.scss"';
+const REDUCED_MOTION_FILE_GLOBS = [
+ '*.svelte',
+ '*.ts',
+ '*.tsx',
+ '*.js',
+ '*.jsx',
+ '*.css',
+ '*.scss',
+] as const;
const MISSING_REDUCED_MOTION_DIAGNOSTIC: Diagnostic = {
filePath: 'package.json',
@@ -41,11 +49,13 @@ export const checkReducedMotion = (rootDirectory: string): Diagnostic[] => {
if (!hasMotionLibrary) return [];
try {
- execSync(`git grep -ql -E "${REDUCED_MOTION_GREP_PATTERN}" -- ${REDUCED_MOTION_FILE_GLOBS}`, {
- cwd: rootDirectory,
- stdio: 'pipe',
- });
- return [];
+ const result = spawnSync(
+ 'git',
+ ['grep', '-ql', '-E', REDUCED_MOTION_GREP_PATTERN, '--', ...REDUCED_MOTION_FILE_GLOBS],
+ { cwd: rootDirectory, encoding: 'utf-8', stdio: 'pipe' },
+ );
+ if (result.status === 0 && !result.error) return [];
+ return [MISSING_REDUCED_MOTION_DIAGNOSTIC];
} catch {
return [MISSING_REDUCED_MOTION_DIAGNOSTIC];
}
diff --git a/packages/svelte-doctor/src/utils/skill-prompt.ts b/packages/svelte-doctor/src/utils/skill-prompt.ts
index d4fb781..568718a 100644
--- a/packages/svelte-doctor/src/utils/skill-prompt.ts
+++ b/packages/svelte-doctor/src/utils/skill-prompt.ts
@@ -1,5 +1,5 @@
import { highlighter, logger, readGlobalConfig, writeGlobalConfig } from '@framework-doctor/core';
-import { execSync } from 'node:child_process';
+import { spawnSync } from 'node:child_process';
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
import { homedir } from 'node:os';
import { join } from 'node:path';
@@ -69,8 +69,8 @@ const writeSkillFiles = (directory: string): void => {
const isCommandAvailable = (command: string): boolean => {
try {
const whichCommand = process.platform === 'win32' ? 'where' : 'which';
- execSync(`${whichCommand} ${command}`, { stdio: 'ignore' });
- return true;
+ const result = spawnSync(whichCommand, [command], { stdio: 'ignore' });
+ return result.status === 0 && !result.error;
} catch {
return false;
}
diff --git a/packages/svelte-doctor/tests/colorize-by-score.test.ts b/packages/svelte-doctor/tests/colorize-by-score.test.ts
new file mode 100644
index 0000000..1004b52
--- /dev/null
+++ b/packages/svelte-doctor/tests/colorize-by-score.test.ts
@@ -0,0 +1,46 @@
+import { colorizeByScore } from '@framework-doctor/core';
+import { describe, expect, it } from 'vitest';
+
+describe('colorizeByScore', () => {
+ it('returns a string for high scores', () => {
+ const result = colorizeByScore('Great', 90);
+ expect(typeof result).toBe('string');
+ expect(result).toContain('Great');
+ });
+
+ it('returns a string for medium scores', () => {
+ const result = colorizeByScore('OK', 60);
+ expect(typeof result).toBe('string');
+ expect(result).toContain('OK');
+ });
+
+ it('returns a string for low scores', () => {
+ const result = colorizeByScore('Critical', 30);
+ expect(typeof result).toBe('string');
+ expect(result).toContain('Critical');
+ });
+
+ it('does not throw at good threshold boundary (75)', () => {
+ expect(() => colorizeByScore('text', 75)).not.toThrow();
+ expect(() => colorizeByScore('text', 74)).not.toThrow();
+ expect(colorizeByScore('text', 75)).toContain('text');
+ expect(colorizeByScore('text', 74)).toContain('text');
+ });
+
+ it('does not throw at ok threshold boundary (50)', () => {
+ expect(() => colorizeByScore('text', 50)).not.toThrow();
+ expect(() => colorizeByScore('text', 49)).not.toThrow();
+ expect(colorizeByScore('text', 50)).toContain('text');
+ expect(colorizeByScore('text', 49)).toContain('text');
+ });
+
+ it('handles score of zero', () => {
+ const result = colorizeByScore('zero', 0);
+ expect(result).toContain('zero');
+ });
+
+ it('handles perfect score', () => {
+ const result = colorizeByScore('perfect', 100);
+ expect(result).toContain('perfect');
+ });
+});
diff --git a/packages/svelte-doctor/tests/filter-diagnostics.test.ts b/packages/svelte-doctor/tests/filter-diagnostics.test.ts
new file mode 100644
index 0000000..a8e6ce3
--- /dev/null
+++ b/packages/svelte-doctor/tests/filter-diagnostics.test.ts
@@ -0,0 +1,130 @@
+import { describe, expect, it } from 'vitest';
+import type { Diagnostic, SvelteDoctorConfig } from '../src/types.js';
+import { filterIgnoredDiagnostics } from '../src/utils/filter-diagnostics.js';
+
+const createDiagnostic = (overrides: Partial = {}): Diagnostic => ({
+ filePath: 'src/App.svelte',
+ plugin: 'svelte',
+ rule: 'no-at-html-tags',
+ severity: 'warning',
+ message: 'test message',
+ help: 'test help',
+ line: 1,
+ column: 1,
+ category: 'Correctness',
+ ...overrides,
+});
+
+describe('filterIgnoredDiagnostics', () => {
+ it('returns all diagnostics when config has no ignore rules', () => {
+ const diagnostics = [createDiagnostic()];
+ const config: SvelteDoctorConfig = {};
+ expect(filterIgnoredDiagnostics(diagnostics, config)).toEqual(diagnostics);
+ });
+
+ it('filters diagnostics matching ignored rules', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: 'svelte', rule: 'no-at-html-tags' }),
+ createDiagnostic({ plugin: 'svelte', rule: 'valid-compile' }),
+ createDiagnostic({ plugin: 'svelte-doctor', rule: 'no-giant-component' }),
+ ];
+ const config: SvelteDoctorConfig = {
+ ignore: {
+ rules: ['svelte/no-at-html-tags', 'svelte/valid-compile'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].rule).toBe('no-giant-component');
+ });
+
+ it('filters diagnostics matching ignored file patterns', () => {
+ const diagnostics = [
+ createDiagnostic({ filePath: 'src/generated/types.svelte' }),
+ createDiagnostic({ filePath: 'src/generated/api/client.svelte' }),
+ createDiagnostic({ filePath: 'src/components/Button.svelte' }),
+ ];
+ const config: SvelteDoctorConfig = {
+ ignore: {
+ files: ['src/generated/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].filePath).toBe('src/components/Button.svelte');
+ });
+
+ it('filters by both rules and files together', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: 'svelte', rule: 'no-at-html-tags', filePath: 'src/App.svelte' }),
+ createDiagnostic({ plugin: 'knip', rule: 'exports', filePath: 'src/generated/api.svelte' }),
+ createDiagnostic({
+ plugin: 'svelte-doctor',
+ rule: 'no-giant-component',
+ filePath: 'src/components/App.svelte',
+ }),
+ ];
+ const config: SvelteDoctorConfig = {
+ ignore: {
+ rules: ['svelte/no-at-html-tags'],
+ files: ['src/generated/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].rule).toBe('no-giant-component');
+ });
+
+ it('keeps all diagnostics when no rules or files match', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: 'svelte', rule: 'no-at-html-tags' }),
+ createDiagnostic({ plugin: 'knip', rule: 'exports' }),
+ ];
+ const config: SvelteDoctorConfig = {
+ ignore: {
+ rules: ['nonexistent/rule'],
+ files: ['nonexistent/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(2);
+ });
+
+ it('filters file paths with ./ prefix against patterns without it', () => {
+ const diagnostics = [
+ createDiagnostic({ filePath: './resources/js/components/ui/Button.svelte' }),
+ createDiagnostic({ filePath: './resources/js/marketing/Hero.svelte' }),
+ createDiagnostic({ filePath: './resources/js/pages/Home.svelte' }),
+ ];
+ const config: SvelteDoctorConfig = {
+ ignore: {
+ files: ['resources/js/components/ui/**', 'resources/js/marketing/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].filePath).toBe('./resources/js/pages/Home.svelte');
+ });
+
+ it('handles knip rule identifiers', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: 'knip', rule: 'exports' }),
+ createDiagnostic({ plugin: 'knip', rule: 'types' }),
+ createDiagnostic({ plugin: 'knip', rule: 'files' }),
+ ];
+ const config: SvelteDoctorConfig = {
+ ignore: {
+ rules: ['knip/exports', 'knip/types'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].rule).toBe('files');
+ });
+});
diff --git a/packages/svelte-doctor/tests/find-monorepo-root.test.ts b/packages/svelte-doctor/tests/find-monorepo-root.test.ts
new file mode 100644
index 0000000..4850fc6
--- /dev/null
+++ b/packages/svelte-doctor/tests/find-monorepo-root.test.ts
@@ -0,0 +1,33 @@
+import { findMonorepoRoot, isMonorepoRoot } from '@framework-doctor/core';
+import path from 'node:path';
+import { describe, expect, it } from 'vitest';
+
+const FIXTURES_DIRECTORY = path.resolve(import.meta.dirname, 'fixtures');
+
+describe('isMonorepoRoot', () => {
+ it('returns true for a directory with pnpm-workspace.yaml or workspaces', () => {
+ const nestedWorkspaces = path.join(FIXTURES_DIRECTORY, 'nested-workspaces');
+ expect(isMonorepoRoot(nestedWorkspaces)).toBe(true);
+ });
+
+ it('returns false for a non-monorepo project', () => {
+ const basicSvelte = path.join(FIXTURES_DIRECTORY, 'basic-svelte');
+ expect(isMonorepoRoot(basicSvelte)).toBe(false);
+ });
+
+ it('returns false for a nonexistent directory', () => {
+ expect(isMonorepoRoot('/nonexistent/path')).toBe(false);
+ });
+});
+
+describe('findMonorepoRoot', () => {
+ it('returns null when no monorepo root exists above directory', () => {
+ expect(findMonorepoRoot('/tmp')).toBeNull();
+ });
+
+ it('finds monorepo root from a nested workspace package', () => {
+ const nestedPackage = path.join(FIXTURES_DIRECTORY, 'nested-workspaces', 'packages', 'ui');
+ const monorepoRoot = findMonorepoRoot(nestedPackage);
+ expect(monorepoRoot).toBe(path.join(FIXTURES_DIRECTORY, 'nested-workspaces'));
+ });
+});
diff --git a/packages/svelte-doctor/tests/fixtures/basic-svelte/package.json b/packages/svelte-doctor/tests/fixtures/basic-svelte/package.json
new file mode 100644
index 0000000..6f41bfd
--- /dev/null
+++ b/packages/svelte-doctor/tests/fixtures/basic-svelte/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "basic-svelte",
+ "dependencies": {
+ "svelte": "^5.0.0"
+ }
+}
diff --git a/packages/svelte-doctor/tests/fixtures/nested-workspaces/apps/my-app/ClientApp/package.json b/packages/svelte-doctor/tests/fixtures/nested-workspaces/apps/my-app/ClientApp/package.json
new file mode 100644
index 0000000..2fad807
--- /dev/null
+++ b/packages/svelte-doctor/tests/fixtures/nested-workspaces/apps/my-app/ClientApp/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "my-app-client",
+ "dependencies": {
+ "svelte": "^5.0.0"
+ }
+}
diff --git a/packages/svelte-doctor/tests/fixtures/nested-workspaces/package.json b/packages/svelte-doctor/tests/fixtures/nested-workspaces/package.json
new file mode 100644
index 0000000..3d06325
--- /dev/null
+++ b/packages/svelte-doctor/tests/fixtures/nested-workspaces/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "nested-workspaces-fixture",
+ "private": true,
+ "workspaces": [
+ "apps/*/ClientApp",
+ "packages/*"
+ ]
+}
diff --git a/packages/svelte-doctor/tests/fixtures/nested-workspaces/packages/ui/package.json b/packages/svelte-doctor/tests/fixtures/nested-workspaces/packages/ui/package.json
new file mode 100644
index 0000000..5f550b7
--- /dev/null
+++ b/packages/svelte-doctor/tests/fixtures/nested-workspaces/packages/ui/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "ui",
+ "dependencies": {
+ "svelte": "^5.0.0"
+ }
+}
diff --git a/packages/svelte-doctor/tests/indent-multiline-text.test.ts b/packages/svelte-doctor/tests/indent-multiline-text.test.ts
new file mode 100644
index 0000000..cb2bb35
--- /dev/null
+++ b/packages/svelte-doctor/tests/indent-multiline-text.test.ts
@@ -0,0 +1,21 @@
+import { indentMultilineText } from '@framework-doctor/core';
+import { describe, expect, it } from 'vitest';
+
+describe('indentMultilineText', () => {
+ it('adds the prefix to a single line', () => {
+ const indentedText = indentMultilineText('Error: Something happened', ' ');
+
+ expect(indentedText).toBe(' Error: Something happened');
+ });
+
+ it('adds the prefix to every line in multiline text', () => {
+ const explanation =
+ 'Error: Calling setState synchronously within an effect can trigger cascading renders\n\nEffects are intended to synchronize state between React and external systems.\n* Update external systems with the latest state from React.\n* Subscribe for updates from external systems and set state in a callback.';
+
+ const indentedText = indentMultilineText(explanation, ' ');
+
+ expect(indentedText).toBe(
+ ' Error: Calling setState synchronously within an effect can trigger cascading renders\n \n Effects are intended to synchronize state between React and external systems.\n * Update external systems with the latest state from React.\n * Subscribe for updates from external systems and set state in a callback.',
+ );
+ });
+});
diff --git a/packages/svelte-doctor/tests/load-config.test.ts b/packages/svelte-doctor/tests/load-config.test.ts
new file mode 100644
index 0000000..75aa681
--- /dev/null
+++ b/packages/svelte-doctor/tests/load-config.test.ts
@@ -0,0 +1,192 @@
+import fs from 'node:fs';
+import os from 'node:os';
+import path from 'node:path';
+import { afterAll, beforeAll, describe, expect, it } from 'vitest';
+import { loadConfig } from '../src/utils/load-config.js';
+
+const tempRootDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'svelte-doctor-config-test-'));
+
+afterAll(() => {
+ fs.rmSync(tempRootDirectory, { recursive: true, force: true });
+});
+
+describe('loadConfig', () => {
+ describe('svelte-doctor.config.json', () => {
+ let configDirectory: string;
+
+ beforeAll(() => {
+ configDirectory = path.join(tempRootDirectory, 'with-config-file');
+ fs.mkdirSync(configDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(configDirectory, 'svelte-doctor.config.json'),
+ JSON.stringify({
+ ignore: {
+ rules: ['svelte/no-at-html-tags', 'knip/exports'],
+ files: ['src/generated/**'],
+ },
+ }),
+ );
+ });
+
+ it('loads config from svelte-doctor.config.json', () => {
+ const config = loadConfig(configDirectory);
+ expect(config).toEqual({
+ ignore: {
+ rules: ['svelte/no-at-html-tags', 'knip/exports'],
+ files: ['src/generated/**'],
+ },
+ });
+ });
+ });
+
+ describe('package.json svelteDoctor key', () => {
+ let packageJsonDirectory: string;
+
+ beforeAll(() => {
+ packageJsonDirectory = path.join(tempRootDirectory, 'with-package-json-config');
+ fs.mkdirSync(packageJsonDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(packageJsonDirectory, 'package.json'),
+ JSON.stringify({
+ name: 'test-project',
+ svelteDoctor: {
+ ignore: {
+ rules: ['svelte/valid-compile'],
+ },
+ },
+ }),
+ );
+ });
+
+ it('loads config from package.json svelteDoctor key', () => {
+ const config = loadConfig(packageJsonDirectory);
+ expect(config).toEqual({
+ ignore: {
+ rules: ['svelte/valid-compile'],
+ },
+ });
+ });
+ });
+
+ describe('config file takes precedence', () => {
+ let precedenceDirectory: string;
+
+ beforeAll(() => {
+ precedenceDirectory = path.join(tempRootDirectory, 'precedence');
+ fs.mkdirSync(precedenceDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(precedenceDirectory, 'svelte-doctor.config.json'),
+ JSON.stringify({ ignore: { rules: ['from-config-file'] } }),
+ );
+ fs.writeFileSync(
+ path.join(precedenceDirectory, 'package.json'),
+ JSON.stringify({
+ name: 'test',
+ svelteDoctor: { ignore: { rules: ['from-package-json'] } },
+ }),
+ );
+ });
+
+ it('prefers svelte-doctor.config.json over package.json', () => {
+ const config = loadConfig(precedenceDirectory);
+ expect(config?.ignore?.rules).toEqual(['from-config-file']);
+ });
+ });
+
+ describe('no config', () => {
+ let emptyDirectory: string;
+
+ beforeAll(() => {
+ emptyDirectory = path.join(tempRootDirectory, 'no-config');
+ fs.mkdirSync(emptyDirectory, { recursive: true });
+ });
+
+ it('returns null when no config is found', () => {
+ const config = loadConfig(emptyDirectory);
+ expect(config).toBeNull();
+ });
+ });
+
+ describe('scan options in config', () => {
+ let optionsDirectory: string;
+
+ beforeAll(() => {
+ optionsDirectory = path.join(tempRootDirectory, 'with-scan-options');
+ fs.mkdirSync(optionsDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(optionsDirectory, 'svelte-doctor.config.json'),
+ JSON.stringify({
+ ignore: { rules: ['svelte/no-at-html-tags'] },
+ lint: true,
+ deadCode: false,
+ verbose: true,
+ diff: 'main',
+ }),
+ );
+ });
+
+ it('loads scan options alongside ignore config', () => {
+ const config = loadConfig(optionsDirectory);
+ expect(config).toEqual({
+ ignore: { rules: ['svelte/no-at-html-tags'] },
+ lint: true,
+ deadCode: false,
+ verbose: true,
+ diff: 'main',
+ });
+ });
+
+ it('loads diff as boolean', () => {
+ const boolDiffDirectory = path.join(tempRootDirectory, 'with-bool-diff');
+ fs.mkdirSync(boolDiffDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(boolDiffDirectory, 'svelte-doctor.config.json'),
+ JSON.stringify({ diff: true }),
+ );
+ const config = loadConfig(boolDiffDirectory);
+ expect(config?.diff).toBe(true);
+ });
+ });
+
+ describe('invalid config', () => {
+ let invalidJsonDirectory: string;
+ let nonObjectDirectory: string;
+
+ beforeAll(() => {
+ invalidJsonDirectory = path.join(tempRootDirectory, 'invalid-json');
+ fs.mkdirSync(invalidJsonDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(invalidJsonDirectory, 'svelte-doctor.config.json'),
+ 'not valid json{{{',
+ );
+
+ nonObjectDirectory = path.join(tempRootDirectory, 'non-object-config');
+ fs.mkdirSync(nonObjectDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(nonObjectDirectory, 'svelte-doctor.config.json'),
+ JSON.stringify([1, 2, 3]),
+ );
+ });
+
+ it('returns null for malformed JSON', () => {
+ const config = loadConfig(invalidJsonDirectory);
+ expect(config).toBeNull();
+ });
+
+ it('returns null when config is not an object', () => {
+ const config = loadConfig(nonObjectDirectory);
+ expect(config).toBeNull();
+ });
+
+ it('ignores non-object svelteDoctor key in package.json', () => {
+ const arrayConfigDirectory = path.join(tempRootDirectory, 'array-pkg-config');
+ fs.mkdirSync(arrayConfigDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(arrayConfigDirectory, 'package.json'),
+ JSON.stringify({ name: 'test', svelteDoctor: 'not-an-object' }),
+ );
+ const config = loadConfig(arrayConfigDirectory);
+ expect(config).toBeNull();
+ });
+ });
+});
diff --git a/packages/svelte-doctor/tests/match-glob-pattern.test.ts b/packages/svelte-doctor/tests/match-glob-pattern.test.ts
new file mode 100644
index 0000000..e311733
--- /dev/null
+++ b/packages/svelte-doctor/tests/match-glob-pattern.test.ts
@@ -0,0 +1,48 @@
+import { matchGlobPattern } from '@framework-doctor/core';
+import { describe, expect, it } from 'vitest';
+
+describe('matchGlobPattern', () => {
+ it('matches exact file paths', () => {
+ expect(matchGlobPattern('src/app.svelte', 'src/app.svelte')).toBe(true);
+ expect(matchGlobPattern('src/app.svelte', 'src/other.svelte')).toBe(false);
+ });
+
+ it('matches single wildcard for filenames', () => {
+ expect(matchGlobPattern('src/app.svelte', 'src/*.svelte')).toBe(true);
+ expect(matchGlobPattern('src/utils.ts', 'src/*.svelte')).toBe(false);
+ expect(matchGlobPattern('src/nested/app.svelte', 'src/*.svelte')).toBe(false);
+ });
+
+ it('matches double wildcard at the end', () => {
+ expect(matchGlobPattern('src/generated/foo.svelte', 'src/generated/**')).toBe(true);
+ expect(matchGlobPattern('src/generated/bar/baz.svelte', 'src/generated/**')).toBe(true);
+ expect(matchGlobPattern('src/other/foo.svelte', 'src/generated/**')).toBe(false);
+ });
+
+ it('matches double wildcard with trailing slash and filename', () => {
+ expect(matchGlobPattern('src/foo/test.ts', 'src/**/test.ts')).toBe(true);
+ expect(matchGlobPattern('src/foo/bar/test.ts', 'src/**/test.ts')).toBe(true);
+ expect(matchGlobPattern('src/test.ts', 'src/**/test.ts')).toBe(true);
+ });
+
+ it('matches double wildcard at the start', () => {
+ expect(matchGlobPattern('src/components/Button.svelte', '**/*.svelte')).toBe(true);
+ expect(matchGlobPattern('Button.svelte', '**/*.svelte')).toBe(true);
+ expect(matchGlobPattern('deep/nested/path/file.svelte', '**/*.svelte')).toBe(true);
+ expect(matchGlobPattern('file.ts', '**/*.svelte')).toBe(false);
+ });
+
+ it('matches question mark as single character', () => {
+ expect(matchGlobPattern('src/a.svelte', 'src/?.svelte')).toBe(true);
+ expect(matchGlobPattern('src/ab.svelte', 'src/?.svelte')).toBe(false);
+ });
+
+ it('escapes regex special characters in patterns', () => {
+ expect(matchGlobPattern('src/file.test.svelte', 'src/*.test.svelte')).toBe(true);
+ expect(matchGlobPattern('src/filetestvelte', 'src/*.test.svelte')).toBe(false);
+ });
+
+ it('normalizes backslashes to forward slashes', () => {
+ expect(matchGlobPattern('src\\generated\\foo.svelte', 'src/generated/**')).toBe(true);
+ });
+});
diff --git a/packages/svelte-doctor/tests/scan.test.ts b/packages/svelte-doctor/tests/scan.test.ts
new file mode 100644
index 0000000..119f354
--- /dev/null
+++ b/packages/svelte-doctor/tests/scan.test.ts
@@ -0,0 +1,94 @@
+import fs from 'node:fs';
+import os from 'node:os';
+import path from 'node:path';
+import { afterAll, describe, expect, it, vi } from 'vitest';
+import { scan } from '../src/scan.js';
+
+const FIXTURES_DIRECTORY = path.resolve(import.meta.dirname, 'fixtures');
+
+vi.mock('ora', () => ({
+ default: () => ({
+ text: '',
+ start: function () {
+ return this;
+ },
+ stop: function () {
+ return this;
+ },
+ succeed: () => {},
+ fail: () => {},
+ }),
+}));
+
+const noSvelteTempDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'svelte-doctor-test-'));
+fs.writeFileSync(
+ path.join(noSvelteTempDirectory, 'package.json'),
+ JSON.stringify({ name: 'no-svelte', dependencies: {} }),
+);
+
+afterAll(() => {
+ fs.rmSync(noSvelteTempDirectory, { recursive: true, force: true });
+});
+
+const SCAN_TIMEOUT_MS = 20_000;
+
+describe('scan', () => {
+ it(
+ 'completes without throwing on a valid Svelte project',
+ async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ await scan(path.join(FIXTURES_DIRECTORY, 'basic-svelte'), {
+ lint: true,
+ deadCode: false,
+ });
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ },
+ SCAN_TIMEOUT_MS,
+ );
+
+ it('throws when Svelte dependency is missing', async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ await expect(scan(noSvelteTempDirectory, { lint: true, deadCode: false })).rejects.toThrow(
+ 'No Svelte dependency found in package.json',
+ );
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ });
+
+ it('skips lint when option is disabled', async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ await scan(path.join(FIXTURES_DIRECTORY, 'basic-svelte'), {
+ lint: false,
+ deadCode: false,
+ });
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ });
+
+ it(
+ 'runs lint and dead code in parallel when both enabled',
+ async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ const startTime = performance.now();
+ await scan(path.join(FIXTURES_DIRECTORY, 'basic-svelte'), {
+ lint: true,
+ deadCode: true,
+ });
+ const elapsedMilliseconds = performance.now() - startTime;
+
+ expect(elapsedMilliseconds).toBeLessThan(30_000);
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ },
+ SCAN_TIMEOUT_MS,
+ );
+});
diff --git a/packages/vue-doctor/CHANGELOG.md b/packages/vue-doctor/CHANGELOG.md
index b1051be..6ac24ba 100644
--- a/packages/vue-doctor/CHANGELOG.md
+++ b/packages/vue-doctor/CHANGELOG.md
@@ -1,5 +1,13 @@
# vue-doctor
+## 1.0.4
+
+### Patch Changes
+
+- angular doctor
+- Updated dependencies
+ - @framework-doctor/core@1.0.4
+
## 1.0.3
### Patch Changes
diff --git a/packages/vue-doctor/package.json b/packages/vue-doctor/package.json
index b0b59ae..2ae4555 100644
--- a/packages/vue-doctor/package.json
+++ b/packages/vue-doctor/package.json
@@ -1,6 +1,6 @@
{
"name": "@framework-doctor/vue",
- "version": "1.0.3",
+ "version": "1.0.4",
"description": "Diagnose Vue and Nuxt codebase health",
"author": {
"name": "Pitis Radu",
diff --git a/packages/vue-doctor/src/utils/check-reduced-motion.ts b/packages/vue-doctor/src/utils/check-reduced-motion.ts
index ad17005..625c021 100644
--- a/packages/vue-doctor/src/utils/check-reduced-motion.ts
+++ b/packages/vue-doctor/src/utils/check-reduced-motion.ts
@@ -1,4 +1,4 @@
-import { execSync } from 'node:child_process';
+import { spawnSync } from 'node:child_process';
import fs from 'node:fs';
import path from 'node:path';
import { VUE_MOTION_LIBRARIES } from '../constants.js';
@@ -6,7 +6,15 @@ import type { Diagnostic } from '../types.js';
import { readPackageJson } from './read-package-json.js';
const REDUCED_MOTION_GREP_PATTERN = 'prefers-reduced-motion|useReducedMotion';
-const REDUCED_MOTION_FILE_GLOBS = '"*.vue" "*.ts" "*.tsx" "*.js" "*.jsx" "*.css" "*.scss"';
+const REDUCED_MOTION_FILE_GLOBS = [
+ '*.vue',
+ '*.ts',
+ '*.tsx',
+ '*.js',
+ '*.jsx',
+ '*.css',
+ '*.scss',
+] as const;
const MISSING_REDUCED_MOTION_DIAGNOSTIC: Diagnostic = {
filePath: 'package.json',
@@ -41,11 +49,13 @@ export const checkReducedMotion = (rootDirectory: string): Diagnostic[] => {
if (!hasMotionLibrary) return [];
try {
- execSync(`git grep -ql -E "${REDUCED_MOTION_GREP_PATTERN}" -- ${REDUCED_MOTION_FILE_GLOBS}`, {
- cwd: rootDirectory,
- stdio: 'pipe',
- });
- return [];
+ const result = spawnSync(
+ 'git',
+ ['grep', '-ql', '-E', REDUCED_MOTION_GREP_PATTERN, '--', ...REDUCED_MOTION_FILE_GLOBS],
+ { cwd: rootDirectory, encoding: 'utf-8', stdio: 'pipe' },
+ );
+ if (result.status === 0 && !result.error) return [];
+ return [MISSING_REDUCED_MOTION_DIAGNOSTIC];
} catch {
return [MISSING_REDUCED_MOTION_DIAGNOSTIC];
}
diff --git a/packages/vue-doctor/src/utils/skill-prompt.ts b/packages/vue-doctor/src/utils/skill-prompt.ts
index 9e3a7aa..f729854 100644
--- a/packages/vue-doctor/src/utils/skill-prompt.ts
+++ b/packages/vue-doctor/src/utils/skill-prompt.ts
@@ -1,5 +1,5 @@
import { highlighter, logger, readGlobalConfig, writeGlobalConfig } from '@framework-doctor/core';
-import { execSync } from 'node:child_process';
+import { spawnSync } from 'node:child_process';
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
import { homedir } from 'node:os';
import { join } from 'node:path';
@@ -69,8 +69,8 @@ const writeSkillFiles = (directory: string): void => {
const isCommandAvailable = (command: string): boolean => {
try {
const whichCommand = process.platform === 'win32' ? 'where' : 'which';
- execSync(`${whichCommand} ${command}`, { stdio: 'ignore' });
- return true;
+ const result = spawnSync(whichCommand, [command], { stdio: 'ignore' });
+ return result.status === 0 && !result.error;
} catch {
return false;
}
diff --git a/packages/vue-doctor/tests/colorize-by-score.test.ts b/packages/vue-doctor/tests/colorize-by-score.test.ts
new file mode 100644
index 0000000..1004b52
--- /dev/null
+++ b/packages/vue-doctor/tests/colorize-by-score.test.ts
@@ -0,0 +1,46 @@
+import { colorizeByScore } from '@framework-doctor/core';
+import { describe, expect, it } from 'vitest';
+
+describe('colorizeByScore', () => {
+ it('returns a string for high scores', () => {
+ const result = colorizeByScore('Great', 90);
+ expect(typeof result).toBe('string');
+ expect(result).toContain('Great');
+ });
+
+ it('returns a string for medium scores', () => {
+ const result = colorizeByScore('OK', 60);
+ expect(typeof result).toBe('string');
+ expect(result).toContain('OK');
+ });
+
+ it('returns a string for low scores', () => {
+ const result = colorizeByScore('Critical', 30);
+ expect(typeof result).toBe('string');
+ expect(result).toContain('Critical');
+ });
+
+ it('does not throw at good threshold boundary (75)', () => {
+ expect(() => colorizeByScore('text', 75)).not.toThrow();
+ expect(() => colorizeByScore('text', 74)).not.toThrow();
+ expect(colorizeByScore('text', 75)).toContain('text');
+ expect(colorizeByScore('text', 74)).toContain('text');
+ });
+
+ it('does not throw at ok threshold boundary (50)', () => {
+ expect(() => colorizeByScore('text', 50)).not.toThrow();
+ expect(() => colorizeByScore('text', 49)).not.toThrow();
+ expect(colorizeByScore('text', 50)).toContain('text');
+ expect(colorizeByScore('text', 49)).toContain('text');
+ });
+
+ it('handles score of zero', () => {
+ const result = colorizeByScore('zero', 0);
+ expect(result).toContain('zero');
+ });
+
+ it('handles perfect score', () => {
+ const result = colorizeByScore('perfect', 100);
+ expect(result).toContain('perfect');
+ });
+});
diff --git a/packages/vue-doctor/tests/combine-diagnostics.test.ts b/packages/vue-doctor/tests/combine-diagnostics.test.ts
new file mode 100644
index 0000000..8e78f53
--- /dev/null
+++ b/packages/vue-doctor/tests/combine-diagnostics.test.ts
@@ -0,0 +1,71 @@
+import { describe, expect, it } from 'vitest';
+import type { Diagnostic, VueDoctorConfig } from '../src/types.js';
+import { combineDiagnostics, computeVueIncludePaths } from '../src/utils/combine-diagnostics.js';
+
+const createDiagnostic = (overrides: Partial = {}): Diagnostic => ({
+ filePath: 'src/App.vue',
+ plugin: 'vue-doctor',
+ rule: 'test-rule',
+ severity: 'warning',
+ message: 'test message',
+ help: 'test help',
+ line: 1,
+ column: 1,
+ category: 'Test',
+ ...overrides,
+});
+
+describe('computeVueIncludePaths', () => {
+ it('returns undefined for empty include paths', () => {
+ expect(computeVueIncludePaths([])).toBeUndefined();
+ });
+
+ it('filters to only Vue/TS/JS source files', () => {
+ const paths = ['src/App.vue', 'src/utils.ts', 'src/Button.jsx', 'src/config.js'];
+ const result = computeVueIncludePaths(paths);
+ expect(result).toEqual(['src/App.vue', 'src/utils.ts', 'src/Button.jsx', 'src/config.js']);
+ });
+
+ it('returns empty array when no source files exist', () => {
+ const paths = ['readme.md', 'package.json'];
+ const result = computeVueIncludePaths(paths);
+ expect(result).toEqual([]);
+ });
+});
+
+describe('combineDiagnostics', () => {
+ it('merges lint and dead code diagnostics', () => {
+ const lintDiagnostics = [createDiagnostic({ rule: 'lint-rule' })];
+ const deadCodeDiagnostics = [createDiagnostic({ rule: 'dead-code-rule' })];
+
+ const result = combineDiagnostics(lintDiagnostics, deadCodeDiagnostics, [], '/tmp', true, null);
+ expect(result).toHaveLength(2);
+ expect(result[0].rule).toBe('lint-rule');
+ expect(result[1].rule).toBe('dead-code-rule');
+ });
+
+ it('returns empty array when both inputs are empty in diff mode', () => {
+ const result = combineDiagnostics([], [], [], '/tmp', true, null);
+ expect(result).toEqual([]);
+ });
+
+ it('applies config filtering when userConfig is provided', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: 'vue', rule: 'no-unused-vars' }),
+ createDiagnostic({ plugin: 'vue-doctor', rule: 'no-giant-component' }),
+ ];
+ const config: VueDoctorConfig = {
+ ignore: { rules: ['vue/no-unused-vars'] },
+ };
+
+ const result = combineDiagnostics(diagnostics, [], [], '/tmp', true, config);
+ expect(result).toHaveLength(1);
+ expect(result[0].rule).toBe('no-giant-component');
+ });
+
+ it('skips config filtering when userConfig is null', () => {
+ const diagnostics = [createDiagnostic(), createDiagnostic()];
+ const result = combineDiagnostics(diagnostics, [], [], '/tmp', true, null);
+ expect(result).toHaveLength(2);
+ });
+});
diff --git a/packages/vue-doctor/tests/discover-project.test.ts b/packages/vue-doctor/tests/discover-project.test.ts
new file mode 100644
index 0000000..c163191
--- /dev/null
+++ b/packages/vue-doctor/tests/discover-project.test.ts
@@ -0,0 +1,48 @@
+import path from 'node:path';
+import { describe, expect, it } from 'vitest';
+import { discoverProject, listWorkspacePackages } from '../src/utils/discover-project.js';
+
+const FIXTURES_DIRECTORY = path.resolve(import.meta.dirname, 'fixtures');
+const VALID_FRAMEWORKS = ['vue', 'nuxt'] as const;
+
+describe('discoverProject', () => {
+ it('detects Vue version from package.json', () => {
+ const projectInfo = discoverProject(path.join(FIXTURES_DIRECTORY, 'basic-vue'));
+ expect(projectInfo.vueVersion).toBe('^3.0.0');
+ });
+
+ it('returns a valid framework', () => {
+ const projectInfo = discoverProject(path.join(FIXTURES_DIRECTORY, 'basic-vue'));
+ expect(VALID_FRAMEWORKS).toContain(projectInfo.framework);
+ });
+
+ it('detects TypeScript when tsconfig.json exists', () => {
+ const projectInfo = discoverProject(path.join(FIXTURES_DIRECTORY, 'basic-vue'));
+ expect(projectInfo.hasTypeScript).toBe(true);
+ });
+
+ it('detects framework as nuxt when nuxt dependency exists', () => {
+ const projectInfo = discoverProject(path.join(FIXTURES_DIRECTORY, 'nuxt-app'));
+ expect(projectInfo.framework).toBe('nuxt');
+ });
+
+ it('detects Vue version from peerDependencies', () => {
+ const projectInfo = discoverProject(path.join(FIXTURES_DIRECTORY, 'component-library'));
+ expect(projectInfo.vueVersion).toBe('^3.0.0 || ^2.0.0');
+ });
+
+ it('throws when package.json is missing', () => {
+ expect(() => discoverProject('/nonexistent/path')).toThrow('No package.json found');
+ });
+});
+
+describe('listWorkspacePackages', () => {
+ it('resolves nested workspace patterns like apps/*/ClientApp', () => {
+ const packages = listWorkspacePackages(path.join(FIXTURES_DIRECTORY, 'nested-workspaces'));
+ const packageNames = packages.map((workspacePackage) => workspacePackage.name);
+
+ expect(packageNames).toContain('my-app-client');
+ expect(packageNames).toContain('ui');
+ expect(packages).toHaveLength(2);
+ });
+});
diff --git a/packages/vue-doctor/tests/filter-diagnostics.test.ts b/packages/vue-doctor/tests/filter-diagnostics.test.ts
new file mode 100644
index 0000000..4696ae1
--- /dev/null
+++ b/packages/vue-doctor/tests/filter-diagnostics.test.ts
@@ -0,0 +1,130 @@
+import { describe, expect, it } from 'vitest';
+import type { Diagnostic, VueDoctorConfig } from '../src/types.js';
+import { filterIgnoredDiagnostics } from '../src/utils/filter-diagnostics.js';
+
+const createDiagnostic = (overrides: Partial = {}): Diagnostic => ({
+ filePath: 'src/App.vue',
+ plugin: 'vue',
+ rule: 'no-unused-vars',
+ severity: 'warning',
+ message: 'test message',
+ help: 'test help',
+ line: 1,
+ column: 1,
+ category: 'Correctness',
+ ...overrides,
+});
+
+describe('filterIgnoredDiagnostics', () => {
+ it('returns all diagnostics when config has no ignore rules', () => {
+ const diagnostics = [createDiagnostic()];
+ const config: VueDoctorConfig = {};
+ expect(filterIgnoredDiagnostics(diagnostics, config)).toEqual(diagnostics);
+ });
+
+ it('filters diagnostics matching ignored rules', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: 'vue', rule: 'no-unused-vars' }),
+ createDiagnostic({ plugin: 'vue', rule: 'require-prop-types' }),
+ createDiagnostic({ plugin: 'vue-doctor', rule: 'no-giant-component' }),
+ ];
+ const config: VueDoctorConfig = {
+ ignore: {
+ rules: ['vue/no-unused-vars', 'vue/require-prop-types'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].rule).toBe('no-giant-component');
+ });
+
+ it('filters diagnostics matching ignored file patterns', () => {
+ const diagnostics = [
+ createDiagnostic({ filePath: 'src/generated/types.vue' }),
+ createDiagnostic({ filePath: 'src/generated/api/client.vue' }),
+ createDiagnostic({ filePath: 'src/components/Button.vue' }),
+ ];
+ const config: VueDoctorConfig = {
+ ignore: {
+ files: ['src/generated/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].filePath).toBe('src/components/Button.vue');
+ });
+
+ it('filters by both rules and files together', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: 'vue', rule: 'no-unused-vars', filePath: 'src/App.vue' }),
+ createDiagnostic({ plugin: 'knip', rule: 'exports', filePath: 'src/generated/api.vue' }),
+ createDiagnostic({
+ plugin: 'vue-doctor',
+ rule: 'no-giant-component',
+ filePath: 'src/components/App.vue',
+ }),
+ ];
+ const config: VueDoctorConfig = {
+ ignore: {
+ rules: ['vue/no-unused-vars'],
+ files: ['src/generated/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].rule).toBe('no-giant-component');
+ });
+
+ it('keeps all diagnostics when no rules or files match', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: 'vue', rule: 'no-unused-vars' }),
+ createDiagnostic({ plugin: 'knip', rule: 'exports' }),
+ ];
+ const config: VueDoctorConfig = {
+ ignore: {
+ rules: ['nonexistent/rule'],
+ files: ['nonexistent/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(2);
+ });
+
+ it('filters file paths with ./ prefix against patterns without it', () => {
+ const diagnostics = [
+ createDiagnostic({ filePath: './resources/js/components/ui/Button.vue' }),
+ createDiagnostic({ filePath: './resources/js/marketing/Hero.vue' }),
+ createDiagnostic({ filePath: './resources/js/pages/Home.vue' }),
+ ];
+ const config: VueDoctorConfig = {
+ ignore: {
+ files: ['resources/js/components/ui/**', 'resources/js/marketing/**'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].filePath).toBe('./resources/js/pages/Home.vue');
+ });
+
+ it('handles knip rule identifiers', () => {
+ const diagnostics = [
+ createDiagnostic({ plugin: 'knip', rule: 'exports' }),
+ createDiagnostic({ plugin: 'knip', rule: 'types' }),
+ createDiagnostic({ plugin: 'knip', rule: 'files' }),
+ ];
+ const config: VueDoctorConfig = {
+ ignore: {
+ rules: ['knip/exports', 'knip/types'],
+ },
+ };
+
+ const filtered = filterIgnoredDiagnostics(diagnostics, config);
+ expect(filtered).toHaveLength(1);
+ expect(filtered[0].rule).toBe('files');
+ });
+});
diff --git a/packages/vue-doctor/tests/find-monorepo-root.test.ts b/packages/vue-doctor/tests/find-monorepo-root.test.ts
new file mode 100644
index 0000000..d10aae6
--- /dev/null
+++ b/packages/vue-doctor/tests/find-monorepo-root.test.ts
@@ -0,0 +1,33 @@
+import { findMonorepoRoot, isMonorepoRoot } from '@framework-doctor/core';
+import path from 'node:path';
+import { describe, expect, it } from 'vitest';
+
+const FIXTURES_DIRECTORY = path.resolve(import.meta.dirname, 'fixtures');
+
+describe('isMonorepoRoot', () => {
+ it('returns true for a directory with pnpm-workspace.yaml or workspaces', () => {
+ const nestedWorkspaces = path.join(FIXTURES_DIRECTORY, 'nested-workspaces');
+ expect(isMonorepoRoot(nestedWorkspaces)).toBe(true);
+ });
+
+ it('returns false for a non-monorepo project', () => {
+ const basicVue = path.join(FIXTURES_DIRECTORY, 'basic-vue');
+ expect(isMonorepoRoot(basicVue)).toBe(false);
+ });
+
+ it('returns false for a nonexistent directory', () => {
+ expect(isMonorepoRoot('/nonexistent/path')).toBe(false);
+ });
+});
+
+describe('findMonorepoRoot', () => {
+ it('returns null when no monorepo root exists above directory', () => {
+ expect(findMonorepoRoot('/tmp')).toBeNull();
+ });
+
+ it('finds monorepo root from a nested workspace package', () => {
+ const nestedPackage = path.join(FIXTURES_DIRECTORY, 'nested-workspaces', 'packages', 'ui');
+ const monorepoRoot = findMonorepoRoot(nestedPackage);
+ expect(monorepoRoot).toBe(path.join(FIXTURES_DIRECTORY, 'nested-workspaces'));
+ });
+});
diff --git a/packages/vue-doctor/tests/fixtures/basic-vue/package.json b/packages/vue-doctor/tests/fixtures/basic-vue/package.json
new file mode 100644
index 0000000..7ef6292
--- /dev/null
+++ b/packages/vue-doctor/tests/fixtures/basic-vue/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "basic-vue",
+ "dependencies": {
+ "vue": "^3.0.0"
+ }
+}
diff --git a/packages/vue-doctor/tests/fixtures/basic-vue/tsconfig.json b/packages/vue-doctor/tests/fixtures/basic-vue/tsconfig.json
new file mode 100644
index 0000000..22b5bda
--- /dev/null
+++ b/packages/vue-doctor/tests/fixtures/basic-vue/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "strict": true,
+ "target": "ESNext",
+ "module": "ESNext",
+ "moduleResolution": "bundler"
+ }
+}
diff --git a/packages/vue-doctor/tests/fixtures/component-library/package.json b/packages/vue-doctor/tests/fixtures/component-library/package.json
new file mode 100644
index 0000000..c433708
--- /dev/null
+++ b/packages/vue-doctor/tests/fixtures/component-library/package.json
@@ -0,0 +1,7 @@
+{
+ "name": "vue-component-library",
+ "private": true,
+ "peerDependencies": {
+ "vue": "^3.0.0 || ^2.0.0"
+ }
+}
diff --git a/packages/vue-doctor/tests/fixtures/nested-workspaces/apps/my-app/ClientApp/package.json b/packages/vue-doctor/tests/fixtures/nested-workspaces/apps/my-app/ClientApp/package.json
new file mode 100644
index 0000000..591db08
--- /dev/null
+++ b/packages/vue-doctor/tests/fixtures/nested-workspaces/apps/my-app/ClientApp/package.json
@@ -0,0 +1,7 @@
+{
+ "name": "my-app-client",
+ "dependencies": {
+ "vue": "^3.0.0",
+ "vue-dom": "^3.0.0"
+ }
+}
diff --git a/packages/vue-doctor/tests/fixtures/nested-workspaces/package.json b/packages/vue-doctor/tests/fixtures/nested-workspaces/package.json
new file mode 100644
index 0000000..3d06325
--- /dev/null
+++ b/packages/vue-doctor/tests/fixtures/nested-workspaces/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "nested-workspaces-fixture",
+ "private": true,
+ "workspaces": [
+ "apps/*/ClientApp",
+ "packages/*"
+ ]
+}
diff --git a/packages/vue-doctor/tests/fixtures/nested-workspaces/packages/ui/package.json b/packages/vue-doctor/tests/fixtures/nested-workspaces/packages/ui/package.json
new file mode 100644
index 0000000..6ec30cc
--- /dev/null
+++ b/packages/vue-doctor/tests/fixtures/nested-workspaces/packages/ui/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "ui",
+ "dependencies": {
+ "vue": "^3.0.0"
+ }
+}
diff --git a/packages/vue-doctor/tests/fixtures/nuxt-app/package.json b/packages/vue-doctor/tests/fixtures/nuxt-app/package.json
new file mode 100644
index 0000000..fd66c73
--- /dev/null
+++ b/packages/vue-doctor/tests/fixtures/nuxt-app/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "nuxt-app",
+ "private": true,
+ "dependencies": {
+ "vue": "^3.0.0",
+ "nuxt": "^3.0.0"
+ }
+}
diff --git a/packages/vue-doctor/tests/indent-multiline-text.test.ts b/packages/vue-doctor/tests/indent-multiline-text.test.ts
new file mode 100644
index 0000000..cb2bb35
--- /dev/null
+++ b/packages/vue-doctor/tests/indent-multiline-text.test.ts
@@ -0,0 +1,21 @@
+import { indentMultilineText } from '@framework-doctor/core';
+import { describe, expect, it } from 'vitest';
+
+describe('indentMultilineText', () => {
+ it('adds the prefix to a single line', () => {
+ const indentedText = indentMultilineText('Error: Something happened', ' ');
+
+ expect(indentedText).toBe(' Error: Something happened');
+ });
+
+ it('adds the prefix to every line in multiline text', () => {
+ const explanation =
+ 'Error: Calling setState synchronously within an effect can trigger cascading renders\n\nEffects are intended to synchronize state between React and external systems.\n* Update external systems with the latest state from React.\n* Subscribe for updates from external systems and set state in a callback.';
+
+ const indentedText = indentMultilineText(explanation, ' ');
+
+ expect(indentedText).toBe(
+ ' Error: Calling setState synchronously within an effect can trigger cascading renders\n \n Effects are intended to synchronize state between React and external systems.\n * Update external systems with the latest state from React.\n * Subscribe for updates from external systems and set state in a callback.',
+ );
+ });
+});
diff --git a/packages/vue-doctor/tests/load-config.test.ts b/packages/vue-doctor/tests/load-config.test.ts
new file mode 100644
index 0000000..9aea905
--- /dev/null
+++ b/packages/vue-doctor/tests/load-config.test.ts
@@ -0,0 +1,192 @@
+import fs from 'node:fs';
+import os from 'node:os';
+import path from 'node:path';
+import { afterAll, beforeAll, describe, expect, it } from 'vitest';
+import { loadConfig } from '../src/utils/load-config.js';
+
+const tempRootDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'vue-doctor-config-test-'));
+
+afterAll(() => {
+ fs.rmSync(tempRootDirectory, { recursive: true, force: true });
+});
+
+describe('loadConfig', () => {
+ describe('vue-doctor.config.json', () => {
+ let configDirectory: string;
+
+ beforeAll(() => {
+ configDirectory = path.join(tempRootDirectory, 'with-config-file');
+ fs.mkdirSync(configDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(configDirectory, 'vue-doctor.config.json'),
+ JSON.stringify({
+ ignore: {
+ rules: ['vue/no-unused-vars', 'knip/exports'],
+ files: ['src/generated/**'],
+ },
+ }),
+ );
+ });
+
+ it('loads config from vue-doctor.config.json', () => {
+ const config = loadConfig(configDirectory);
+ expect(config).toEqual({
+ ignore: {
+ rules: ['vue/no-unused-vars', 'knip/exports'],
+ files: ['src/generated/**'],
+ },
+ });
+ });
+ });
+
+ describe('package.json vueDoctor key', () => {
+ let packageJsonDirectory: string;
+
+ beforeAll(() => {
+ packageJsonDirectory = path.join(tempRootDirectory, 'with-package-json-config');
+ fs.mkdirSync(packageJsonDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(packageJsonDirectory, 'package.json'),
+ JSON.stringify({
+ name: 'test-project',
+ vueDoctor: {
+ ignore: {
+ rules: ['vue/require-prop-types'],
+ },
+ },
+ }),
+ );
+ });
+
+ it('loads config from package.json vueDoctor key', () => {
+ const config = loadConfig(packageJsonDirectory);
+ expect(config).toEqual({
+ ignore: {
+ rules: ['vue/require-prop-types'],
+ },
+ });
+ });
+ });
+
+ describe('config file takes precedence', () => {
+ let precedenceDirectory: string;
+
+ beforeAll(() => {
+ precedenceDirectory = path.join(tempRootDirectory, 'precedence');
+ fs.mkdirSync(precedenceDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(precedenceDirectory, 'vue-doctor.config.json'),
+ JSON.stringify({ ignore: { rules: ['from-config-file'] } }),
+ );
+ fs.writeFileSync(
+ path.join(precedenceDirectory, 'package.json'),
+ JSON.stringify({
+ name: 'test',
+ vueDoctor: { ignore: { rules: ['from-package-json'] } },
+ }),
+ );
+ });
+
+ it('prefers vue-doctor.config.json over package.json', () => {
+ const config = loadConfig(precedenceDirectory);
+ expect(config?.ignore?.rules).toEqual(['from-config-file']);
+ });
+ });
+
+ describe('no config', () => {
+ let emptyDirectory: string;
+
+ beforeAll(() => {
+ emptyDirectory = path.join(tempRootDirectory, 'no-config');
+ fs.mkdirSync(emptyDirectory, { recursive: true });
+ });
+
+ it('returns null when no config is found', () => {
+ const config = loadConfig(emptyDirectory);
+ expect(config).toBeNull();
+ });
+ });
+
+ describe('scan options in config', () => {
+ let optionsDirectory: string;
+
+ beforeAll(() => {
+ optionsDirectory = path.join(tempRootDirectory, 'with-scan-options');
+ fs.mkdirSync(optionsDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(optionsDirectory, 'vue-doctor.config.json'),
+ JSON.stringify({
+ ignore: { rules: ['vue/no-unused-vars'] },
+ lint: true,
+ deadCode: false,
+ verbose: true,
+ diff: 'main',
+ }),
+ );
+ });
+
+ it('loads scan options alongside ignore config', () => {
+ const config = loadConfig(optionsDirectory);
+ expect(config).toEqual({
+ ignore: { rules: ['vue/no-unused-vars'] },
+ lint: true,
+ deadCode: false,
+ verbose: true,
+ diff: 'main',
+ });
+ });
+
+ it('loads diff as boolean', () => {
+ const boolDiffDirectory = path.join(tempRootDirectory, 'with-bool-diff');
+ fs.mkdirSync(boolDiffDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(boolDiffDirectory, 'vue-doctor.config.json'),
+ JSON.stringify({ diff: true }),
+ );
+ const config = loadConfig(boolDiffDirectory);
+ expect(config?.diff).toBe(true);
+ });
+ });
+
+ describe('invalid config', () => {
+ let invalidJsonDirectory: string;
+ let nonObjectDirectory: string;
+
+ beforeAll(() => {
+ invalidJsonDirectory = path.join(tempRootDirectory, 'invalid-json');
+ fs.mkdirSync(invalidJsonDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(invalidJsonDirectory, 'vue-doctor.config.json'),
+ 'not valid json{{{',
+ );
+
+ nonObjectDirectory = path.join(tempRootDirectory, 'non-object-config');
+ fs.mkdirSync(nonObjectDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(nonObjectDirectory, 'vue-doctor.config.json'),
+ JSON.stringify([1, 2, 3]),
+ );
+ });
+
+ it('returns null for malformed JSON', () => {
+ const config = loadConfig(invalidJsonDirectory);
+ expect(config).toBeNull();
+ });
+
+ it('returns null when config is not an object', () => {
+ const config = loadConfig(nonObjectDirectory);
+ expect(config).toBeNull();
+ });
+
+ it('ignores non-object vueDoctor key in package.json', () => {
+ const arrayConfigDirectory = path.join(tempRootDirectory, 'array-pkg-config');
+ fs.mkdirSync(arrayConfigDirectory, { recursive: true });
+ fs.writeFileSync(
+ path.join(arrayConfigDirectory, 'package.json'),
+ JSON.stringify({ name: 'test', vueDoctor: 'not-an-object' }),
+ );
+ const config = loadConfig(arrayConfigDirectory);
+ expect(config).toBeNull();
+ });
+ });
+});
diff --git a/packages/vue-doctor/tests/match-glob-pattern.test.ts b/packages/vue-doctor/tests/match-glob-pattern.test.ts
new file mode 100644
index 0000000..c262ac0
--- /dev/null
+++ b/packages/vue-doctor/tests/match-glob-pattern.test.ts
@@ -0,0 +1,48 @@
+import { matchGlobPattern } from '@framework-doctor/core';
+import { describe, expect, it } from 'vitest';
+
+describe('matchGlobPattern', () => {
+ it('matches exact file paths', () => {
+ expect(matchGlobPattern('src/app.vue', 'src/app.vue')).toBe(true);
+ expect(matchGlobPattern('src/app.vue', 'src/other.vue')).toBe(false);
+ });
+
+ it('matches single wildcard for filenames', () => {
+ expect(matchGlobPattern('src/app.vue', 'src/*.vue')).toBe(true);
+ expect(matchGlobPattern('src/utils.ts', 'src/*.vue')).toBe(false);
+ expect(matchGlobPattern('src/nested/app.vue', 'src/*.vue')).toBe(false);
+ });
+
+ it('matches double wildcard at the end', () => {
+ expect(matchGlobPattern('src/generated/foo.vue', 'src/generated/**')).toBe(true);
+ expect(matchGlobPattern('src/generated/bar/baz.vue', 'src/generated/**')).toBe(true);
+ expect(matchGlobPattern('src/other/foo.vue', 'src/generated/**')).toBe(false);
+ });
+
+ it('matches double wildcard with trailing slash and filename', () => {
+ expect(matchGlobPattern('src/foo/test.ts', 'src/**/test.ts')).toBe(true);
+ expect(matchGlobPattern('src/foo/bar/test.ts', 'src/**/test.ts')).toBe(true);
+ expect(matchGlobPattern('src/test.ts', 'src/**/test.ts')).toBe(true);
+ });
+
+ it('matches double wildcard at the start', () => {
+ expect(matchGlobPattern('src/components/Button.vue', '**/*.vue')).toBe(true);
+ expect(matchGlobPattern('Button.vue', '**/*.vue')).toBe(true);
+ expect(matchGlobPattern('deep/nested/path/file.vue', '**/*.vue')).toBe(true);
+ expect(matchGlobPattern('file.ts', '**/*.vue')).toBe(false);
+ });
+
+ it('matches question mark as single character', () => {
+ expect(matchGlobPattern('src/a.vue', 'src/?.vue')).toBe(true);
+ expect(matchGlobPattern('src/ab.vue', 'src/?.vue')).toBe(false);
+ });
+
+ it('escapes regex special characters in patterns', () => {
+ expect(matchGlobPattern('src/file.test.vue', 'src/*.test.vue')).toBe(true);
+ expect(matchGlobPattern('src/filetestvue', 'src/*.test.vue')).toBe(false);
+ });
+
+ it('normalizes backslashes to forward slashes', () => {
+ expect(matchGlobPattern('src\\generated\\foo.vue', 'src/generated/**')).toBe(true);
+ });
+});
diff --git a/packages/vue-doctor/tests/scan.test.ts b/packages/vue-doctor/tests/scan.test.ts
new file mode 100644
index 0000000..cdb6de6
--- /dev/null
+++ b/packages/vue-doctor/tests/scan.test.ts
@@ -0,0 +1,84 @@
+import fs from 'node:fs';
+import os from 'node:os';
+import path from 'node:path';
+import { afterAll, describe, expect, it, vi } from 'vitest';
+import { scan } from '../src/scan.js';
+
+const FIXTURES_DIRECTORY = path.resolve(import.meta.dirname, 'fixtures');
+
+vi.mock('ora', () => ({
+ default: () => ({
+ text: '',
+ start: function () {
+ return this;
+ },
+ stop: function () {
+ return this;
+ },
+ succeed: () => {},
+ fail: () => {},
+ }),
+}));
+
+const noVueTempDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'vue-doctor-test-'));
+fs.writeFileSync(
+ path.join(noVueTempDirectory, 'package.json'),
+ JSON.stringify({ name: 'no-vue', dependencies: {} }),
+);
+
+afterAll(() => {
+ fs.rmSync(noVueTempDirectory, { recursive: true, force: true });
+});
+
+describe('scan', () => {
+ it('completes without throwing on a valid Vue project', async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ await scan(path.join(FIXTURES_DIRECTORY, 'basic-vue'), {
+ lint: true,
+ deadCode: false,
+ });
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ });
+
+ it('throws when Vue dependency is missing', async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ await expect(scan(noVueTempDirectory, { lint: true, deadCode: false })).rejects.toThrow(
+ 'No Vue dependency found in package.json',
+ );
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ });
+
+ it('skips lint when option is disabled', async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ await scan(path.join(FIXTURES_DIRECTORY, 'basic-vue'), {
+ lint: false,
+ deadCode: false,
+ });
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ });
+
+ it('runs lint and dead code in parallel when both enabled', async () => {
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
+ try {
+ const startTime = performance.now();
+ await scan(path.join(FIXTURES_DIRECTORY, 'basic-vue'), {
+ lint: true,
+ deadCode: true,
+ });
+ const elapsedMilliseconds = performance.now() - startTime;
+
+ expect(elapsedMilliseconds).toBeLessThan(30_000);
+ } finally {
+ consoleSpy.mockRestore();
+ }
+ });
+});
diff --git a/packages/vue-doctor/tests/score.test.ts b/packages/vue-doctor/tests/score.test.ts
new file mode 100644
index 0000000..55e2ecf
--- /dev/null
+++ b/packages/vue-doctor/tests/score.test.ts
@@ -0,0 +1,117 @@
+import { describe, expect, it } from 'vitest';
+import { calculateScore } from '../src/utils/calculate-score.js';
+
+const baseDiagnostic = {
+ message: '',
+ help: '',
+ line: 1,
+ column: 1,
+ category: 'correctness',
+};
+
+describe('calculateScore', () => {
+ it('returns perfect score when there are no diagnostics', () => {
+ expect(calculateScore([], 8)).toEqual({ score: 100, label: 'Great' });
+ });
+
+ it('penalizes errors more than warnings', () => {
+ const result = calculateScore(
+ [
+ {
+ ...baseDiagnostic,
+ filePath: 'src/a.vue',
+ plugin: 'vue-eslint',
+ rule: 'x',
+ severity: 'error',
+ },
+ {
+ ...baseDiagnostic,
+ filePath: 'src/b.vue',
+ plugin: 'vue-eslint',
+ rule: 'y',
+ severity: 'warning',
+ },
+ ],
+ 8,
+ );
+
+ expect(result.score).toBe(91);
+ expect(result.label).toBe('Great');
+ expect(result.breakdown).toBeDefined();
+ expect(result.breakdown?.typesPenalty).toBe(3.5);
+ expect(result.breakdown?.volumePenalty).toBeCloseTo(2.6);
+ expect(result.breakdown?.spreadPenalty).toBe(3);
+ });
+
+ it('uses zero spread penalty when totalFilesScanned is zero', () => {
+ const result = calculateScore(
+ [
+ {
+ ...baseDiagnostic,
+ filePath: 'src/a.vue',
+ plugin: 'vue-eslint',
+ rule: 'x',
+ severity: 'error',
+ },
+ ],
+ 0,
+ );
+
+ expect(result.breakdown?.spreadPenalty).toBe(0);
+ });
+
+ it('produces ~81 for 6 errors, 7 warnings, 2/8 files with UE=2, UW=4', () => {
+ const diagnostics: Parameters[0] = [];
+ for (let i = 0; i < 6; i++) {
+ diagnostics.push({
+ ...baseDiagnostic,
+ filePath: i < 3 ? 'src/a.vue' : 'src/b.vue',
+ plugin: 'vue-eslint',
+ rule: i < 4 ? 'rule-a' : 'rule-b',
+ severity: 'error',
+ });
+ }
+ for (let i = 0; i < 7; i++) {
+ diagnostics.push({
+ ...baseDiagnostic,
+ filePath: i < 4 ? 'src/a.vue' : 'src/b.vue',
+ plugin: 'eslint',
+ rule: `rule-${i % 4}`,
+ severity: 'warning',
+ });
+ }
+
+ const result = calculateScore(diagnostics, 8);
+
+ expect(result.score).toBe(81);
+ expect(result.label).toBe('Great');
+ expect(result.breakdown?.uniqueErrorRules).toBe(2);
+ expect(result.breakdown?.uniqueWarningRules).toBe(4);
+ expect(result.breakdown?.errorCount).toBe(6);
+ expect(result.breakdown?.warningCount).toBe(7);
+ expect(result.breakdown?.filesWithDiagnostics).toBe(2);
+ expect(result.breakdown?.totalFilesScanned).toBe(8);
+ });
+
+ it('caps score at 59 when guardrail input is triggered', () => {
+ const result = calculateScore(
+ [
+ {
+ ...baseDiagnostic,
+ filePath: 'src/a.vue',
+ plugin: 'eslint',
+ rule: 'no-console',
+ severity: 'warning',
+ },
+ ],
+ 8,
+ {
+ hasHighOrCriticalSecurityFindings: true,
+ },
+ );
+
+ expect(result.score).toBe(59);
+ expect(result.breakdown?.didApplyGuardrail).toBe(true);
+ expect(result.breakdown?.guardrailReasons).toEqual(['high/critical security findings']);
+ });
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c65eabe..2f80eea 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -18,6 +18,9 @@ catalogs:
'@types/prompts':
specifier: ^2.4.9
version: 2.4.9
+ angular-eslint:
+ specifier: ^19.4.0
+ version: 19.8.1
commander:
specifier: ^14.0.3
version: 14.0.3
@@ -66,6 +69,9 @@ catalogs:
typescript:
specifier: ^5.9.2
version: 5.9.3
+ typescript-eslint:
+ specifier: ^8.32.0
+ version: 8.56.1
vitest:
specifier: ^4.0.8
version: 4.0.18
@@ -111,17 +117,91 @@ importers:
specifier: 'catalog:'
version: 5.9.3
+ examples/angular/demo-app:
+ dependencies:
+ '@angular/animations':
+ specifier: ^19.0.0
+ version: 19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))
+ '@angular/common':
+ specifier: ^19.0.0
+ version: 19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1)
+ '@angular/compiler':
+ specifier: ^19.0.0
+ version: 19.2.18
+ '@angular/core':
+ specifier: ^19.0.0
+ version: 19.2.18(rxjs@7.8.1)(zone.js@0.15.1)
+ '@angular/forms':
+ specifier: ^19.0.0
+ version: 19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(@angular/platform-browser@19.2.18(@angular/animations@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))(rxjs@7.8.1)
+ '@angular/platform-browser':
+ specifier: ^19.0.0
+ version: 19.2.18(@angular/animations@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))
+ '@angular/platform-browser-dynamic':
+ specifier: ^19.0.0
+ version: 19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/compiler@19.2.18)(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(@angular/platform-browser@19.2.18(@angular/animations@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))
+ rxjs:
+ specifier: ~7.8.0
+ version: 7.8.1
+ tslib:
+ specifier: ^2.3.0
+ version: 2.8.1
+ zone.js:
+ specifier: ~0.15.0
+ version: 0.15.1
+ devDependencies:
+ '@angular-devkit/build-angular':
+ specifier: ^19.0.0
+ version: 19.2.21(@angular/compiler-cli@19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3))(@angular/compiler@19.2.18)(@types/node@20.19.33)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.1(@types/node@20.19.33)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(yaml@2.8.2)
+ '@angular/cli':
+ specifier: ^19.0.0
+ version: 19.2.21(@types/node@20.19.33)(chokidar@4.0.3)
+ '@angular/compiler-cli':
+ specifier: ^19.0.0
+ version: 19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3)
+ '@types/node':
+ specifier: ^20.0.0
+ version: 20.19.33
+ typescript:
+ specifier: ~5.6.0
+ version: 5.6.3
+
+ examples/react/demo-app:
+ dependencies:
+ react:
+ specifier: ^19.0.0
+ version: 19.2.4
+ react-dom:
+ specifier: ^19.0.0
+ version: 19.2.4(react@19.2.4)
+ devDependencies:
+ '@types/react':
+ specifier: ^19.0.0
+ version: 19.2.14
+ '@types/react-dom':
+ specifier: ^19.0.0
+ version: 19.2.3(@types/react@19.2.14)
+ '@vitejs/plugin-react':
+ specifier: ^4.3.4
+ version: 4.7.0(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
+ typescript:
+ specifier: ^5.0.0
+ version: 5.6.3
+ vite:
+ specifier: ^6.0.0
+ version: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
+
examples/svelte/demo-app:
devDependencies:
'@sveltejs/adapter-node':
specifier: ^4.0.0
- version: 4.0.1(@sveltejs/kit@2.53.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)))(svelte@5.53.0)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)))
+ version: 4.0.1(@sveltejs/kit@2.53.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)))(svelte@5.53.0)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)))
'@sveltejs/kit':
specifier: ^2.0.0
- version: 2.53.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)))(svelte@5.53.0)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))
+ version: 2.53.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)))(svelte@5.53.0)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
'@sveltejs/vite-plugin-svelte':
specifier: ^5.0.0
- version: 5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))
+ version: 5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
svelte:
specifier: ^5.0.0
version: 5.53.0
@@ -133,19 +213,19 @@ importers:
version: 5.9.3
vite:
specifier: ^6.0.0
- version: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ version: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
examples/vue/demo-app:
devDependencies:
'@vitejs/plugin-vue':
specifier: ^5.0.0
- version: 5.2.4(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))(vue@3.5.28(typescript@5.9.3))
+ version: 5.2.4(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(vue@3.5.28(typescript@5.9.3))
typescript:
specifier: ^5.0.0
version: 5.9.3
vite:
specifier: ^6.0.0
- version: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ version: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
vue:
specifier: ^3.0.0
version: 3.5.28(typescript@5.9.3)
@@ -153,8 +233,69 @@ importers:
specifier: ^2.1.10
version: 2.2.12(typescript@5.9.3)
+ packages/angular-doctor:
+ dependencies:
+ '@eslint/js':
+ specifier: ^9.28.0
+ version: 9.39.3
+ '@framework-doctor/core':
+ specifier: workspace:*
+ version: link:../core
+ angular-eslint:
+ specifier: 'catalog:'
+ version: 19.8.1(chokidar@4.0.3)(eslint@9.39.3(jiti@2.6.1))(typescript-eslint@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(typescript@5.9.3)
+ commander:
+ specifier: 'catalog:'
+ version: 14.0.3
+ eslint:
+ specifier: 'catalog:'
+ version: 9.39.3(jiti@2.6.1)
+ knip:
+ specifier: 'catalog:'
+ version: 5.84.1(@types/node@25.3.0)(typescript@5.9.3)
+ ora:
+ specifier: 'catalog:'
+ version: 9.3.0
+ oxlint:
+ specifier: 'catalog:'
+ version: 1.49.0
+ picocolors:
+ specifier: 'catalog:'
+ version: 1.1.1
+ prompts:
+ specifier: ^2.4.2
+ version: 2.4.2
+ typescript-eslint:
+ specifier: 'catalog:'
+ version: 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ devDependencies:
+ '@types/node':
+ specifier: 'catalog:'
+ version: 25.3.0
+ '@types/prompts':
+ specifier: 'catalog:'
+ version: 2.4.9
+ cross-env:
+ specifier: 'catalog:'
+ version: 10.1.0
+ rimraf:
+ specifier: 'catalog:'
+ version: 6.1.3
+ tsdown:
+ specifier: 'catalog:'
+ version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3))
+ typescript:
+ specifier: 'catalog:'
+ version: 5.9.3
+ vitest:
+ specifier: 'catalog:'
+ version: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
+
packages/cli:
dependencies:
+ '@framework-doctor/angular':
+ specifier: workspace:*
+ version: link:../angular-doctor
'@framework-doctor/react':
specifier: workspace:*
version: link:../react-doctor
@@ -256,7 +397,7 @@ importers:
version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3))
vitest:
specifier: 'catalog:'
- version: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ version: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
packages/svelte-doctor:
dependencies:
@@ -305,7 +446,7 @@ importers:
version: 5.9.3
vitest:
specifier: 'catalog:'
- version: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ version: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
packages/vue-doctor:
dependencies:
@@ -366,10 +507,226 @@ importers:
version: 5.9.3
vitest:
specifier: 'catalog:'
- version: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ version: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
packages:
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@angular-devkit/architect@0.1902.21':
+ resolution: {integrity: sha512-NiSeHVZ7wCqXDtCa3mXox2cRYlul9U/ianfGo1q9PIL4KofjXvVluQcpDr9d9bRO5sl+ApkwazaJPbc+MsW3fA==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+
+ '@angular-devkit/build-angular@19.2.21':
+ resolution: {integrity: sha512-fL1VTaxee0tWK5wegiJkmP0WmVyAbYzFBIf2d1Yh7Z3SkzhbZgp3Zi/3+cOrBC+nGx8s1eV0wvHjv76IE9Ih0Q==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ peerDependencies:
+ '@angular/compiler-cli': ^19.0.0 || ^19.2.0-next.0
+ '@angular/localize': ^19.0.0 || ^19.2.0-next.0
+ '@angular/platform-server': ^19.0.0 || ^19.2.0-next.0
+ '@angular/service-worker': ^19.0.0 || ^19.2.0-next.0
+ '@angular/ssr': ^19.2.21
+ '@web/test-runner': ^0.20.0
+ browser-sync: ^3.0.2
+ jest: ^29.5.0
+ jest-environment-jsdom: ^29.5.0
+ karma: ^6.3.0
+ ng-packagr: ^19.0.0 || ^19.2.0-next.0
+ protractor: ^7.0.0
+ tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0
+ typescript: '>=5.5 <5.9'
+ peerDependenciesMeta:
+ '@angular/localize':
+ optional: true
+ '@angular/platform-server':
+ optional: true
+ '@angular/service-worker':
+ optional: true
+ '@angular/ssr':
+ optional: true
+ '@web/test-runner':
+ optional: true
+ browser-sync:
+ optional: true
+ jest:
+ optional: true
+ jest-environment-jsdom:
+ optional: true
+ karma:
+ optional: true
+ ng-packagr:
+ optional: true
+ protractor:
+ optional: true
+ tailwindcss:
+ optional: true
+
+ '@angular-devkit/build-webpack@0.1902.21':
+ resolution: {integrity: sha512-dNxEcE1UkThKMPkCWH58+W+IQTdtU6kFR+/f1NkbH/qigy/AnrMavzl5ml9hvm5iosiESSrQBKdH0Ox477jGzQ==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ peerDependencies:
+ webpack: ^5.30.0
+ webpack-dev-server: ^5.0.2
+
+ '@angular-devkit/core@19.2.21':
+ resolution: {integrity: sha512-EkPtDH+j+2CUeaMtbOqr2JGBcafAw0+/GXwjb23+Doig7mZlA57G1D/LDFb4l7Fd2yEKjXNYpfVCXQYuKQ4O+Q==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ peerDependencies:
+ chokidar: ^4.0.0
+ peerDependenciesMeta:
+ chokidar:
+ optional: true
+
+ '@angular-devkit/schematics@19.2.21':
+ resolution: {integrity: sha512-3FcILxgAzN7yrQog+gq9esV3rI+Zpg/W61rmCdEwc/1msUf7vqfrhttX45M/1//UOporZdM2csiPc0pHrRqfFw==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+
+ '@angular-eslint/builder@19.8.1':
+ resolution: {integrity: sha512-NOMkw0xgDoDVCLkL5nkkvdd3ouDYkOGqtEmabTR7N4/kQnk1R4coOTWGCqAgMXCFdxlyjuxquDwuJ+yni81pRg==}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+
+ '@angular-eslint/bundled-angular-compiler@19.8.1':
+ resolution: {integrity: sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==}
+
+ '@angular-eslint/eslint-plugin-template@19.8.1':
+ resolution: {integrity: sha512-0ZVQldndLrDfB0tzFe/uIwvkUcakw8qGxvkEU0l7kSbv/ngNQ/qrkRi7P64otB15inIDUNZI2jtmVat52dqSfQ==}
+ peerDependencies:
+ '@angular-eslint/template-parser': 19.8.1
+ '@typescript-eslint/types': ^7.11.0 || ^8.0.0
+ '@typescript-eslint/utils': ^7.11.0 || ^8.0.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+
+ '@angular-eslint/eslint-plugin@19.8.1':
+ resolution: {integrity: sha512-wZEBMPwD2TRhifG751hcj137EMIEaFmsxRB2EI+vfINCgPnFGSGGOHXqi8aInn9fXqHs7VbXkAzXYdBsvy1m4Q==}
+ peerDependencies:
+ '@typescript-eslint/utils': ^7.11.0 || ^8.0.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+
+ '@angular-eslint/schematics@19.8.1':
+ resolution: {integrity: sha512-MKzfO3puOCuQFgP8XDUkEr5eaqcCQLAdYLLMcywEO/iRs1eRHL46+rkW+SjDp1cUqlxKtu+rLiTYr0T/O4fi9Q==}
+
+ '@angular-eslint/template-parser@19.8.1':
+ resolution: {integrity: sha512-pQiOg+se1AU/ncMlnJ9V6xYnMQ84qI1BGWuJpbU6A99VTXJg90scg0+T7DWmKssR1YjP5qmmBtrZfKsHEcLW/A==}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+
+ '@angular-eslint/utils@19.8.1':
+ resolution: {integrity: sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==}
+ peerDependencies:
+ '@typescript-eslint/utils': ^7.11.0 || ^8.0.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+
+ '@angular/animations@19.2.18':
+ resolution: {integrity: sha512-c76x1t+OiSstPsvJdHmV8Q4taF+8SxWKqiY750fOjpd01it4jJbU6YQqIroC6Xie7154zZIxOTHH2uTj+nm5qA==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0}
+ peerDependencies:
+ '@angular/common': 19.2.18
+ '@angular/core': 19.2.18
+
+ '@angular/build@19.2.21':
+ resolution: {integrity: sha512-k2t+7yrzM8ylH7PQlpXGkQrNRcA4QN10Pzspq1BzXGTlxGihsDWSi10Tyavytj4rd8Sy86dspSwUAQAM7atfgg==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ peerDependencies:
+ '@angular/compiler': ^19.0.0 || ^19.2.0-next.0
+ '@angular/compiler-cli': ^19.0.0 || ^19.2.0-next.0
+ '@angular/localize': ^19.0.0 || ^19.2.0-next.0
+ '@angular/platform-server': ^19.0.0 || ^19.2.0-next.0
+ '@angular/service-worker': ^19.0.0 || ^19.2.0-next.0
+ '@angular/ssr': ^19.2.21
+ karma: ^6.4.0
+ less: ^4.2.0
+ ng-packagr: ^19.0.0 || ^19.2.0-next.0
+ postcss: ^8.4.0
+ tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0
+ typescript: '>=5.5 <5.9'
+ peerDependenciesMeta:
+ '@angular/localize':
+ optional: true
+ '@angular/platform-server':
+ optional: true
+ '@angular/service-worker':
+ optional: true
+ '@angular/ssr':
+ optional: true
+ karma:
+ optional: true
+ less:
+ optional: true
+ ng-packagr:
+ optional: true
+ postcss:
+ optional: true
+ tailwindcss:
+ optional: true
+
+ '@angular/cli@19.2.21':
+ resolution: {integrity: sha512-fCrwCY4uLvgpoOheM0XS/xE0rRLiqZfKoiOvbwuWQWEm12UiHxPUyoy87hUMArgTJkKAtstOpKixep1RNst1BA==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ hasBin: true
+
+ '@angular/common@19.2.18':
+ resolution: {integrity: sha512-CrV02Omzw/QtfjlEVXVPJVXipdx83NuA+qSASZYrxrhKFusUZyK3P/Zznqg+wiAeNDbedQwMUVqoAARHf0xQrw==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0}
+ peerDependencies:
+ '@angular/core': 19.2.18
+ rxjs: ^6.5.3 || ^7.4.0
+
+ '@angular/compiler-cli@19.2.18':
+ resolution: {integrity: sha512-N4TMtLfImJIoMaRL6mx7885UBeQidywptHH6ACZj71Ar6++DBc1mMlcwuvbeJCd3r3y8MQ5nLv5PZSN/tHr13w==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@angular/compiler': 19.2.18
+ typescript: '>=5.5 <5.9'
+
+ '@angular/compiler@19.2.18':
+ resolution: {integrity: sha512-3MscvODxRVxc3Cs0ZlHI5Pk5rEvE80otfvxZTMksOZuPlv1B+S8MjWfc3X3jk9SbyUEzODBEH55iCaBHD48V3g==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0}
+
+ '@angular/core@19.2.18':
+ resolution: {integrity: sha512-+QRrf0Igt8ccUWXHA+7doK5W6ODyhHdqVyblSlcQ8OciwkzIIGGEYNZom5OZyWMh+oI54lcSeyV2O3xaDepSrQ==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0}
+ peerDependencies:
+ rxjs: ^6.5.3 || ^7.4.0
+ zone.js: ~0.15.0
+
+ '@angular/forms@19.2.18':
+ resolution: {integrity: sha512-pe40934jWhoS7DyGl7jyZdoj1gvBgur2t1zrJD+csEkTitYnW14+La2Pv6SW1pNX5nIzFsgsS9Nex1KcH5S6Tw==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0}
+ peerDependencies:
+ '@angular/common': 19.2.18
+ '@angular/core': 19.2.18
+ '@angular/platform-browser': 19.2.18
+ rxjs: ^6.5.3 || ^7.4.0
+
+ '@angular/platform-browser-dynamic@19.2.18':
+ resolution: {integrity: sha512-wqDtK2yVN5VDqVeOSOfqELdu40fyoIDknBGSxA27CEXzFVdMWJyIpuvUi+GMa+9eGjlS+1uVVBaRwxmnuvHj+A==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0}
+ peerDependencies:
+ '@angular/common': 19.2.18
+ '@angular/compiler': 19.2.18
+ '@angular/core': 19.2.18
+ '@angular/platform-browser': 19.2.18
+
+ '@angular/platform-browser@19.2.18':
+ resolution: {integrity: sha512-eahtsHPyXTYLARs9YOlXhnXGgzw0wcyOcDkBvNWK/3lA0NHIgIHmQgXAmBo+cJ+g9skiEQTD2OmSrrwbFKWJkw==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0}
+ peerDependencies:
+ '@angular/animations': 19.2.18
+ '@angular/common': 19.2.18
+ '@angular/core': 19.2.18
+ peerDependenciesMeta:
+ '@angular/animations':
+ optional: true
+
'@babel/code-frame@7.29.0':
resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
engines: {node: '>=6.9.0'}
@@ -378,10 +735,22 @@ packages:
resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==}
engines: {node: '>=6.9.0'}
+ '@babel/core@7.26.10':
+ resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.26.9':
+ resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/core@7.29.0':
resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==}
engines: {node: '>=6.9.0'}
+ '@babel/generator@7.26.10':
+ resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==}
+ engines: {node: '>=6.9.0'}
+
'@babel/generator@7.29.1':
resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==}
engines: {node: '>=6.9.0'}
@@ -390,14 +759,43 @@ packages:
resolution: {integrity: sha512-3ypWOOiC4AYHKr8vYRVtWtWmyvcoItHtVqF8paFax+ydpmUdPsJpLBkBBs5ItmhdrwC3a0ZSqqFAdzls4ODP3w==}
engines: {node: ^20.19.0 || >=22.12.0}
+ '@babel/helper-annotate-as-pure@7.25.9':
+ resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-compilation-targets@7.28.6':
resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-create-class-features-plugin@7.28.6':
+ resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-create-regexp-features-plugin@7.28.5':
+ resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-define-polyfill-provider@0.6.6':
+ resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
'@babel/helper-globals@7.28.0':
resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-member-expression-to-functions@7.28.5':
+ resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-module-imports@7.28.6':
resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==}
engines: {node: '>=6.9.0'}
@@ -408,6 +806,34 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
+ '@babel/helper-optimise-call-expression@7.27.1':
+ resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.28.6':
+ resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-remap-async-to-generator@7.27.1':
+ resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-replace-supers@7.28.6':
+ resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-split-export-declaration@7.24.7':
+ resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-string-parser@7.27.1':
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
engines: {node: '>=6.9.0'}
@@ -428,6 +854,10 @@ packages:
resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-wrap-function@7.28.6':
+ resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helpers@7.28.6':
resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==}
engines: {node: '>=6.9.0'}
@@ -442,71 +872,464 @@ packages:
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
- '@babel/runtime@7.28.6':
- resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==}
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5':
+ resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==}
engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
- '@babel/template@7.28.6':
- resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1':
+ resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==}
engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
- '@babel/traverse@7.29.0':
- resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1':
+ resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==}
engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
- '@babel/types@7.29.0':
- resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1':
+ resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==}
engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.13.0
- '@babel/types@8.0.0-rc.1':
- resolution: {integrity: sha512-ubmJ6TShyaD69VE9DQrlXcdkvJbmwWPB8qYj0H2kaJi29O7vJT9ajSdBd2W8CG34pwL9pYA74fi7RHC1qbLoVQ==}
- engines: {node: ^20.19.0 || >=22.12.0}
-
- '@changesets/apply-release-plan@7.0.14':
- resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==}
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6':
+ resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
- '@changesets/assemble-release-plan@6.0.9':
- resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==}
+ '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2':
+ resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/changelog-git@0.2.1':
- resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==}
+ '@babel/plugin-syntax-import-assertions@7.28.6':
+ resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/cli@2.29.8':
- resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==}
- hasBin: true
+ '@babel/plugin-syntax-import-attributes@7.26.0':
+ resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/config@3.1.2':
- resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==}
+ '@babel/plugin-syntax-import-attributes@7.28.6':
+ resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/errors@0.2.0':
- resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==}
+ '@babel/plugin-syntax-unicode-sets-regex@7.18.6':
+ resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
- '@changesets/get-dependents-graph@2.1.3':
- resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==}
+ '@babel/plugin-transform-arrow-functions@7.27.1':
+ resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/get-release-plan@4.0.14':
- resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==}
+ '@babel/plugin-transform-async-generator-functions@7.26.8':
+ resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/get-version-range-type@0.4.0':
- resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==}
+ '@babel/plugin-transform-async-to-generator@7.25.9':
+ resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/git@3.0.4':
- resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==}
+ '@babel/plugin-transform-block-scoped-functions@7.27.1':
+ resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/logger@0.1.1':
- resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==}
+ '@babel/plugin-transform-block-scoping@7.28.6':
+ resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/parse@0.4.2':
- resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==}
+ '@babel/plugin-transform-class-properties@7.28.6':
+ resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/pre@2.0.2':
- resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==}
+ '@babel/plugin-transform-class-static-block@7.28.6':
+ resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.12.0
- '@changesets/read@0.6.6':
- resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==}
+ '@babel/plugin-transform-classes@7.28.6':
+ resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- '@changesets/should-skip-package@0.1.2':
- resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==}
+ '@babel/plugin-transform-computed-properties@7.28.6':
+ resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-destructuring@7.28.5':
+ resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-dotall-regex@7.28.6':
+ resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-duplicate-keys@7.27.1':
+ resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0':
+ resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-dynamic-import@7.27.1':
+ resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-exponentiation-operator@7.28.6':
+ resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-export-namespace-from@7.27.1':
+ resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-for-of@7.27.1':
+ resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-function-name@7.27.1':
+ resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-json-strings@7.28.6':
+ resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-literals@7.27.1':
+ resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-logical-assignment-operators@7.28.6':
+ resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-member-expression-literals@7.27.1':
+ resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-amd@7.27.1':
+ resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-commonjs@7.28.6':
+ resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-systemjs@7.29.0':
+ resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-umd@7.27.1':
+ resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-named-capturing-groups-regex@7.29.0':
+ resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-new-target@7.27.1':
+ resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.28.6':
+ resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-numeric-separator@7.28.6':
+ resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-object-rest-spread@7.28.6':
+ resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-object-super@7.27.1':
+ resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-catch-binding@7.28.6':
+ resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-chaining@7.28.6':
+ resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-parameters@7.27.7':
+ resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-private-methods@7.28.6':
+ resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-private-property-in-object@7.28.6':
+ resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-property-literals@7.27.1':
+ resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1':
+ resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1':
+ resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-regenerator@7.29.0':
+ resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-regexp-modifiers@7.28.6':
+ resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-reserved-words@7.27.1':
+ resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-runtime@7.26.10':
+ resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-shorthand-properties@7.27.1':
+ resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-spread@7.28.6':
+ resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-sticky-regex@7.27.1':
+ resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-template-literals@7.27.1':
+ resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typeof-symbol@7.27.1':
+ resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-escapes@7.27.1':
+ resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-property-regex@7.28.6':
+ resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-regex@7.27.1':
+ resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-sets-regex@7.28.6':
+ resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/preset-env@7.26.9':
+ resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/preset-modules@0.1.6-no-external-plugins':
+ resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
+
+ '@babel/runtime@7.26.10':
+ resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/runtime@7.28.6':
+ resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.28.6':
+ resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.29.0':
+ resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@8.0.0-rc.1':
+ resolution: {integrity: sha512-ubmJ6TShyaD69VE9DQrlXcdkvJbmwWPB8qYj0H2kaJi29O7vJT9ajSdBd2W8CG34pwL9pYA74fi7RHC1qbLoVQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ '@changesets/apply-release-plan@7.0.14':
+ resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==}
+
+ '@changesets/assemble-release-plan@6.0.9':
+ resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==}
+
+ '@changesets/changelog-git@0.2.1':
+ resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==}
+
+ '@changesets/cli@2.29.8':
+ resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==}
+ hasBin: true
+
+ '@changesets/config@3.1.2':
+ resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==}
+
+ '@changesets/errors@0.2.0':
+ resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==}
+
+ '@changesets/get-dependents-graph@2.1.3':
+ resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==}
+
+ '@changesets/get-release-plan@4.0.14':
+ resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==}
+
+ '@changesets/get-version-range-type@0.4.0':
+ resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==}
+
+ '@changesets/git@3.0.4':
+ resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==}
+
+ '@changesets/logger@0.1.1':
+ resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==}
+
+ '@changesets/parse@0.4.2':
+ resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==}
+
+ '@changesets/pre@2.0.2':
+ resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==}
+
+ '@changesets/read@0.6.6':
+ resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==}
+
+ '@changesets/should-skip-package@0.1.2':
+ resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==}
'@changesets/types@4.1.0':
resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==}
@@ -517,6 +1340,10 @@ packages:
'@changesets/write@0.4.0':
resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
+ '@discoveryjs/json-ext@0.6.3':
+ resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==}
+ engines: {node: '>=14.17.0'}
+
'@emnapi/core@1.8.1':
resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==}
@@ -535,74 +1362,152 @@ packages:
cpu: [ppc64]
os: [aix]
+ '@esbuild/aix-ppc64@0.25.4':
+ resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/android-arm64@0.25.12':
resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm64@0.25.4':
+ resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm@0.25.12':
resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
+ '@esbuild/android-arm@0.25.4':
+ resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-x64@0.25.12':
resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
+ '@esbuild/android-x64@0.25.4':
+ resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/darwin-arm64@0.25.12':
resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-arm64@0.25.4':
+ resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.25.12':
resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
+ '@esbuild/darwin-x64@0.25.4':
+ resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/freebsd-arm64@0.25.12':
resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-arm64@0.25.4':
+ resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.25.12':
resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.25.4':
+ resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/linux-arm64@0.25.12':
resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm64@0.25.4':
+ resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm@0.25.12':
resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
+ '@esbuild/linux-arm@0.25.4':
+ resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-ia32@0.25.12':
resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-ia32@0.25.4':
+ resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-loong64@0.25.12':
resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.25.12':
- resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+ '@esbuild/linux-loong64@0.25.4':
+ resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.12':
+ resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.4':
+ resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
@@ -613,48 +1518,96 @@ packages:
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-ppc64@0.25.4':
+ resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.25.12':
resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-riscv64@0.25.4':
+ resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-s390x@0.25.12':
resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-s390x@0.25.4':
+ resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-x64@0.25.12':
resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
+ '@esbuild/linux-x64@0.25.4':
+ resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
'@esbuild/netbsd-arm64@0.25.12':
resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
+ '@esbuild/netbsd-arm64@0.25.4':
+ resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.25.12':
resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.25.4':
+ resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
'@esbuild/openbsd-arm64@0.25.12':
resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
+ '@esbuild/openbsd-arm64@0.25.4':
+ resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.25.12':
resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.25.4':
+ resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
'@esbuild/openharmony-arm64@0.25.12':
resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
engines: {node: '>=18'}
@@ -667,24 +1620,48 @@ packages:
cpu: [x64]
os: [sunos]
+ '@esbuild/sunos-x64@0.25.4':
+ resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/win32-arm64@0.25.12':
resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-arm64@0.25.4':
+ resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-ia32@0.25.12':
resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-ia32@0.25.4':
+ resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-x64@0.25.12':
resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
+ '@esbuild/win32-x64@0.25.4':
+ resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
'@eslint-community/eslint-utils@4.9.1':
resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -739,6 +1716,64 @@ packages:
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
+ '@inquirer/ansi@1.0.2':
+ resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==}
+ engines: {node: '>=18'}
+
+ '@inquirer/checkbox@4.3.2':
+ resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/confirm@5.1.21':
+ resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/confirm@5.1.6':
+ resolution: {integrity: sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/core@10.3.2':
+ resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/editor@4.2.23':
+ resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/expand@4.0.23':
+ resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
'@inquirer/external-editor@1.0.3':
resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==}
engines: {node: '>=18'}
@@ -748,6 +1783,98 @@ packages:
'@types/node':
optional: true
+ '@inquirer/figures@1.0.15':
+ resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==}
+ engines: {node: '>=18'}
+
+ '@inquirer/input@4.3.1':
+ resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/number@3.0.23':
+ resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/password@4.0.23':
+ resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/prompts@7.3.2':
+ resolution: {integrity: sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/rawlist@4.1.11':
+ resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/search@3.2.2':
+ resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/select@4.4.2':
+ resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/type@1.5.5':
+ resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==}
+ engines: {node: '>=18'}
+
+ '@inquirer/type@3.0.10':
+ resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@isaacs/fs-minipass@4.0.1':
+ resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
+ engines: {node: '>=18.0.0'}
+
+ '@istanbuljs/schema@0.1.3':
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -758,87 +1885,437 @@ packages:
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
'@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
- '@manypkg/find-root@1.1.0':
- resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
+ '@jsonjoy.com/base64@1.1.2':
+ resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
- '@manypkg/get-packages@1.1.3':
- resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
+ '@jsonjoy.com/base64@17.67.0':
+ resolution: {integrity: sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
- '@napi-rs/wasm-runtime@1.1.1':
- resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==}
+ '@jsonjoy.com/buffers@1.2.1':
+ resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
- '@nodelib/fs.scandir@2.1.5':
- resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
- engines: {node: '>= 8'}
+ '@jsonjoy.com/buffers@17.67.0':
+ resolution: {integrity: sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
- '@nodelib/fs.stat@2.0.5':
- resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
- engines: {node: '>= 8'}
+ '@jsonjoy.com/codegen@1.0.0':
+ resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
- '@nodelib/fs.walk@1.2.8':
- resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
- engines: {node: '>= 8'}
+ '@jsonjoy.com/codegen@17.67.0':
+ resolution: {integrity: sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
- '@nuxt/eslint-plugin@1.15.1':
- resolution: {integrity: sha512-nUw2qOvo/ZqaqPWp2wPMBi6F1hgMKiDYGEJB/NHdUIYHNibgcIdq7cb9QksyudxumaPOD/M9h+62eHeUIzArIQ==}
+ '@jsonjoy.com/fs-core@4.56.10':
+ resolution: {integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==}
+ engines: {node: '>=10.0'}
peerDependencies:
- eslint: ^9.0.0 || ^10.0.0
+ tslib: '2'
- '@oxc-project/types@0.112.0':
- resolution: {integrity: sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==}
+ '@jsonjoy.com/fs-fsa@4.56.10':
+ resolution: {integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
- '@oxc-resolver/binding-android-arm-eabi@11.17.1':
- resolution: {integrity: sha512-+VuZyMYYaap5uDAU1xDU3Kul0FekLqpBS8kI5JozlWfYQKnc/HsZg2gHPkQrj0SC9lt74WMNCfOzZZJlYXSdEQ==}
- cpu: [arm]
- os: [android]
+ '@jsonjoy.com/fs-node-builtins@4.56.10':
+ resolution: {integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
- '@oxc-resolver/binding-android-arm64@11.17.1':
- resolution: {integrity: sha512-YlDDTjvOEKhom/cRSVsXsMVeXVIAM9PJ/x2mfe08rfuS0iIEfJd8PngKbEIhG72WPxleUa+vkEZj9ncmC14z3Q==}
- cpu: [arm64]
- os: [android]
+ '@jsonjoy.com/fs-node-to-fsa@4.56.10':
+ resolution: {integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
- '@oxc-resolver/binding-darwin-arm64@11.17.1':
- resolution: {integrity: sha512-HOYYLSY4JDk14YkXaz/ApgJYhgDP4KsG8EZpgpOxdszGW9HmIMMY/vXqVKYW74dSH+GQkIXYxBrEh3nv+XODVg==}
+ '@jsonjoy.com/fs-node-utils@4.56.10':
+ resolution: {integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-node@4.56.10':
+ resolution: {integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-print@4.56.10':
+ resolution: {integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/fs-snapshot@4.56.10':
+ resolution: {integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/json-pack@1.21.0':
+ resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/json-pack@17.67.0':
+ resolution: {integrity: sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/json-pointer@1.0.2':
+ resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/json-pointer@17.67.0':
+ resolution: {integrity: sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/util@1.9.0':
+ resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@jsonjoy.com/util@17.67.0':
+ resolution: {integrity: sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ '@leichtgewicht/ip-codec@2.0.5':
+ resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==}
+
+ '@listr2/prompt-adapter-inquirer@2.0.18':
+ resolution: {integrity: sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ '@inquirer/prompts': '>= 3 < 8'
+
+ '@lmdb/lmdb-darwin-arm64@3.2.6':
+ resolution: {integrity: sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==}
cpu: [arm64]
os: [darwin]
- '@oxc-resolver/binding-darwin-x64@11.17.1':
- resolution: {integrity: sha512-JHPJbsa5HvPq2/RIdtGlqfaG9zV2WmgvHrKTYmlW0L5esqtKCBuetFudXTBzkNcyD69kSZLzH92AzTr6vFHMFg==}
+ '@lmdb/lmdb-darwin-x64@3.2.6':
+ resolution: {integrity: sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==}
cpu: [x64]
os: [darwin]
- '@oxc-resolver/binding-freebsd-x64@11.17.1':
- resolution: {integrity: sha512-UD1FRC8j8xZstFXYsXwQkNmmg7vUbee006IqxokwDUUA+xEgKZDpLhBEiVKM08Urb+bn7Q0gn6M1pyNR0ng5mg==}
- cpu: [x64]
- os: [freebsd]
-
- '@oxc-resolver/binding-linux-arm-gnueabihf@11.17.1':
- resolution: {integrity: sha512-wFWC1wyf2ROFWTxK5x0Enm++DSof3EBQ/ypyAesMDLiYxOOASDoMOZG1ylWUnlKaCt5W7eNOWOzABpdfFf/ssA==}
- cpu: [arm]
+ '@lmdb/lmdb-linux-arm64@3.2.6':
+ resolution: {integrity: sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==}
+ cpu: [arm64]
os: [linux]
- '@oxc-resolver/binding-linux-arm-musleabihf@11.17.1':
- resolution: {integrity: sha512-k/hUif0GEBk/csSqCfTPXb8AAVs1NNWCa/skBghvNbTtORcWfOVqJ3mM+2pE189+enRm4UnryLREu5ysI0kXEQ==}
+ '@lmdb/lmdb-linux-arm@3.2.6':
+ resolution: {integrity: sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==}
cpu: [arm]
os: [linux]
- '@oxc-resolver/binding-linux-arm64-gnu@11.17.1':
- resolution: {integrity: sha512-Cwm6A071ww60QouJ9LoHAwBgEoZzHQ0Qaqk2E7WLfBdiQN9mLXIDhnrpn04hlRElRPhLiu/dtg+o5PPLvaINXQ==}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@oxc-resolver/binding-linux-arm64-musl@11.17.1':
- resolution: {integrity: sha512-+hwlE2v3m0r3sk93SchJL1uyaKcPjf+NGO/TD2DZUDo+chXx7FfaEj0nUMewigSt7oZ2sQN9Z4NJOtUa75HE5Q==}
- cpu: [arm64]
+ '@lmdb/lmdb-linux-x64@3.2.6':
+ resolution: {integrity: sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==}
+ cpu: [x64]
os: [linux]
- libc: [musl]
+
+ '@lmdb/lmdb-win32-x64@3.2.6':
+ resolution: {integrity: sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==}
+ cpu: [x64]
+ os: [win32]
+
+ '@manypkg/find-root@1.1.0':
+ resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
+
+ '@manypkg/get-packages@1.1.3':
+ resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
+
+ '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
+ resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3':
+ resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3':
+ resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3':
+ resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3':
+ resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
+ resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@napi-rs/nice-android-arm-eabi@1.1.1':
+ resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [android]
+
+ '@napi-rs/nice-android-arm64@1.1.1':
+ resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [android]
+
+ '@napi-rs/nice-darwin-arm64@1.1.1':
+ resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@napi-rs/nice-darwin-x64@1.1.1':
+ resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@napi-rs/nice-freebsd-x64@1.1.1':
+ resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@napi-rs/nice-linux-arm-gnueabihf@1.1.1':
+ resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@napi-rs/nice-linux-arm64-gnu@1.1.1':
+ resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@napi-rs/nice-linux-arm64-musl@1.1.1':
+ resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@napi-rs/nice-linux-ppc64-gnu@1.1.1':
+ resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==}
+ engines: {node: '>= 10'}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@napi-rs/nice-linux-riscv64-gnu@1.1.1':
+ resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==}
+ engines: {node: '>= 10'}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@napi-rs/nice-linux-s390x-gnu@1.1.1':
+ resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==}
+ engines: {node: '>= 10'}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@napi-rs/nice-linux-x64-gnu@1.1.1':
+ resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@napi-rs/nice-linux-x64-musl@1.1.1':
+ resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@napi-rs/nice-openharmony-arm64@1.1.1':
+ resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@napi-rs/nice-win32-arm64-msvc@1.1.1':
+ resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@napi-rs/nice-win32-ia32-msvc@1.1.1':
+ resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==}
+ engines: {node: '>= 10'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@napi-rs/nice-win32-x64-msvc@1.1.1':
+ resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@napi-rs/nice@1.1.1':
+ resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==}
+ engines: {node: '>= 10'}
+
+ '@napi-rs/wasm-runtime@1.1.1':
+ resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==}
+
+ '@ngtools/webpack@19.2.21':
+ resolution: {integrity: sha512-Z2buhzBj5snJH6mUfnNOrVkccPQwtOeRYMaLbNCaVbOGM7Ln0fT3vlPseMGF+rSI7tNhbfgrmVh7qAd99sAk5g==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ peerDependencies:
+ '@angular/compiler-cli': ^19.0.0 || ^19.2.0-next.0
+ typescript: '>=5.5 <5.9'
+ webpack: ^5.54.0
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@npmcli/agent@3.0.0':
+ resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@npmcli/fs@4.0.0':
+ resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@npmcli/git@6.0.3':
+ resolution: {integrity: sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@npmcli/installed-package-contents@3.0.0':
+ resolution: {integrity: sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+ hasBin: true
+
+ '@npmcli/node-gyp@4.0.0':
+ resolution: {integrity: sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@npmcli/package-json@6.2.0':
+ resolution: {integrity: sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@npmcli/promise-spawn@8.0.3':
+ resolution: {integrity: sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@npmcli/redact@3.2.2':
+ resolution: {integrity: sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@npmcli/run-script@9.1.0':
+ resolution: {integrity: sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@nuxt/eslint-plugin@1.15.1':
+ resolution: {integrity: sha512-nUw2qOvo/ZqaqPWp2wPMBi6F1hgMKiDYGEJB/NHdUIYHNibgcIdq7cb9QksyudxumaPOD/M9h+62eHeUIzArIQ==}
+ peerDependencies:
+ eslint: ^9.0.0 || ^10.0.0
+
+ '@oxc-project/types@0.112.0':
+ resolution: {integrity: sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==}
+
+ '@oxc-resolver/binding-android-arm-eabi@11.17.1':
+ resolution: {integrity: sha512-+VuZyMYYaap5uDAU1xDU3Kul0FekLqpBS8kI5JozlWfYQKnc/HsZg2gHPkQrj0SC9lt74WMNCfOzZZJlYXSdEQ==}
+ cpu: [arm]
+ os: [android]
+
+ '@oxc-resolver/binding-android-arm64@11.17.1':
+ resolution: {integrity: sha512-YlDDTjvOEKhom/cRSVsXsMVeXVIAM9PJ/x2mfe08rfuS0iIEfJd8PngKbEIhG72WPxleUa+vkEZj9ncmC14z3Q==}
+ cpu: [arm64]
+ os: [android]
+
+ '@oxc-resolver/binding-darwin-arm64@11.17.1':
+ resolution: {integrity: sha512-HOYYLSY4JDk14YkXaz/ApgJYhgDP4KsG8EZpgpOxdszGW9HmIMMY/vXqVKYW74dSH+GQkIXYxBrEh3nv+XODVg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@oxc-resolver/binding-darwin-x64@11.17.1':
+ resolution: {integrity: sha512-JHPJbsa5HvPq2/RIdtGlqfaG9zV2WmgvHrKTYmlW0L5esqtKCBuetFudXTBzkNcyD69kSZLzH92AzTr6vFHMFg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@oxc-resolver/binding-freebsd-x64@11.17.1':
+ resolution: {integrity: sha512-UD1FRC8j8xZstFXYsXwQkNmmg7vUbee006IqxokwDUUA+xEgKZDpLhBEiVKM08Urb+bn7Q0gn6M1pyNR0ng5mg==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@oxc-resolver/binding-linux-arm-gnueabihf@11.17.1':
+ resolution: {integrity: sha512-wFWC1wyf2ROFWTxK5x0Enm++DSof3EBQ/ypyAesMDLiYxOOASDoMOZG1ylWUnlKaCt5W7eNOWOzABpdfFf/ssA==}
+ cpu: [arm]
+ os: [linux]
+
+ '@oxc-resolver/binding-linux-arm-musleabihf@11.17.1':
+ resolution: {integrity: sha512-k/hUif0GEBk/csSqCfTPXb8AAVs1NNWCa/skBghvNbTtORcWfOVqJ3mM+2pE189+enRm4UnryLREu5ysI0kXEQ==}
+ cpu: [arm]
+ os: [linux]
+
+ '@oxc-resolver/binding-linux-arm64-gnu@11.17.1':
+ resolution: {integrity: sha512-Cwm6A071ww60QouJ9LoHAwBgEoZzHQ0Qaqk2E7WLfBdiQN9mLXIDhnrpn04hlRElRPhLiu/dtg+o5PPLvaINXQ==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@oxc-resolver/binding-linux-arm64-musl@11.17.1':
+ resolution: {integrity: sha512-+hwlE2v3m0r3sk93SchJL1uyaKcPjf+NGO/TD2DZUDo+chXx7FfaEj0nUMewigSt7oZ2sQN9Z4NJOtUa75HE5Q==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
'@oxc-resolver/binding-linux-ppc64-gnu@11.17.1':
resolution: {integrity: sha512-bO+rsaE5Ox8cFyeL5Ct5tzot1TnQpFa/Wmu5k+hqBYSH2dNVDGoi0NizBN5QV8kOIC6O5MZr81UG4yW/2FyDTA==}
@@ -1023,6 +2500,98 @@ packages:
cpu: [x64]
os: [win32]
+ '@parcel/watcher-android-arm64@2.5.6':
+ resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ '@parcel/watcher-darwin-arm64@2.5.6':
+ resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@parcel/watcher-darwin-x64@2.5.6':
+ resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@parcel/watcher-freebsd-x64@2.5.6':
+ resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@parcel/watcher-linux-arm-glibc@2.5.6':
+ resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-arm-musl@2.5.6':
+ resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.6':
+ resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-arm64-musl@2.5.6':
+ resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-linux-x64-glibc@2.5.6':
+ resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-x64-musl@2.5.6':
+ resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-win32-arm64@2.5.6':
+ resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@parcel/watcher-win32-ia32@2.5.6':
+ resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@parcel/watcher-win32-x64@2.5.6':
+ resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ '@parcel/watcher@2.5.6':
+ resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==}
+ engines: {node: '>= 10.0.0'}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
'@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
@@ -1110,6 +2679,9 @@ packages:
cpu: [x64]
os: [win32]
+ '@rolldown/pluginutils@1.0.0-beta.27':
+ resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==}
+
'@rolldown/pluginutils@1.0.0-rc.3':
resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==}
@@ -1149,54 +2721,108 @@ packages:
rollup:
optional: true
+ '@rollup/rollup-android-arm-eabi@4.34.8':
+ resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==}
+ cpu: [arm]
+ os: [android]
+
'@rollup/rollup-android-arm-eabi@4.58.0':
resolution: {integrity: sha512-mr0tmS/4FoVk1cnaeN244A/wjvGDNItZKR8hRhnmCzygyRXYtKF5jVDSIILR1U97CTzAYmbgIj/Dukg62ggG5w==}
cpu: [arm]
os: [android]
+ '@rollup/rollup-android-arm64@4.34.8':
+ resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==}
+ cpu: [arm64]
+ os: [android]
+
'@rollup/rollup-android-arm64@4.58.0':
resolution: {integrity: sha512-+s++dbp+/RTte62mQD9wLSbiMTV+xr/PeRJEc/sFZFSBRlHPNPVaf5FXlzAL77Mr8FtSfQqCN+I598M8U41ccQ==}
cpu: [arm64]
os: [android]
+ '@rollup/rollup-darwin-arm64@4.34.8':
+ resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==}
+ cpu: [arm64]
+ os: [darwin]
+
'@rollup/rollup-darwin-arm64@4.58.0':
resolution: {integrity: sha512-MFWBwTcYs0jZbINQBXHfSrpSQJq3IUOakcKPzfeSznONop14Pxuqa0Kg19GD0rNBMPQI2tFtu3UzapZpH0Uc1Q==}
cpu: [arm64]
os: [darwin]
+ '@rollup/rollup-darwin-x64@4.34.8':
+ resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==}
+ cpu: [x64]
+ os: [darwin]
+
'@rollup/rollup-darwin-x64@4.58.0':
resolution: {integrity: sha512-yiKJY7pj9c9JwzuKYLFaDZw5gma3fI9bkPEIyofvVfsPqjCWPglSHdpdwXpKGvDeYDms3Qal8qGMEHZ1M/4Udg==}
cpu: [x64]
os: [darwin]
+ '@rollup/rollup-freebsd-arm64@4.34.8':
+ resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==}
+ cpu: [arm64]
+ os: [freebsd]
+
'@rollup/rollup-freebsd-arm64@4.58.0':
resolution: {integrity: sha512-x97kCoBh5MOevpn/CNK9W1x8BEzO238541BGWBc315uOlN0AD/ifZ1msg+ZQB05Ux+VF6EcYqpiagfLJ8U3LvQ==}
cpu: [arm64]
os: [freebsd]
+ '@rollup/rollup-freebsd-x64@4.34.8':
+ resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==}
+ cpu: [x64]
+ os: [freebsd]
+
'@rollup/rollup-freebsd-x64@4.58.0':
resolution: {integrity: sha512-Aa8jPoZ6IQAG2eIrcXPpjRcMjROMFxCt1UYPZZtCxRV68WkuSigYtQ/7Zwrcr2IvtNJo7T2JfDXyMLxq5L4Jlg==}
cpu: [x64]
os: [freebsd]
+ '@rollup/rollup-linux-arm-gnueabihf@4.34.8':
+ resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
'@rollup/rollup-linux-arm-gnueabihf@4.58.0':
resolution: {integrity: sha512-Ob8YgT5kD/lSIYW2Rcngs5kNB/44Q2RzBSPz9brf2WEtcGR7/f/E9HeHn1wYaAwKBni+bdXEwgHvUd0x12lQSA==}
cpu: [arm]
os: [linux]
libc: [glibc]
+ '@rollup/rollup-linux-arm-musleabihf@4.34.8':
+ resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
'@rollup/rollup-linux-arm-musleabihf@4.58.0':
resolution: {integrity: sha512-K+RI5oP1ceqoadvNt1FecL17Qtw/n9BgRSzxif3rTL2QlIu88ccvY+Y9nnHe/cmT5zbH9+bpiJuG1mGHRVwF4Q==}
cpu: [arm]
os: [linux]
libc: [musl]
+ '@rollup/rollup-linux-arm64-gnu@4.34.8':
+ resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@rollup/rollup-linux-arm64-gnu@4.58.0':
resolution: {integrity: sha512-T+17JAsCKUjmbopcKepJjHWHXSjeW7O5PL7lEFaeQmiVyw4kkc5/lyYKzrv6ElWRX/MrEWfPiJWqbTvfIvjM1Q==}
cpu: [arm64]
os: [linux]
libc: [glibc]
+ '@rollup/rollup-linux-arm64-musl@4.34.8':
+ resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
'@rollup/rollup-linux-arm64-musl@4.58.0':
resolution: {integrity: sha512-cCePktb9+6R9itIJdeCFF9txPU7pQeEHB5AbHu/MKsfH/k70ZtOeq1k4YAtBv9Z7mmKI5/wOLYjQ+B9QdxR6LA==}
cpu: [arm64]
@@ -1215,18 +2841,36 @@ packages:
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-ppc64-gnu@4.58.0':
- resolution: {integrity: sha512-dpz8vT0i+JqUKuSNPCP5SYyIV2Lh0sNL1+FhM7eLC457d5B9/BC3kDPp5BBftMmTNsBarcPcoz5UGSsnCiw4XQ==}
- cpu: [ppc64]
+ '@rollup/rollup-linux-loongarch64-gnu@4.34.8':
+ resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==}
+ cpu: [loong64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-ppc64-musl@4.58.0':
+ '@rollup/rollup-linux-powerpc64le-gnu@4.34.8':
+ resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.58.0':
+ resolution: {integrity: sha512-dpz8vT0i+JqUKuSNPCP5SYyIV2Lh0sNL1+FhM7eLC457d5B9/BC3kDPp5BBftMmTNsBarcPcoz5UGSsnCiw4XQ==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-ppc64-musl@4.58.0':
resolution: {integrity: sha512-4gdkkf9UJ7tafnweBCR/mk4jf3Jfl0cKX9Np80t5i78kjIH0ZdezUv/JDI2VtruE5lunfACqftJ8dIMGN4oHew==}
cpu: [ppc64]
os: [linux]
libc: [musl]
+ '@rollup/rollup-linux-riscv64-gnu@4.34.8':
+ resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
'@rollup/rollup-linux-riscv64-gnu@4.58.0':
resolution: {integrity: sha512-YFS4vPnOkDTD/JriUeeZurFYoJhPf9GQQEF/v4lltp3mVcBmnsAdjEWhr2cjUCZzZNzxCG0HZOvJU44UGHSdzw==}
cpu: [riscv64]
@@ -1239,18 +2883,36 @@ packages:
os: [linux]
libc: [musl]
+ '@rollup/rollup-linux-s390x-gnu@4.34.8':
+ resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
'@rollup/rollup-linux-s390x-gnu@4.58.0':
resolution: {integrity: sha512-jIhrujyn4UnWF8S+DHSkAkDEO3hLX0cjzxJZPLF80xFyzyUIYgSMRcYQ3+uqEoyDD2beGq7Dj7edi8OnJcS/hg==}
cpu: [s390x]
os: [linux]
libc: [glibc]
+ '@rollup/rollup-linux-x64-gnu@4.34.8':
+ resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
'@rollup/rollup-linux-x64-gnu@4.58.0':
resolution: {integrity: sha512-+410Srdoh78MKSJxTQ+hZ/Mx+ajd6RjjPwBPNd0R3J9FtL6ZA0GqiiyNjCO9In0IzZkCNrpGymSfn+kgyPQocg==}
cpu: [x64]
os: [linux]
libc: [glibc]
+ '@rollup/rollup-linux-x64-musl@4.34.8':
+ resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
'@rollup/rollup-linux-x64-musl@4.58.0':
resolution: {integrity: sha512-ZjMyby5SICi227y1MTR3VYBpFTdZs823Rs/hpakufleBoufoOIB6jtm9FEoxn/cgO7l6PM2rCEl5Kre5vX0QrQ==}
cpu: [x64]
@@ -1267,11 +2929,21 @@ packages:
cpu: [arm64]
os: [openharmony]
+ '@rollup/rollup-win32-arm64-msvc@4.34.8':
+ resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==}
+ cpu: [arm64]
+ os: [win32]
+
'@rollup/rollup-win32-arm64-msvc@4.58.0':
resolution: {integrity: sha512-YpG8dUOip7DCz3nr/JUfPbIUo+2d/dy++5bFzgi4ugOGBIox+qMbbqt/JoORwvI/C9Kn2tz6+Bieoqd5+B1CjA==}
cpu: [arm64]
os: [win32]
+ '@rollup/rollup-win32-ia32-msvc@4.34.8':
+ resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==}
+ cpu: [ia32]
+ os: [win32]
+
'@rollup/rollup-win32-ia32-msvc@4.58.0':
resolution: {integrity: sha512-b9DI8jpFQVh4hIXFr0/+N/TzLdpBIoPzjt0Rt4xJbW3mzguV3mduR9cNgiuFcuL/TeORejJhCWiAXe3E/6PxWA==}
cpu: [ia32]
@@ -1282,11 +2954,48 @@ packages:
cpu: [x64]
os: [win32]
+ '@rollup/rollup-win32-x64-msvc@4.34.8':
+ resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==}
+ cpu: [x64]
+ os: [win32]
+
'@rollup/rollup-win32-x64-msvc@4.58.0':
resolution: {integrity: sha512-QFsBgQNTnh5K0t/sBsjJLq24YVqEIVkGpfN2VHsnN90soZyhaiA9UUHufcctVNL4ypJY0wrwad0wslx2KJQ1/w==}
cpu: [x64]
os: [win32]
+ '@schematics/angular@19.2.21':
+ resolution: {integrity: sha512-3Nxac8jJJIwGTgP3xLVLmqUyyZAM/9WtDUbZurKXl8xLWo5nHLIVXq/1FSPOhwVYEAZj6OrstaCPsDxflNdfOQ==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+
+ '@sigstore/bundle@3.1.0':
+ resolution: {integrity: sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@sigstore/core@2.0.0':
+ resolution: {integrity: sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@sigstore/protobuf-specs@0.4.3':
+ resolution: {integrity: sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@sigstore/sign@3.1.0':
+ resolution: {integrity: sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@sigstore/tuf@3.1.1':
+ resolution: {integrity: sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@sigstore/verify@2.1.1':
+ resolution: {integrity: sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ '@sindresorhus/merge-streams@2.3.0':
+ resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
+ engines: {node: '>=18'}
+
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
@@ -1331,42 +3040,154 @@ packages:
svelte: ^5.0.0
vite: ^6.0.0
+ '@tufjs/canonical-json@2.0.0':
+ resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+
+ '@tufjs/models@3.0.1':
+ resolution: {integrity: sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
'@tybys/wasm-util@0.10.1':
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.27.0':
+ resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.28.0':
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
+
+ '@types/body-parser@1.19.6':
+ resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
+
+ '@types/bonjour@3.5.13':
+ resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==}
+
'@types/chai@5.2.3':
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
+ '@types/connect-history-api-fallback@1.5.4':
+ resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==}
+
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
'@types/cookie@0.6.0':
resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
'@types/deep-eql@4.0.2':
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+ '@types/eslint-scope@3.7.7':
+ resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
+
+ '@types/eslint@9.6.1':
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+ '@types/express-serve-static-core@4.19.8':
+ resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==}
+
+ '@types/express@4.17.25':
+ resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==}
+
+ '@types/http-errors@2.0.5':
+ resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
+
+ '@types/http-proxy@1.17.17':
+ resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==}
+
'@types/jsesc@2.5.1':
resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==}
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ '@types/mime@1.3.5':
+ resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+
+ '@types/node-forge@1.3.14':
+ resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==}
+
'@types/node@12.20.55':
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
+ '@types/node@20.19.33':
+ resolution: {integrity: sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==}
+
'@types/node@25.3.0':
resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==}
'@types/prompts@2.4.9':
resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==}
+ '@types/qs@6.14.0':
+ resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
+
+ '@types/range-parser@1.2.7':
+ resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+
+ '@types/react-dom@19.2.3':
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
+ peerDependencies:
+ '@types/react': ^19.2.0
+
+ '@types/react@19.2.14':
+ resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==}
+
'@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
+ '@types/retry@0.12.2':
+ resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==}
+
+ '@types/send@0.17.6':
+ resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==}
+
+ '@types/send@1.2.1':
+ resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==}
+
+ '@types/serve-index@1.9.4':
+ resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==}
+
+ '@types/serve-static@1.15.10':
+ resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==}
+
+ '@types/sockjs@0.3.36':
+ resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==}
+
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+ '@types/ws@8.18.1':
+ resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
+
+ '@typescript-eslint/eslint-plugin@8.56.1':
+ resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.56.1
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/parser@8.56.1':
+ resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
'@typescript-eslint/project-service@8.56.1':
resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1383,6 +3204,13 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
+ '@typescript-eslint/type-utils@8.56.1':
+ resolution: {integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
'@typescript-eslint/types@8.56.1':
resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1404,6 +3232,18 @@ packages:
resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@vitejs/plugin-basic-ssl@1.2.0':
+ resolution: {integrity: sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==}
+ engines: {node: '>=14.21.3'}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
+
+ '@vitejs/plugin-react@4.7.0':
+ resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
+
'@vitejs/plugin-vue@5.2.4':
resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -1489,6 +3329,74 @@ packages:
'@vue/shared@3.5.28':
resolution: {integrity: sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==}
+ '@webassemblyjs/ast@1.14.1':
+ resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2':
+ resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
+
+ '@webassemblyjs/helper-api-error@1.13.2':
+ resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
+
+ '@webassemblyjs/helper-buffer@1.14.1':
+ resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2':
+ resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
+
+ '@webassemblyjs/ieee754@1.13.2':
+ resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
+
+ '@webassemblyjs/leb128@1.13.2':
+ resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
+
+ '@webassemblyjs/utf8@1.13.2':
+ resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
+
+ '@xtuc/ieee754@1.2.0':
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+ '@xtuc/long@4.2.2':
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+ '@yarnpkg/lockfile@1.1.0':
+ resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==}
+
+ abbrev@3.0.1:
+ resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ accepts@1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+
+ acorn-import-phases@1.0.4:
+ resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==}
+ engines: {node: '>=10.13.0'}
+ peerDependencies:
+ acorn: ^8.14.0
+
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
@@ -1499,12 +3407,51 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ adjust-sourcemap-loader@4.0.0:
+ resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==}
+ engines: {node: '>=8.9'}
+
+ agent-base@7.1.4:
+ resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
+ engines: {node: '>= 14'}
+
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-keywords@5.1.0:
+ resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+ peerDependencies:
+ ajv: ^8.8.2
+
ajv@6.14.0:
resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==}
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
alien-signals@1.0.13:
resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==}
+ angular-eslint@19.8.1:
+ resolution: {integrity: sha512-A6mPcVAXEDdJk7bKKBwd+1b/VA/xwpWWN2fExTGO1dkVNPz550LlgxBjEio9G7u4i+pD2aLrl6Cx6O+9o1iusQ==}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ typescript-eslint: ^8.0.0
+
ansi-colors@4.1.3:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
@@ -1513,6 +3460,11 @@ packages:
resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==}
engines: {node: '>=18'}
+ ansi-html-community@0.0.8:
+ resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==}
+ engines: {'0': node >= 0.8.0}
+ hasBin: true
+
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
@@ -1533,6 +3485,10 @@ packages:
resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==}
engines: {node: '>=14'}
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
@@ -1543,6 +3499,9 @@ packages:
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
engines: {node: '>= 0.4'}
+ array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
engines: {node: '>=8'}
@@ -1555,10 +3514,39 @@ packages:
resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==}
engines: {node: '>=20.19.0'}
+ autoprefixer@10.4.20:
+ resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
axobject-query@4.1.0:
resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
engines: {node: '>= 0.4'}
+ babel-loader@9.2.1:
+ resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==}
+ engines: {node: '>= 14.15.0'}
+ peerDependencies:
+ '@babel/core': ^7.12.0
+ webpack: '>=5'
+
+ babel-plugin-polyfill-corejs2@0.4.15:
+ resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-polyfill-corejs3@0.11.1:
+ resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-polyfill-regenerator@0.6.6:
+ resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -1566,18 +3554,45 @@ packages:
resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==}
engines: {node: 20 || >=22}
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
baseline-browser-mapping@2.10.0:
resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==}
engines: {node: '>=6.0.0'}
hasBin: true
+ batch@0.6.1:
+ resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==}
+
+ beasties@0.3.2:
+ resolution: {integrity: sha512-p4AF8uYzm9Fwu8m/hSVTCPXrRBPmB34hQpHsec2KOaR9CZmgoU8IOv4Cvwq4hgz2p4hLMNbsdNl5XeA6XbAQwA==}
+ engines: {node: '>=14.0.0'}
+
better-path-resolve@1.0.0:
resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==}
engines: {node: '>=4'}
+ big.js@5.2.2:
+ resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
birpc@4.0.0:
resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==}
+ bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
+ body-parser@1.20.4:
+ resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ bonjour-service@1.3.0:
+ resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==}
+
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
@@ -1600,10 +3615,36 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+ bundle-name@4.1.0:
+ resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
+ engines: {node: '>=18'}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
+ cacache@19.0.1:
+ resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
@@ -1626,18 +3667,42 @@ packages:
chardet@2.1.1:
resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
chokidar@4.0.3:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
+ chownr@2.0.0:
+ resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
+ engines: {node: '>=10'}
+
+ chownr@3.0.0:
+ resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
+ engines: {node: '>=18'}
+
+ chrome-trace-event@1.0.4:
+ resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+ engines: {node: '>=6.0'}
+
ci-info@3.9.0:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
engines: {node: '>=8'}
+ cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+
cli-cursor@5.0.0:
resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
engines: {node: '>=18'}
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
cli-spinners@3.4.0:
resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==}
engines: {node: '>=18.20'}
@@ -1646,6 +3711,22 @@ packages:
resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
engines: {node: '>=18'}
+ cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ clone-deep@4.0.1:
+ resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
+ engines: {node: '>=6'}
+
+ clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
clsx@2.1.1:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
@@ -1668,19 +3749,79 @@ packages:
resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
engines: {node: '>=20'}
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ common-path-prefix@3.0.0:
+ resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==}
+
commondir@1.0.1:
resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
+ compressible@2.0.18:
+ resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
+ engines: {node: '>= 0.6'}
+
+ compression@1.8.1:
+ resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==}
+ engines: {node: '>= 0.8.0'}
+
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ connect-history-api-fallback@2.0.0:
+ resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==}
+ engines: {node: '>=0.8'}
+
+ content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ convert-source-map@1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ cookie-signature@1.0.7:
+ resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==}
+
cookie@0.6.0:
resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
engines: {node: '>= 0.6'}
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+
+ copy-anything@2.0.6:
+ resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
+
+ copy-webpack-plugin@12.0.2:
+ resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==}
+ engines: {node: '>= 18.12.0'}
+ peerDependencies:
+ webpack: ^5.1.0
+
+ core-js-compat@3.48.0:
+ resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==}
+
+ core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ cosmiconfig@9.0.0:
+ resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
cross-env@10.1.0:
resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==}
engines: {node: '>=20'}
@@ -1690,6 +3831,25 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
+ css-loader@7.1.2:
+ resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==}
+ engines: {node: '>= 18.12.0'}
+ peerDependencies:
+ '@rspack/core': 0.x || 1.x
+ webpack: ^5.27.0
+ peerDependenciesMeta:
+ '@rspack/core':
+ optional: true
+ webpack:
+ optional: true
+
+ css-select@5.2.2:
+ resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
+
+ css-what@6.2.2:
+ resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+ engines: {node: '>= 6'}
+
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
@@ -1701,6 +3861,14 @@ packages:
de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -1717,13 +3885,47 @@ packages:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
engines: {node: '>=0.10.0'}
+ default-browser-id@5.0.1:
+ resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==}
+ engines: {node: '>=18'}
+
+ default-browser@5.5.0:
+ resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==}
+ engines: {node: '>=18'}
+
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ define-lazy-prop@3.0.0:
+ resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+ engines: {node: '>=12'}
+
defu@6.1.4:
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+ depd@1.1.2:
+ resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
+ engines: {node: '>= 0.6'}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
detect-indent@6.1.0:
resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
engines: {node: '>=8'}
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ detect-node@2.1.0:
+ resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+
devalue@5.6.3:
resolution: {integrity: sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==}
@@ -1731,6 +3933,23 @@ packages:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
+ dns-packet@5.6.1:
+ resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==}
+ engines: {node: '>=6'}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
dts-resolver@2.1.3:
resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==}
engines: {node: '>=20.19.0'}
@@ -1740,40 +3959,121 @@ packages:
oxc-resolver:
optional: true
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
electron-to-chromium@1.5.302:
resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==}
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
- empathic@2.0.0:
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ emojis-list@3.0.0:
+ resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+ engines: {node: '>= 4'}
+
+ empathic@2.0.0:
resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==}
engines: {node: '>=14'}
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ encoding@0.1.13:
+ resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
+
+ enhanced-resolve@5.19.0:
+ resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==}
+ engines: {node: '>=10.13.0'}
+
enquirer@2.4.1:
resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
engines: {node: '>=8.6'}
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ entities@6.0.1:
+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
entities@7.0.1:
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
engines: {node: '>=0.12'}
+ env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+
environment@1.1.0:
resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
engines: {node: '>=18'}
+ err-code@2.0.3:
+ resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
+
+ errno@0.1.8:
+ resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+ hasBin: true
+
+ error-ex@1.3.4:
+ resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
es-module-lexer@1.7.0:
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+ es-module-lexer@2.0.0:
+ resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ esbuild-wasm@0.25.4:
+ resolution: {integrity: sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
esbuild@0.25.12:
resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
engines: {node: '>=18'}
hasBin: true
+ esbuild@0.25.4:
+ resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==}
+ engines: {node: '>=18'}
+ hasBin: true
+
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
escape-string-regexp@4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
@@ -1797,6 +4097,10 @@ packages:
eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0
globals: '>= 13.12.1'
+ eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+
eslint-scope@7.2.2:
resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -1854,6 +4158,10 @@ packages:
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
engines: {node: '>=4.0'}
+ estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+
estraverse@5.3.0:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
@@ -1868,9 +4176,20 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+
eventemitter3@5.0.4:
resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
execa@8.0.1:
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
engines: {node: '>=16.17'}
@@ -1879,6 +4198,13 @@ packages:
resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
engines: {node: '>=12.0.0'}
+ exponential-backoff@3.1.3:
+ resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==}
+
+ express@4.22.1:
+ resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==}
+ engines: {node: '>= 0.10.0'}
+
extendable-error@0.1.7:
resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==}
@@ -1895,9 +4221,16 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ fast-uri@3.1.0:
+ resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+
fastq@1.20.1:
resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+ faye-websocket@0.11.4:
+ resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
+ engines: {node: '>=0.8.0'}
+
fd-package-json@2.0.0:
resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==}
@@ -1918,6 +4251,14 @@ packages:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
+ finalhandler@1.3.2:
+ resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==}
+ engines: {node: '>= 0.8'}
+
+ find-cache-dir@4.0.0:
+ resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==}
+ engines: {node: '>=14.16'}
+
find-up@4.1.0:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'}
@@ -1926,18 +4267,50 @@ packages:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
+ find-up@6.3.0:
+ resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
flat-cache@4.0.1:
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
engines: {node: '>=16'}
+ flat@5.0.2:
+ resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
+ hasBin: true
+
flatted@3.3.3:
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+ follow-redirects@1.15.11:
+ resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ foreground-child@3.3.1:
+ resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+ engines: {node: '>=14'}
+
formatly@0.3.0:
resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==}
engines: {node: '>=18.3.0'}
hasBin: true
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
+ fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
+ fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+
fs-extra@7.0.1:
resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
engines: {node: '>=6 <7 || >=8'}
@@ -1946,6 +4319,14 @@ packages:
resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
engines: {node: '>=6 <7 || >=8'}
+ fs-minipass@2.1.0:
+ resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
+ engines: {node: '>= 8'}
+
+ fs-minipass@3.0.3:
+ resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
@@ -1961,10 +4342,22 @@ packages:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
get-east-asian-width@1.5.0:
resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==}
engines: {node: '>=18'}
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
get-stream@8.0.1:
resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
engines: {node: '>=16'}
@@ -1980,6 +4373,20 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
+ glob-to-regex.js@1.2.0:
+ resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
+ glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+ glob@10.5.0:
+ resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
+ 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
+ hasBin: true
+
glob@13.0.6:
resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==}
engines: {node: 18 || 20 || >=22}
@@ -2001,13 +4408,28 @@ packages:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
engines: {node: '>=10'}
+ globby@14.1.0:
+ resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==}
+ engines: {node: '>=18'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ handle-thing@2.0.1:
+ resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
+
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
@@ -2025,6 +4447,58 @@ packages:
hookable@6.0.1:
resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==}
+ hosted-git-info@8.1.0:
+ resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ hpack.js@2.1.6:
+ resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
+
+ htmlparser2@10.1.0:
+ resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==}
+
+ http-cache-semantics@4.2.0:
+ resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
+
+ http-deceiver@1.2.7:
+ resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==}
+
+ http-errors@1.8.1:
+ resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==}
+ engines: {node: '>= 0.6'}
+
+ http-errors@2.0.1:
+ resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
+ engines: {node: '>= 0.8'}
+
+ http-parser-js@0.5.10:
+ resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==}
+
+ http-proxy-agent@7.0.2:
+ resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+ engines: {node: '>= 14'}
+
+ http-proxy-middleware@2.0.9:
+ resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ '@types/express': ^4.17.13
+ peerDependenciesMeta:
+ '@types/express':
+ optional: true
+
+ http-proxy-middleware@3.0.5:
+ resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ http-proxy@1.18.1:
+ resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
+ engines: {node: '>=8.0.0'}
+
+ https-proxy-agent@7.0.6:
+ resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
+ engines: {node: '>= 14'}
+
human-id@4.1.3:
resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==}
hasBin: true
@@ -2038,14 +4512,51 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ hyperdyperid@1.2.0:
+ resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==}
+ engines: {node: '>=10.18'}
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
iconv-lite@0.7.2:
resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
engines: {node: '>=0.10.0'}
+ icss-utils@5.1.0:
+ resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore-walk@7.0.0:
+ resolution: {integrity: sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
+ image-size@0.5.5:
+ resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
+ immutable@5.1.4:
+ resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==}
+
import-fresh@3.3.1:
resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
engines: {node: '>=6'}
@@ -2065,14 +4576,46 @@ packages:
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ ini@5.0.0:
+ resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ ip-address@10.1.0:
+ resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==}
+ engines: {node: '>= 12'}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ ipaddr.js@2.3.0:
+ resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==}
+ engines: {node: '>= 10'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
is-core-module@2.16.1:
resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
engines: {node: '>= 0.4'}
+ is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
is-fullwidth-code-point@4.0.0:
resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
engines: {node: '>=12'}
@@ -2085,6 +4628,15 @@ packages:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
+ is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+
+ is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+
is-interactive@2.0.0:
resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
engines: {node: '>=12'}
@@ -2092,10 +4644,26 @@ packages:
is-module@1.0.0:
resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
+ is-network-error@1.3.0:
+ resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==}
+ engines: {node: '>=16'}
+
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
+ is-plain-obj@3.0.0:
+ resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==}
+ engines: {node: '>=10'}
+
+ is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+
+ is-plain-object@5.0.0:
+ resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+ engines: {node: '>=0.10.0'}
+
is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
@@ -2110,17 +4678,58 @@ packages:
resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==}
engines: {node: '>=4'}
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
is-unicode-supported@2.1.0:
resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
engines: {node: '>=18'}
+ is-what@3.14.1:
+ resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
+
is-windows@1.0.2:
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
engines: {node: '>=0.10.0'}
+ is-wsl@3.1.1:
+ resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
+ engines: {node: '>=16'}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ isexe@3.1.5:
+ resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==}
+ engines: {node: '>=18'}
+
+ isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+
+ istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+
+ istanbul-lib-instrument@6.0.3:
+ resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==}
+ engines: {node: '>=10'}
+
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+ jest-worker@27.5.1:
+ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+ engines: {node: '>= 10.13.0'}
+
+ jiti@1.21.7:
+ resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
+ hasBin: true
+
jiti@2.6.1:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
@@ -2144,9 +4753,19 @@ packages:
json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-parse-even-better-errors@4.0.0:
+ resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
@@ -2155,12 +4774,26 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ jsonc-parser@3.3.1:
+ resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
+
jsonfile@4.0.0:
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+ jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+
+ karma-source-map-support@1.4.0:
+ resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==}
+
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+
kleur@3.0.3:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'}
@@ -2177,23 +4810,75 @@ packages:
'@types/node': '>=18'
typescript: '>=5.0.4 <7'
+ launch-editor@2.13.0:
+ resolution: {integrity: sha512-u+9asUHMJ99lA15VRMXw5XKfySFR9dGXwgsgS14YTbUq3GITP58mIM32At90P5fZ+MUId5Yw+IwI/yKub7jnCQ==}
+
+ less-loader@12.2.0:
+ resolution: {integrity: sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==}
+ engines: {node: '>= 18.12.0'}
+ peerDependencies:
+ '@rspack/core': 0.x || 1.x
+ less: ^3.5.0 || ^4.0.0
+ webpack: ^5.0.0
+ peerDependenciesMeta:
+ '@rspack/core':
+ optional: true
+ webpack:
+ optional: true
+
+ less@4.2.2:
+ resolution: {integrity: sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
levn@0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
+ license-webpack-plugin@4.0.2:
+ resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==}
+ peerDependencies:
+ webpack: '*'
+ peerDependenciesMeta:
+ webpack:
+ optional: true
+
lilconfig@3.1.3:
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
engines: {node: '>=14'}
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
lint-staged@15.5.2:
resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==}
engines: {node: '>=18.12.0'}
hasBin: true
+ listr2@8.2.5:
+ resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==}
+ engines: {node: '>=18.0.0'}
+
listr2@8.3.3:
resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==}
engines: {node: '>=18.0.0'}
+ lmdb@3.2.6:
+ resolution: {integrity: sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==}
+ hasBin: true
+
+ loader-runner@4.3.1:
+ resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==}
+ engines: {node: '>=6.11.5'}
+
+ loader-utils@2.0.4:
+ resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
+ engines: {node: '>=8.9.0'}
+
+ loader-utils@3.3.1:
+ resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
+ engines: {node: '>= 12.13.0'}
+
locate-character@3.0.0:
resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
@@ -2205,6 +4890,13 @@ packages:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
+ locate-path@7.2.0:
+ resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ lodash.debounce@4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
@@ -2214,6 +4906,10 @@ packages:
lodash@4.17.23:
resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==}
+ log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+
log-symbols@7.0.1:
resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==}
engines: {node: '>=18'}
@@ -2222,6 +4918,9 @@ packages:
resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
engines: {node: '>=18'}
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
lru-cache@11.2.6:
resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==}
engines: {node: 20 || >=22}
@@ -2229,9 +4928,36 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ magic-string@0.30.17:
+ resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+ make-dir@2.1.0:
+ resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+ engines: {node: '>=6'}
+
+ make-fetch-happen@14.0.3:
+ resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+
+ memfs@4.56.10:
+ resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==}
+ peerDependencies:
+ tslib: '2'
+
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -2239,10 +4965,35 @@ packages:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
+ methods@1.1.2:
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+ engines: {node: '>= 0.6'}
+
micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-db@1.54.0:
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
mimic-fn@4.0.0:
resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
engines: {node: '>=12'}
@@ -2251,6 +5002,15 @@ packages:
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
engines: {node: '>=18'}
+ mini-css-extract-plugin@2.9.2:
+ resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==}
+ engines: {node: '>= 12.13.0'}
+ peerDependencies:
+ webpack: ^5.0.0
+
+ minimalistic-assert@1.0.1:
+ resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+
minimatch@10.2.2:
resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==}
engines: {node: 18 || 20 || >=22}
@@ -2269,10 +5029,51 @@ packages:
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ minipass-collect@2.0.1:
+ resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minipass-fetch@4.0.1:
+ resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ minipass-flush@1.0.5:
+ resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==}
+ engines: {node: '>= 8'}
+
+ minipass-pipeline@1.2.4:
+ resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==}
+ engines: {node: '>=8'}
+
+ minipass-sized@1.0.3:
+ resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==}
+ engines: {node: '>=8'}
+
+ minipass@3.3.6:
+ resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
+ engines: {node: '>=8'}
+
+ minipass@5.0.0:
+ resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
+ engines: {node: '>=8'}
+
minipass@7.1.3:
resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
engines: {node: '>=16 || 14 >=14.17'}
+ minizlib@2.1.2:
+ resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
+ engines: {node: '>= 8'}
+
+ minizlib@3.1.0:
+ resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
+ engines: {node: '>= 18'}
+
+ mkdirp@1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
mri@1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
@@ -2281,12 +5082,34 @@ packages:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ msgpackr-extract@3.0.3:
+ resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==}
+ hasBin: true
+
+ msgpackr@1.11.8:
+ resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==}
+
muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+ multicast-dns@7.2.5:
+ resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==}
+ hasBin: true
+
+ mute-stream@1.0.0:
+ resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ mute-stream@2.0.0:
+ resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -2295,22 +5118,121 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
- node-releases@2.0.27:
- resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+ needle@3.3.1:
+ resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==}
+ engines: {node: '>= 4.4.x'}
+ hasBin: true
- npm-run-path@5.3.0:
- resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+
+ negotiator@0.6.4:
+ resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==}
+ engines: {node: '>= 0.6'}
+
+ negotiator@1.0.0:
+ resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
+ engines: {node: '>= 0.6'}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ node-addon-api@6.1.0:
+ resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==}
+
+ node-addon-api@7.1.1:
+ resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
+ node-forge@1.3.3:
+ resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==}
+ engines: {node: '>= 6.13.0'}
+
+ node-gyp-build-optional-packages@5.2.2:
+ resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==}
+ hasBin: true
+
+ node-gyp@11.5.0:
+ resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+ hasBin: true
+
+ node-releases@2.0.27:
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+
+ nopt@8.1.0:
+ resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+ hasBin: true
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+
+ npm-bundled@4.0.0:
+ resolution: {integrity: sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ npm-install-checks@7.1.2:
+ resolution: {integrity: sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ npm-normalize-package-bin@4.0.0:
+ resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ npm-package-arg@12.0.2:
+ resolution: {integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ npm-packlist@9.0.0:
+ resolution: {integrity: sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ npm-pick-manifest@10.0.0:
+ resolution: {integrity: sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ npm-registry-fetch@18.0.2:
+ resolution: {integrity: sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ obuf@1.1.2:
+ resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
+
obug@2.1.1:
resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ on-headers@1.1.0:
+ resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==}
+ engines: {node: '>= 0.8'}
+
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
onetime@6.0.0:
resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
engines: {node: '>=12'}
@@ -2319,14 +5241,25 @@ packages:
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
engines: {node: '>=18'}
+ open@10.1.0:
+ resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==}
+ engines: {node: '>=18'}
+
optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
+ ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+
ora@9.3.0:
resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==}
engines: {node: '>=20'}
+ ordered-binary@1.6.1:
+ resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==}
+
outdent@0.5.0:
resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==}
@@ -2355,6 +5288,10 @@ packages:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
+ p-limit@4.0.0:
+ resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
p-locate@4.1.0:
resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
engines: {node: '>=8'}
@@ -2363,10 +5300,22 @@ packages:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
+ p-locate@6.0.0:
+ resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
p-map@2.1.0:
resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==}
engines: {node: '>=6'}
+ p-map@7.0.4:
+ resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==}
+ engines: {node: '>=18'}
+
+ p-retry@6.2.1:
+ resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==}
+ engines: {node: '>=16.17'}
+
p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
@@ -2377,10 +5326,36 @@ packages:
package-manager-detector@0.2.11:
resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==}
+ pacote@20.0.0:
+ resolution: {integrity: sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+ hasBin: true
+
parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ parse-node-version@1.0.1:
+ resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
+ engines: {node: '>= 0.10'}
+
+ parse5-html-rewriting-stream@7.0.0:
+ resolution: {integrity: sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==}
+
+ parse5-sax-parser@7.0.0:
+ resolution: {integrity: sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==}
+
+ parse5@7.3.0:
+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
@@ -2388,6 +5363,10 @@ packages:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
+ path-exists@5.0.0:
+ resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
@@ -2399,14 +5378,25 @@ packages:
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
path-scurry@2.0.2:
resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==}
engines: {node: 18 || 20 || >=22}
+ path-to-regexp@0.1.12:
+ resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+
path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
+ path-type@6.0.0:
+ resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==}
+ engines: {node: '>=18'}
+
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
@@ -2417,6 +5407,10 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
+ picomatch@4.0.2:
+ resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+ engines: {node: '>=12'}
+
picomatch@4.0.3:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
@@ -2430,10 +5424,68 @@ packages:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
+ piscina@4.8.0:
+ resolution: {integrity: sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==}
+
+ pkg-dir@7.0.0:
+ resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==}
+ engines: {node: '>=14.16'}
+
+ postcss-loader@8.1.1:
+ resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==}
+ engines: {node: '>= 18.12.0'}
+ peerDependencies:
+ '@rspack/core': 0.x || 1.x
+ postcss: ^7.0.0 || ^8.0.1
+ webpack: ^5.0.0
+ peerDependenciesMeta:
+ '@rspack/core':
+ optional: true
+ webpack:
+ optional: true
+
+ postcss-media-query-parser@0.2.3:
+ resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
+
+ postcss-modules-extract-imports@3.1.0:
+ resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ postcss-modules-local-by-default@4.2.0:
+ resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ postcss-modules-scope@3.2.1:
+ resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ postcss-modules-values@4.0.0:
+ resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+
postcss-selector-parser@6.1.2:
resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
engines: {node: '>=4'}
+ postcss-selector-parser@7.1.1:
+ resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==}
+ engines: {node: '>=4'}
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@8.5.2:
+ resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==}
+ engines: {node: ^10 || ^12 || >=14}
+
postcss@8.5.6:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
@@ -2468,14 +5520,36 @@ packages:
engines: {node: '>=14'}
hasBin: true
+ proc-log@5.0.0:
+ resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ promise-retry@2.0.1:
+ resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
+ engines: {node: '>=10'}
+
prompts@2.4.2:
resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
engines: {node: '>= 6'}
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
+ prr@1.0.1:
+ resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
+ qs@6.14.2:
+ resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==}
+ engines: {node: '>=0.6'}
+
quansync@0.2.11:
resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
@@ -2485,14 +5559,87 @@ packages:
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@2.5.3:
+ resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==}
+ engines: {node: '>= 0.8'}
+
+ react-dom@19.2.4:
+ resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==}
+ peerDependencies:
+ react: ^19.2.4
+
+ react-refresh@0.17.0:
+ resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
+ engines: {node: '>=0.10.0'}
+
+ react@19.2.4:
+ resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==}
+ engines: {node: '>=0.10.0'}
+
read-yaml-file@1.1.0:
resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==}
engines: {node: '>=6'}
+ readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
readdirp@4.1.2:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
+ reflect-metadata@0.2.2:
+ resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==}
+
+ regenerate-unicode-properties@10.2.2:
+ resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==}
+ engines: {node: '>=4'}
+
+ regenerate@1.4.2:
+ resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ regex-parser@2.3.1:
+ resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==}
+
+ regexpu-core@6.4.0:
+ resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==}
+ engines: {node: '>=4'}
+
+ regjsgen@0.8.0:
+ resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
+
+ regjsparser@0.13.0:
+ resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==}
+ hasBin: true
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ requires-port@1.0.0:
+ resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -2504,15 +5651,36 @@ packages:
resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+ resolve-url-loader@5.0.0:
+ resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==}
+ engines: {node: '>=12'}
+
+ resolve@1.22.10:
+ resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
resolve@1.22.11:
resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
engines: {node: '>= 0.4'}
hasBin: true
+ restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+
restore-cursor@5.1.0:
resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
engines: {node: '>=18'}
+ retry@0.12.0:
+ resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
+ engines: {node: '>= 4'}
+
+ retry@0.13.1:
+ resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
+ engines: {node: '>= 4'}
+
reusify@1.1.0:
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
@@ -2549,33 +5717,131 @@ packages:
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
+ rollup@4.34.8:
+ resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
rollup@4.58.0:
resolution: {integrity: sha512-wbT0mBmWbIvvq8NeEYWWvevvxnOyhKChir47S66WCxw1SXqhw7ssIYejnQEVt7XYQpsj2y8F9PM+Cr3SNEa0gw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ run-applescript@7.1.0:
+ resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==}
+ engines: {node: '>=18'}
+
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
sade@1.8.1:
resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
engines: {node: '>=6'}
+ safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ sass-loader@16.0.5:
+ resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==}
+ engines: {node: '>= 18.12.0'}
+ peerDependencies:
+ '@rspack/core': 0.x || 1.x
+ node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+ sass: ^1.3.0
+ sass-embedded: '*'
+ webpack: ^5.0.0
+ peerDependenciesMeta:
+ '@rspack/core':
+ optional: true
+ node-sass:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ webpack:
+ optional: true
+
+ sass@1.85.0:
+ resolution: {integrity: sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ sax@1.4.4:
+ resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==}
+ engines: {node: '>=11.0.0'}
+
+ scheduler@0.27.0:
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+
+ schema-utils@4.3.3:
+ resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==}
+ engines: {node: '>= 10.13.0'}
+
+ select-hose@2.0.0:
+ resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==}
+
+ selfsigned@2.4.1:
+ resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==}
+ engines: {node: '>=10'}
+
+ semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
+ semver@7.7.1:
+ resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ semver@7.7.2:
+ resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
semver@7.7.4:
resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
engines: {node: '>=10'}
hasBin: true
+ send@0.19.2:
+ resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==}
+ engines: {node: '>= 0.8.0'}
+
+ serialize-javascript@6.0.2:
+ resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+
+ serve-index@1.9.2:
+ resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==}
+ engines: {node: '>= 0.8.0'}
+
+ serve-static@1.16.3:
+ resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==}
+ engines: {node: '>= 0.8.0'}
+
set-cookie-parser@3.0.1:
resolution: {integrity: sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==}
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ shallow-clone@3.0.1:
+ resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==}
+ engines: {node: '>=8'}
+
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
@@ -2584,13 +5850,40 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
+ shell-quote@1.8.3:
+ resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
+ sigstore@3.1.0:
+ resolution: {integrity: sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
sirv@3.0.2:
resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
engines: {node: '>=18'}
@@ -2602,6 +5895,10 @@ packages:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
+ slash@5.1.0:
+ resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
+ engines: {node: '>=14.16'}
+
slice-ansi@5.0.0:
resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
engines: {node: '>=12'}
@@ -2610,23 +5907,86 @@ packages:
resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==}
engines: {node: '>=18'}
+ smart-buffer@4.2.0:
+ resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
+ engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
+
smol-toml@1.6.0:
resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==}
engines: {node: '>= 18'}
+ sockjs@0.3.24:
+ resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==}
+
+ socks-proxy-agent@8.0.5:
+ resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==}
+ engines: {node: '>= 14'}
+
+ socks@2.8.7:
+ resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==}
+ engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
+
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
+ source-map-loader@5.0.0:
+ resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==}
+ engines: {node: '>= 18.12.0'}
+ peerDependencies:
+ webpack: ^5.72.1
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+
spawndamnit@3.0.1:
resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==}
+ spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+
+ spdx-exceptions@2.5.0:
+ resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+
+ spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+
+ spdx-license-ids@3.0.23:
+ resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==}
+
+ spdy-transport@3.0.0:
+ resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
+
+ spdy@4.0.2:
+ resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==}
+ engines: {node: '>=6.0.0'}
+
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+ ssri@12.0.0:
+ resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+ statuses@1.5.0:
+ resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
+ engines: {node: '>= 0.6'}
+
+ statuses@2.0.2:
+ resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
+ engines: {node: '>= 0.8'}
+
std-env@3.10.0:
resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
@@ -2638,6 +5998,14 @@ packages:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
string-width@7.2.0:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
engines: {node: '>=18'}
@@ -2646,6 +6014,12 @@ packages:
resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==}
engines: {node: '>=20'}
+ string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -2674,6 +6048,10 @@ packages:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
@@ -2690,10 +6068,57 @@ packages:
resolution: {integrity: sha512-7dhHkSamGS2vtoBmIW2hRab+gl5Z60alEHZB4910ePqqJNxAWnDAxsofVmlZ2tREmWyHNE+A1nCKwICAquoD2A==}
engines: {node: '>=18'}
+ symbol-observable@4.0.0:
+ resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==}
+ engines: {node: '>=0.10'}
+
+ tapable@2.3.0:
+ resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
+ engines: {node: '>=6'}
+
+ tar@6.2.1:
+ resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
+ engines: {node: '>=10'}
+ 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
+
+ tar@7.5.9:
+ resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==}
+ engines: {node: '>=18'}
+
term-size@2.2.1:
resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==}
engines: {node: '>=8'}
+ terser-webpack-plugin@5.3.16:
+ resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ '@swc/core': '*'
+ esbuild: '*'
+ uglify-js: '*'
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ esbuild:
+ optional: true
+ uglify-js:
+ optional: true
+
+ terser@5.39.0:
+ resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ thingies@2.5.0:
+ resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==}
+ engines: {node: '>=10.18'}
+ peerDependencies:
+ tslib: ^2
+
+ thunky@1.1.0:
+ resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==}
+
tinybench@2.9.0:
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
@@ -2713,10 +6138,20 @@ packages:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
totalist@3.0.1:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
+ tree-dump@1.1.0:
+ resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ tslib: '2'
+
tree-kill@1.2.2:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
@@ -2755,6 +6190,10 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+ tuf-js@3.1.0:
+ resolution: {integrity: sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
turbo-darwin-64@2.8.10:
resolution: {integrity: sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g==}
cpu: [x64]
@@ -2797,21 +6236,75 @@ packages:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
- typescript@5.9.3:
- resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+
+ typed-assert@1.0.9:
+ resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==}
+
+ typescript-eslint@8.56.1:
+ resolution: {integrity: sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ typescript@5.6.3:
+ resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'}
hasBin: true
unconfig-core@7.5.0:
resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==}
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
undici-types@7.18.2:
resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
+ unicode-canonical-property-names-ecmascript@2.0.1:
+ resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
+ engines: {node: '>=4'}
+
+ unicode-match-property-ecmascript@2.0.0:
+ resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
+ engines: {node: '>=4'}
+
+ unicode-match-property-value-ecmascript@2.2.1:
+ resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==}
+ engines: {node: '>=4'}
+
+ unicode-property-aliases-ecmascript@2.2.0:
+ resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==}
+ engines: {node: '>=4'}
+
+ unicorn-magic@0.3.0:
+ resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
+ engines: {node: '>=18'}
+
+ unique-filename@4.0.0:
+ resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ unique-slug@5.0.0:
+ resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
universalify@0.1.2:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
unrun@0.2.27:
resolution: {integrity: sha512-Mmur1UJpIbfxasLOhPRvox/QS4xBiDii71hMP7smfRthGcwFL2OAmYRgduLANOAU4LUkvVamuP+02U+c90jlrw==}
engines: {node: '>=20.19.0'}
@@ -2834,6 +6327,25 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+
+ validate-npm-package-name@6.0.2:
+ resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
vite@6.4.1:
resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -2949,20 +6461,115 @@ packages:
resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==}
engines: {node: 20 || >=22}
+ watchpack@2.4.2:
+ resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
+ engines: {node: '>=10.13.0'}
+
+ watchpack@2.5.1:
+ resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==}
+ engines: {node: '>=10.13.0'}
+
+ wbuf@1.7.3:
+ resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==}
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ weak-lru-cache@1.2.2:
+ resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==}
+
+ webpack-dev-middleware@7.4.2:
+ resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==}
+ engines: {node: '>= 18.12.0'}
+ peerDependencies:
+ webpack: ^5.0.0
+ peerDependenciesMeta:
+ webpack:
+ optional: true
+
+ webpack-dev-server@5.2.2:
+ resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==}
+ engines: {node: '>= 18.12.0'}
+ hasBin: true
+ peerDependencies:
+ webpack: ^5.0.0
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack:
+ optional: true
+ webpack-cli:
+ optional: true
+
+ webpack-merge@6.0.1:
+ resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==}
+ engines: {node: '>=18.0.0'}
+
+ webpack-sources@3.3.4:
+ resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==}
+ engines: {node: '>=10.13.0'}
+
+ webpack-subresource-integrity@5.1.0:
+ resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==}
+ engines: {node: '>= 12'}
+ peerDependencies:
+ html-webpack-plugin: '>= 5.0.0-beta.1 < 6'
+ webpack: ^5.12.0
+ peerDependenciesMeta:
+ html-webpack-plugin:
+ optional: true
+
+ webpack@5.105.0:
+ resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+
+ websocket-driver@0.7.4:
+ resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==}
+ engines: {node: '>=0.8.0'}
+
+ websocket-extensions@0.1.4:
+ resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
+ engines: {node: '>=0.8.0'}
+
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
hasBin: true
+ which@5.0.0:
+ resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+ hasBin: true
+
why-is-node-running@2.3.0:
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
engines: {node: '>=8'}
hasBin: true
+ wildcard@2.0.1:
+ resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==}
+
word-wrap@1.2.5:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
+ wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
wrap-ansi@9.0.2:
resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
engines: {node: '>=18'}
@@ -2970,22 +6577,61 @@ packages:
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ ws@8.19.0:
+ resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
xml-name-validator@4.0.0:
resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
engines: {node: '>=12'}
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yallist@5.0.0:
+ resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
+ engines: {node: '>=18'}
+
yaml@2.8.2:
resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==}
engines: {node: '>= 14.6'}
hasBin: true
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+ yocto-queue@1.2.2:
+ resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
+ engines: {node: '>=12.20'}
+
+ yoctocolors-cjs@2.1.3:
+ resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
+ engines: {node: '>=18'}
+
yoctocolors@2.1.2:
resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==}
engines: {node: '>=18'}
@@ -3002,8 +6648,332 @@ packages:
zod@4.3.6:
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
+ zone.js@0.15.1:
+ resolution: {integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==}
+
snapshots:
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@angular-devkit/architect@0.1902.21(chokidar@4.0.3)':
+ dependencies:
+ '@angular-devkit/core': 19.2.21(chokidar@4.0.3)
+ rxjs: 7.8.1
+ transitivePeerDependencies:
+ - chokidar
+
+ '@angular-devkit/build-angular@19.2.21(@angular/compiler-cli@19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3))(@angular/compiler@19.2.18)(@types/node@20.19.33)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.1(@types/node@20.19.33)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(yaml@2.8.2)':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@angular-devkit/architect': 0.1902.21(chokidar@4.0.3)
+ '@angular-devkit/build-webpack': 0.1902.21(chokidar@4.0.3)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.0))(webpack@5.105.0(esbuild@0.25.4))
+ '@angular-devkit/core': 19.2.21(chokidar@4.0.3)
+ '@angular/build': 19.2.21(@angular/compiler-cli@19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3))(@angular/compiler@19.2.18)(@types/node@20.19.33)(chokidar@4.0.3)(jiti@2.6.1)(less@4.2.2)(postcss@8.5.2)(terser@5.39.0)(typescript@5.6.3)(yaml@2.8.2)
+ '@angular/compiler-cli': 19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3)
+ '@babel/core': 7.26.10
+ '@babel/generator': 7.26.10
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-split-export-declaration': 7.24.7
+ '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10)
+ '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10)
+ '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.26.10)
+ '@babel/preset-env': 7.26.9(@babel/core@7.26.10)
+ '@babel/runtime': 7.26.10
+ '@discoveryjs/json-ext': 0.6.3
+ '@ngtools/webpack': 19.2.21(@angular/compiler-cli@19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3))(typescript@5.6.3)(webpack@5.105.0(esbuild@0.25.4))
+ '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.4.1(@types/node@20.19.33)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
+ ansi-colors: 4.1.3
+ autoprefixer: 10.4.20(postcss@8.5.2)
+ babel-loader: 9.2.1(@babel/core@7.26.10)(webpack@5.105.0(esbuild@0.25.4))
+ browserslist: 4.28.1
+ copy-webpack-plugin: 12.0.2(webpack@5.105.0(esbuild@0.25.4))
+ css-loader: 7.1.2(webpack@5.105.0(esbuild@0.25.4))
+ esbuild-wasm: 0.25.4
+ fast-glob: 3.3.3
+ http-proxy-middleware: 3.0.5
+ istanbul-lib-instrument: 6.0.3
+ jsonc-parser: 3.3.1
+ karma-source-map-support: 1.4.0
+ less: 4.2.2
+ less-loader: 12.2.0(less@4.2.2)(webpack@5.105.0(esbuild@0.25.4))
+ license-webpack-plugin: 4.0.2(webpack@5.105.0(esbuild@0.25.4))
+ loader-utils: 3.3.1
+ mini-css-extract-plugin: 2.9.2(webpack@5.105.0(esbuild@0.25.4))
+ open: 10.1.0
+ ora: 5.4.1
+ picomatch: 4.0.2
+ piscina: 4.8.0
+ postcss: 8.5.2
+ postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.6.3)(webpack@5.105.0(esbuild@0.25.4))
+ resolve-url-loader: 5.0.0
+ rxjs: 7.8.1
+ sass: 1.85.0
+ sass-loader: 16.0.5(sass@1.85.0)(webpack@5.105.0(esbuild@0.25.4))
+ semver: 7.7.1
+ source-map-loader: 5.0.0(webpack@5.105.0(esbuild@0.25.4))
+ source-map-support: 0.5.21
+ terser: 5.39.0
+ tree-kill: 1.2.2
+ tslib: 2.8.1
+ typescript: 5.6.3
+ webpack: 5.105.0(esbuild@0.25.4)
+ webpack-dev-middleware: 7.4.2(tslib@2.8.1)(webpack@5.105.0)
+ webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.105.0)
+ webpack-merge: 6.0.1
+ webpack-subresource-integrity: 5.1.0(webpack@5.105.0(esbuild@0.25.4))
+ optionalDependencies:
+ esbuild: 0.25.4
+ transitivePeerDependencies:
+ - '@angular/compiler'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@types/node'
+ - bufferutil
+ - chokidar
+ - debug
+ - html-webpack-plugin
+ - jiti
+ - lightningcss
+ - node-sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - tsx
+ - uglify-js
+ - utf-8-validate
+ - vite
+ - webpack-cli
+ - yaml
+
+ '@angular-devkit/build-webpack@0.1902.21(chokidar@4.0.3)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.0))(webpack@5.105.0(esbuild@0.25.4))':
+ dependencies:
+ '@angular-devkit/architect': 0.1902.21(chokidar@4.0.3)
+ rxjs: 7.8.1
+ webpack: 5.105.0(esbuild@0.25.4)
+ webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.105.0)
+ transitivePeerDependencies:
+ - chokidar
+
+ '@angular-devkit/core@19.2.21(chokidar@4.0.3)':
+ dependencies:
+ ajv: 8.17.1
+ ajv-formats: 3.0.1(ajv@8.17.1)
+ jsonc-parser: 3.3.1
+ picomatch: 4.0.2
+ rxjs: 7.8.1
+ source-map: 0.7.4
+ optionalDependencies:
+ chokidar: 4.0.3
+
+ '@angular-devkit/schematics@19.2.21(chokidar@4.0.3)':
+ dependencies:
+ '@angular-devkit/core': 19.2.21(chokidar@4.0.3)
+ jsonc-parser: 3.3.1
+ magic-string: 0.30.17
+ ora: 5.4.1
+ rxjs: 7.8.1
+ transitivePeerDependencies:
+ - chokidar
+
+ '@angular-eslint/builder@19.8.1(chokidar@4.0.3)(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@angular-devkit/architect': 0.1902.21(chokidar@4.0.3)
+ '@angular-devkit/core': 19.2.21(chokidar@4.0.3)
+ eslint: 9.39.3(jiti@2.6.1)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - chokidar
+
+ '@angular-eslint/bundled-angular-compiler@19.8.1': {}
+
+ '@angular-eslint/eslint-plugin-template@19.8.1(@angular-eslint/template-parser@19.8.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.56.1)(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@angular-eslint/bundled-angular-compiler': 19.8.1
+ '@angular-eslint/template-parser': 19.8.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@angular-eslint/utils': 19.8.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/types': 8.56.1
+ '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ eslint: 9.39.3(jiti@2.6.1)
+ typescript: 5.9.3
+
+ '@angular-eslint/eslint-plugin@19.8.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@angular-eslint/bundled-angular-compiler': 19.8.1
+ '@angular-eslint/utils': 19.8.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.3(jiti@2.6.1)
+ typescript: 5.9.3
+
+ '@angular-eslint/schematics@19.8.1(@angular-eslint/template-parser@19.8.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.56.1)(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@4.0.3)(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@angular-devkit/core': 19.2.21(chokidar@4.0.3)
+ '@angular-devkit/schematics': 19.2.21(chokidar@4.0.3)
+ '@angular-eslint/eslint-plugin': 19.8.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@angular-eslint/eslint-plugin-template': 19.8.1(@angular-eslint/template-parser@19.8.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.56.1)(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ ignore: 7.0.5
+ semver: 7.7.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - '@angular-eslint/template-parser'
+ - '@typescript-eslint/types'
+ - '@typescript-eslint/utils'
+ - chokidar
+ - eslint
+ - typescript
+
+ '@angular-eslint/template-parser@19.8.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@angular-eslint/bundled-angular-compiler': 19.8.1
+ eslint: 9.39.3(jiti@2.6.1)
+ eslint-scope: 8.4.0
+ typescript: 5.9.3
+
+ '@angular-eslint/utils@19.8.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@angular-eslint/bundled-angular-compiler': 19.8.1
+ '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.3(jiti@2.6.1)
+ typescript: 5.9.3
+
+ '@angular/animations@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))':
+ dependencies:
+ '@angular/common': 19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1)
+ '@angular/core': 19.2.18(rxjs@7.8.1)(zone.js@0.15.1)
+ tslib: 2.8.1
+
+ '@angular/build@19.2.21(@angular/compiler-cli@19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3))(@angular/compiler@19.2.18)(@types/node@20.19.33)(chokidar@4.0.3)(jiti@2.6.1)(less@4.2.2)(postcss@8.5.2)(terser@5.39.0)(typescript@5.6.3)(yaml@2.8.2)':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@angular-devkit/architect': 0.1902.21(chokidar@4.0.3)
+ '@angular/compiler': 19.2.18
+ '@angular/compiler-cli': 19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3)
+ '@babel/core': 7.26.10
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-split-export-declaration': 7.24.7
+ '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10)
+ '@inquirer/confirm': 5.1.6(@types/node@20.19.33)
+ '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.4.1(@types/node@20.19.33)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
+ beasties: 0.3.2
+ browserslist: 4.28.1
+ esbuild: 0.25.4
+ fast-glob: 3.3.3
+ https-proxy-agent: 7.0.6
+ istanbul-lib-instrument: 6.0.3
+ listr2: 8.2.5
+ magic-string: 0.30.17
+ mrmime: 2.0.1
+ parse5-html-rewriting-stream: 7.0.0
+ picomatch: 4.0.2
+ piscina: 4.8.0
+ rollup: 4.34.8
+ sass: 1.85.0
+ semver: 7.7.1
+ source-map-support: 0.5.21
+ typescript: 5.6.3
+ vite: 6.4.1(@types/node@20.19.33)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
+ watchpack: 2.4.2
+ optionalDependencies:
+ less: 4.2.2
+ lmdb: 3.2.6
+ postcss: 8.5.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - chokidar
+ - jiti
+ - lightningcss
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
+ '@angular/cli@19.2.21(@types/node@20.19.33)(chokidar@4.0.3)':
+ dependencies:
+ '@angular-devkit/architect': 0.1902.21(chokidar@4.0.3)
+ '@angular-devkit/core': 19.2.21(chokidar@4.0.3)
+ '@angular-devkit/schematics': 19.2.21(chokidar@4.0.3)
+ '@inquirer/prompts': 7.3.2(@types/node@20.19.33)
+ '@listr2/prompt-adapter-inquirer': 2.0.18(@inquirer/prompts@7.3.2(@types/node@20.19.33))
+ '@schematics/angular': 19.2.21(chokidar@4.0.3)
+ '@yarnpkg/lockfile': 1.1.0
+ ini: 5.0.0
+ jsonc-parser: 3.3.1
+ listr2: 8.2.5
+ npm-package-arg: 12.0.2
+ npm-pick-manifest: 10.0.0
+ pacote: 20.0.0
+ resolve: 1.22.10
+ semver: 7.7.1
+ symbol-observable: 4.0.0
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - chokidar
+ - supports-color
+
+ '@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1)':
+ dependencies:
+ '@angular/core': 19.2.18(rxjs@7.8.1)(zone.js@0.15.1)
+ rxjs: 7.8.1
+ tslib: 2.8.1
+
+ '@angular/compiler-cli@19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3)':
+ dependencies:
+ '@angular/compiler': 19.2.18
+ '@babel/core': 7.26.9
+ '@jridgewell/sourcemap-codec': 1.5.5
+ chokidar: 4.0.3
+ convert-source-map: 1.9.0
+ reflect-metadata: 0.2.2
+ semver: 7.7.4
+ tslib: 2.8.1
+ typescript: 5.6.3
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@angular/compiler@19.2.18':
+ dependencies:
+ tslib: 2.8.1
+
+ '@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)':
+ dependencies:
+ rxjs: 7.8.1
+ tslib: 2.8.1
+ zone.js: 0.15.1
+
+ '@angular/forms@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(@angular/platform-browser@19.2.18(@angular/animations@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))(rxjs@7.8.1)':
+ dependencies:
+ '@angular/common': 19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1)
+ '@angular/core': 19.2.18(rxjs@7.8.1)(zone.js@0.15.1)
+ '@angular/platform-browser': 19.2.18(@angular/animations@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))
+ rxjs: 7.8.1
+ tslib: 2.8.1
+
+ '@angular/platform-browser-dynamic@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/compiler@19.2.18)(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(@angular/platform-browser@19.2.18(@angular/animations@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))':
+ dependencies:
+ '@angular/common': 19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1)
+ '@angular/compiler': 19.2.18
+ '@angular/core': 19.2.18(rxjs@7.8.1)(zone.js@0.15.1)
+ '@angular/platform-browser': 19.2.18(@angular/animations@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))
+ tslib: 2.8.1
+
+ '@angular/platform-browser@19.2.18(@angular/animations@19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1)))(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))':
+ dependencies:
+ '@angular/common': 19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1)
+ '@angular/core': 19.2.18(rxjs@7.8.1)(zone.js@0.15.1)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@angular/animations': 19.2.18(@angular/common@19.2.18(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@19.2.18(rxjs@7.8.1)(zone.js@0.15.1))
+
'@babel/code-frame@7.29.0':
dependencies:
'@babel/helper-validator-identifier': 7.28.5
@@ -3012,6 +6982,46 @@ snapshots:
'@babel/compat-data@7.29.0': {}
+ '@babel/core@7.26.10':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.26.10)
+ '@babel/helpers': 7.28.6
+ '@babel/parser': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/core@7.26.9':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.26.9)
+ '@babel/helpers': 7.28.6
+ '@babel/parser': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/core@7.29.0':
dependencies:
'@babel/code-frame': 7.29.0
@@ -3032,6 +7042,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/generator@7.26.10':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
'@babel/generator@7.29.1':
dependencies:
'@babel/parser': 7.29.0
@@ -3049,16 +7067,62 @@ snapshots:
'@types/jsesc': 2.5.1
jsesc: 3.1.0
- '@babel/helper-compilation-targets@7.28.6':
+ '@babel/helper-annotate-as-pure@7.25.9':
dependencies:
- '@babel/compat-data': 7.29.0
- '@babel/helper-validator-option': 7.27.1
- browserslist: 4.28.1
- lru-cache: 5.1.1
+ '@babel/types': 7.29.0
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/helper-compilation-targets@7.28.6':
+ dependencies:
+ '@babel/compat-data': 7.29.0
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.28.1
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-member-expression-to-functions': 7.28.5
+ '@babel/helper-optimise-call-expression': 7.27.1
+ '@babel/helper-replace-supers': 7.28.6(@babel/core@7.26.10)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/traverse': 7.29.0
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-annotate-as-pure': 7.27.3
+ regexpu-core: 6.4.0
semver: 6.3.1
+ '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ debug: 4.4.3
+ lodash.debounce: 4.0.8
+ resolve: 1.22.11
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-globals@7.28.0': {}
+ '@babel/helper-member-expression-to-functions@7.28.5':
+ dependencies:
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-module-imports@7.28.6':
dependencies:
'@babel/traverse': 7.29.0
@@ -3066,6 +7130,24 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-module-transforms@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.28.6(@babel/core@7.26.9)':
+ dependencies:
+ '@babel/core': 7.26.9
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
@@ -3075,6 +7157,41 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-optimise-call-expression@7.27.1':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/helper-plugin-utils@7.28.6': {}
+
+ '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-wrap-function': 7.28.6
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-replace-supers@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-member-expression-to-functions': 7.28.5
+ '@babel/helper-optimise-call-expression': 7.27.1
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-split-export-declaration@7.24.7':
+ dependencies:
+ '@babel/types': 7.29.0
+
'@babel/helper-string-parser@7.27.1': {}
'@babel/helper-string-parser@8.0.0-rc.2': {}
@@ -3085,6 +7202,14 @@ snapshots:
'@babel/helper-validator-option@7.27.1': {}
+ '@babel/helper-wrap-function@7.28.6':
+ dependencies:
+ '@babel/template': 7.28.6
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helpers@7.28.6':
dependencies:
'@babel/template': 7.28.6
@@ -3098,393 +7223,1426 @@ snapshots:
dependencies:
'@babel/types': 8.0.0-rc.1
- '@babel/runtime@7.28.6': {}
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
- '@babel/template@7.28.6':
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.26.10)':
dependencies:
- '@babel/code-frame': 7.29.0
- '@babel/parser': 7.29.0
- '@babel/types': 7.29.0
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@babel/traverse@7.29.0':
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.26.10)':
dependencies:
- '@babel/code-frame': 7.29.0
- '@babel/generator': 7.29.1
- '@babel/helper-globals': 7.28.0
- '@babel/parser': 7.29.0
- '@babel/template': 7.28.6
- '@babel/types': 7.29.0
- debug: 4.4.3
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.26.10)
transitivePeerDependencies:
- supports-color
- '@babel/types@7.29.0':
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.26.10)':
dependencies:
- '@babel/helper-string-parser': 7.27.1
- '@babel/helper-validator-identifier': 7.28.5
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
- '@babel/types@8.0.0-rc.1':
+ '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)':
dependencies:
- '@babel/helper-string-parser': 8.0.0-rc.2
- '@babel/helper-validator-identifier': 8.0.0-rc.1
+ '@babel/core': 7.26.10
- '@changesets/apply-release-plan@7.0.14':
+ '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.26.10)':
dependencies:
- '@changesets/config': 3.1.2
- '@changesets/get-version-range-type': 0.4.0
- '@changesets/git': 3.0.4
- '@changesets/should-skip-package': 0.1.2
- '@changesets/types': 6.1.0
- '@manypkg/get-packages': 1.1.3
- detect-indent: 6.1.0
- fs-extra: 7.0.1
- lodash.startcase: 4.4.0
- outdent: 0.5.0
- prettier: 2.8.8
- resolve-from: 5.0.0
- semver: 7.7.4
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@changesets/assemble-release-plan@6.0.9':
+ '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)':
dependencies:
- '@changesets/errors': 0.2.0
- '@changesets/get-dependents-graph': 2.1.3
- '@changesets/should-skip-package': 0.1.2
- '@changesets/types': 6.1.0
- '@manypkg/get-packages': 1.1.3
- semver: 7.7.4
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@changesets/changelog-git@0.2.1':
+ '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.26.10)':
dependencies:
- '@changesets/types': 6.1.0
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@changesets/cli@2.29.8(@types/node@25.3.0)':
+ '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)':
dependencies:
- '@changesets/apply-release-plan': 7.0.14
- '@changesets/assemble-release-plan': 6.0.9
- '@changesets/changelog-git': 0.2.1
- '@changesets/config': 3.1.2
- '@changesets/errors': 0.2.0
- '@changesets/get-dependents-graph': 2.1.3
- '@changesets/get-release-plan': 4.0.14
- '@changesets/git': 3.0.4
- '@changesets/logger': 0.1.1
- '@changesets/pre': 2.0.2
- '@changesets/read': 0.6.6
- '@changesets/should-skip-package': 0.1.2
- '@changesets/types': 6.1.0
- '@changesets/write': 0.4.0
- '@inquirer/external-editor': 1.0.3(@types/node@25.3.0)
- '@manypkg/get-packages': 1.1.3
- ansi-colors: 4.1.3
- ci-info: 3.9.0
- enquirer: 2.4.1
- fs-extra: 7.0.1
- mri: 1.2.0
- p-limit: 2.3.0
- package-manager-detector: 0.2.11
- picocolors: 1.1.1
- resolve-from: 5.0.0
- semver: 7.7.4
- spawndamnit: 3.0.1
- term-size: 2.2.1
- transitivePeerDependencies:
- - '@types/node'
+ '@babel/core': 7.26.10
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
- '@changesets/config@3.1.2':
+ '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.26.10)':
dependencies:
- '@changesets/errors': 0.2.0
- '@changesets/get-dependents-graph': 2.1.3
- '@changesets/logger': 0.1.1
- '@changesets/types': 6.1.0
- '@manypkg/get-packages': 1.1.3
- fs-extra: 7.0.1
- micromatch: 4.0.8
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@changesets/errors@0.2.0':
+ '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)':
dependencies:
- extendable-error: 0.1.7
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10)
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
- '@changesets/get-dependents-graph@2.1.3':
+ '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)':
dependencies:
- '@changesets/types': 6.1.0
- '@manypkg/get-packages': 1.1.3
- picocolors: 1.1.1
- semver: 7.7.4
+ '@babel/core': 7.26.10
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10)
+ transitivePeerDependencies:
+ - supports-color
- '@changesets/get-release-plan@4.0.14':
+ '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.26.10)':
dependencies:
- '@changesets/assemble-release-plan': 6.0.9
- '@changesets/config': 3.1.2
- '@changesets/pre': 2.0.2
- '@changesets/read': 0.6.6
- '@changesets/types': 6.1.0
- '@manypkg/get-packages': 1.1.3
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@changesets/get-version-range-type@0.4.0': {}
+ '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@changesets/git@3.0.4':
+ '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.26.10)':
dependencies:
- '@changesets/errors': 0.2.0
- '@manypkg/get-packages': 1.1.3
- is-subdir: 1.2.0
- micromatch: 4.0.8
- spawndamnit: 3.0.1
+ '@babel/core': 7.26.10
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
- '@changesets/logger@0.1.1':
+ '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.26.10)':
dependencies:
- picocolors: 1.1.1
+ '@babel/core': 7.26.10
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
- '@changesets/parse@0.4.2':
+ '@babel/plugin-transform-classes@7.28.6(@babel/core@7.26.10)':
dependencies:
- '@changesets/types': 6.1.0
- js-yaml: 4.1.1
+ '@babel/core': 7.26.10
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-globals': 7.28.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-replace-supers': 7.28.6(@babel/core@7.26.10)
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
- '@changesets/pre@2.0.2':
+ '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.26.10)':
dependencies:
- '@changesets/errors': 0.2.0
- '@changesets/types': 6.1.0
- '@manypkg/get-packages': 1.1.3
- fs-extra: 7.0.1
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/template': 7.28.6
- '@changesets/read@0.6.6':
+ '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.26.10)':
dependencies:
- '@changesets/git': 3.0.4
- '@changesets/logger': 0.1.1
- '@changesets/parse': 0.4.2
- '@changesets/types': 6.1.0
- fs-extra: 7.0.1
- p-filter: 2.1.0
- picocolors: 1.1.1
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
- '@changesets/should-skip-package@0.1.2':
+ '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.26.10)':
dependencies:
- '@changesets/types': 6.1.0
- '@manypkg/get-packages': 1.1.3
+ '@babel/core': 7.26.10
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
- '@changesets/types@4.1.0': {}
+ '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@changesets/types@6.1.0': {}
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
- '@changesets/write@0.4.0':
+ '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.26.10)':
dependencies:
- '@changesets/types': 6.1.0
- fs-extra: 7.0.1
- human-id: 4.1.3
- prettier: 2.8.8
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@emnapi/core@1.8.1':
+ '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.26.10)':
dependencies:
- '@emnapi/wasi-threads': 1.1.0
- tslib: 2.8.1
- optional: true
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@emnapi/runtime@1.8.1':
+ '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.26.10)':
dependencies:
- tslib: 2.8.1
- optional: true
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
- '@emnapi/wasi-threads@1.1.0':
+ '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.26.10)':
dependencies:
- tslib: 2.8.1
- optional: true
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
- '@epic-web/invariant@1.0.0': {}
+ '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-literals@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.26.10)
+ '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.10)
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-replace-supers': 7.28.6(@babel/core@7.26.10)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.26.10)
+ babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10)
+ babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.26.10)
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-spread@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/preset-env@7.26.9(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/compat-data': 7.29.0
+ '@babel/core': 7.26.10
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-validator-option': 7.27.1
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.26.10)
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)
+ '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10)
+ '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10)
+ '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.26.10)
+ '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.26.10)
+ '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.26.10)
+ '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.26.10)
+ '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.10)
+ '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.26.10)
+ '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.26.10)
+ '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.26.10)
+ '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.26.10)
+ '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10)
+ babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.26.10)
+ babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10)
+ babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.26.10)
+ core-js-compat: 3.48.0
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/types': 7.29.0
+ esutils: 2.0.3
+
+ '@babel/runtime@7.26.10':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/runtime@7.28.6': {}
+
+ '@babel/template@7.28.6':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+
+ '@babel/traverse@7.29.0':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@babel/types@8.0.0-rc.1':
+ dependencies:
+ '@babel/helper-string-parser': 8.0.0-rc.2
+ '@babel/helper-validator-identifier': 8.0.0-rc.1
+
+ '@changesets/apply-release-plan@7.0.14':
+ dependencies:
+ '@changesets/config': 3.1.2
+ '@changesets/get-version-range-type': 0.4.0
+ '@changesets/git': 3.0.4
+ '@changesets/should-skip-package': 0.1.2
+ '@changesets/types': 6.1.0
+ '@manypkg/get-packages': 1.1.3
+ detect-indent: 6.1.0
+ fs-extra: 7.0.1
+ lodash.startcase: 4.4.0
+ outdent: 0.5.0
+ prettier: 2.8.8
+ resolve-from: 5.0.0
+ semver: 7.7.4
+
+ '@changesets/assemble-release-plan@6.0.9':
+ dependencies:
+ '@changesets/errors': 0.2.0
+ '@changesets/get-dependents-graph': 2.1.3
+ '@changesets/should-skip-package': 0.1.2
+ '@changesets/types': 6.1.0
+ '@manypkg/get-packages': 1.1.3
+ semver: 7.7.4
+
+ '@changesets/changelog-git@0.2.1':
+ dependencies:
+ '@changesets/types': 6.1.0
+
+ '@changesets/cli@2.29.8(@types/node@25.3.0)':
+ dependencies:
+ '@changesets/apply-release-plan': 7.0.14
+ '@changesets/assemble-release-plan': 6.0.9
+ '@changesets/changelog-git': 0.2.1
+ '@changesets/config': 3.1.2
+ '@changesets/errors': 0.2.0
+ '@changesets/get-dependents-graph': 2.1.3
+ '@changesets/get-release-plan': 4.0.14
+ '@changesets/git': 3.0.4
+ '@changesets/logger': 0.1.1
+ '@changesets/pre': 2.0.2
+ '@changesets/read': 0.6.6
+ '@changesets/should-skip-package': 0.1.2
+ '@changesets/types': 6.1.0
+ '@changesets/write': 0.4.0
+ '@inquirer/external-editor': 1.0.3(@types/node@25.3.0)
+ '@manypkg/get-packages': 1.1.3
+ ansi-colors: 4.1.3
+ ci-info: 3.9.0
+ enquirer: 2.4.1
+ fs-extra: 7.0.1
+ mri: 1.2.0
+ p-limit: 2.3.0
+ package-manager-detector: 0.2.11
+ picocolors: 1.1.1
+ resolve-from: 5.0.0
+ semver: 7.7.4
+ spawndamnit: 3.0.1
+ term-size: 2.2.1
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@changesets/config@3.1.2':
+ dependencies:
+ '@changesets/errors': 0.2.0
+ '@changesets/get-dependents-graph': 2.1.3
+ '@changesets/logger': 0.1.1
+ '@changesets/types': 6.1.0
+ '@manypkg/get-packages': 1.1.3
+ fs-extra: 7.0.1
+ micromatch: 4.0.8
+
+ '@changesets/errors@0.2.0':
+ dependencies:
+ extendable-error: 0.1.7
+
+ '@changesets/get-dependents-graph@2.1.3':
+ dependencies:
+ '@changesets/types': 6.1.0
+ '@manypkg/get-packages': 1.1.3
+ picocolors: 1.1.1
+ semver: 7.7.4
+
+ '@changesets/get-release-plan@4.0.14':
+ dependencies:
+ '@changesets/assemble-release-plan': 6.0.9
+ '@changesets/config': 3.1.2
+ '@changesets/pre': 2.0.2
+ '@changesets/read': 0.6.6
+ '@changesets/types': 6.1.0
+ '@manypkg/get-packages': 1.1.3
+
+ '@changesets/get-version-range-type@0.4.0': {}
+
+ '@changesets/git@3.0.4':
+ dependencies:
+ '@changesets/errors': 0.2.0
+ '@manypkg/get-packages': 1.1.3
+ is-subdir: 1.2.0
+ micromatch: 4.0.8
+ spawndamnit: 3.0.1
+
+ '@changesets/logger@0.1.1':
+ dependencies:
+ picocolors: 1.1.1
+
+ '@changesets/parse@0.4.2':
+ dependencies:
+ '@changesets/types': 6.1.0
+ js-yaml: 4.1.1
+
+ '@changesets/pre@2.0.2':
+ dependencies:
+ '@changesets/errors': 0.2.0
+ '@changesets/types': 6.1.0
+ '@manypkg/get-packages': 1.1.3
+ fs-extra: 7.0.1
+
+ '@changesets/read@0.6.6':
+ dependencies:
+ '@changesets/git': 3.0.4
+ '@changesets/logger': 0.1.1
+ '@changesets/parse': 0.4.2
+ '@changesets/types': 6.1.0
+ fs-extra: 7.0.1
+ p-filter: 2.1.0
+ picocolors: 1.1.1
+
+ '@changesets/should-skip-package@0.1.2':
+ dependencies:
+ '@changesets/types': 6.1.0
+ '@manypkg/get-packages': 1.1.3
+
+ '@changesets/types@4.1.0': {}
+
+ '@changesets/types@6.1.0': {}
+
+ '@changesets/write@0.4.0':
+ dependencies:
+ '@changesets/types': 6.1.0
+ fs-extra: 7.0.1
+ human-id: 4.1.3
+ prettier: 2.8.8
+
+ '@discoveryjs/json-ext@0.6.3': {}
+
+ '@emnapi/core@1.8.1':
+ dependencies:
+ '@emnapi/wasi-threads': 1.1.0
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.8.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.1.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@epic-web/invariant@1.0.0': {}
'@esbuild/aix-ppc64@0.25.12':
optional: true
- '@esbuild/android-arm64@0.25.12':
+ '@esbuild/aix-ppc64@0.25.4':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/android-arm@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm@0.25.4':
+ optional: true
+
+ '@esbuild/android-x64@0.25.12':
+ optional: true
+
+ '@esbuild/android-x64@0.25.4':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.4':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.4':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.4':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.4':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.4':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.12':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.4':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.4':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.4':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.12':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.4':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.4':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.4':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.4':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.4':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.4':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.4':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.9.1(eslint@9.39.3(jiti@2.6.1))':
+ dependencies:
+ eslint: 9.39.3(jiti@2.6.1)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.2': {}
+
+ '@eslint/config-array@0.21.1':
+ dependencies:
+ '@eslint/object-schema': 2.1.7
+ debug: 4.4.3
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.4.2':
+ dependencies:
+ '@eslint/core': 0.17.0
+
+ '@eslint/core@0.17.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.3':
+ dependencies:
+ ajv: 6.14.0
+ debug: 4.4.3
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.39.3': {}
+
+ '@eslint/object-schema@2.1.7': {}
+
+ '@eslint/plugin-kit@0.4.1':
+ dependencies:
+ '@eslint/core': 0.17.0
+ levn: 0.4.1
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.7':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@inquirer/ansi@1.0.2': {}
+
+ '@inquirer/checkbox@4.3.2(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/confirm@5.1.21(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/confirm@5.1.6(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/core@10.3.2(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ cli-width: 4.1.0
+ mute-stream: 2.0.0
+ signal-exit: 4.1.0
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/editor@4.2.23(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/external-editor': 1.0.3(@types/node@20.19.33)
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/expand@4.0.23(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/external-editor@1.0.3(@types/node@20.19.33)':
+ dependencies:
+ chardet: 2.1.1
+ iconv-lite: 0.7.2
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/external-editor@1.0.3(@types/node@25.3.0)':
+ dependencies:
+ chardet: 2.1.1
+ iconv-lite: 0.7.2
+ optionalDependencies:
+ '@types/node': 25.3.0
+
+ '@inquirer/figures@1.0.15': {}
+
+ '@inquirer/input@4.3.1(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/number@3.0.23(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/password@4.0.23(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/prompts@7.3.2(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/checkbox': 4.3.2(@types/node@20.19.33)
+ '@inquirer/confirm': 5.1.21(@types/node@20.19.33)
+ '@inquirer/editor': 4.2.23(@types/node@20.19.33)
+ '@inquirer/expand': 4.0.23(@types/node@20.19.33)
+ '@inquirer/input': 4.3.1(@types/node@20.19.33)
+ '@inquirer/number': 3.0.23(@types/node@20.19.33)
+ '@inquirer/password': 4.0.23(@types/node@20.19.33)
+ '@inquirer/rawlist': 4.1.11(@types/node@20.19.33)
+ '@inquirer/search': 3.2.2(@types/node@20.19.33)
+ '@inquirer/select': 4.4.2(@types/node@20.19.33)
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/rawlist@4.1.11(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/search@3.2.2(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/select@4.4.2(@types/node@20.19.33)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@20.19.33)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@20.19.33)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@inquirer/type@1.5.5':
+ dependencies:
+ mute-stream: 1.0.0
+
+ '@inquirer/type@3.0.10(@types/node@20.19.33)':
+ optionalDependencies:
+ '@types/node': 20.19.33
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.2
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@isaacs/fs-minipass@4.0.1':
+ dependencies:
+ minipass: 7.1.3
+
+ '@istanbuljs/schema@0.1.3': {}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/base64@17.67.0(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/buffers@17.67.0(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/codegen@17.67.0(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1)
+ thingies: 2.5.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1)
+ thingies: 2.5.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)':
+ dependencies:
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1)
+ glob-to-regex.js: 1.2.0(tslib@2.8.1)
+ thingies: 2.5.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1)
+ tree-dump: 1.1.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/util': 17.67.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1)
+ '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1)
+ '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1)
+ '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1)
+ '@jsonjoy.com/util': 1.9.0(tslib@2.8.1)
+ hyperdyperid: 1.2.0
+ thingies: 2.5.0(tslib@2.8.1)
+ tree-dump: 1.1.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/json-pack@17.67.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/base64': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/util': 17.67.0(tslib@2.8.1)
+ hyperdyperid: 1.2.0
+ thingies: 2.5.0(tslib@2.8.1)
+ tree-dump: 1.1.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1)
+ '@jsonjoy.com/util': 1.9.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/json-pointer@17.67.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/util': 17.67.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/util@1.9.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1)
+ '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@jsonjoy.com/util@17.67.0(tslib@2.8.1)':
+ dependencies:
+ '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1)
+ '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ '@leichtgewicht/ip-codec@2.0.5': {}
+
+ '@listr2/prompt-adapter-inquirer@2.0.18(@inquirer/prompts@7.3.2(@types/node@20.19.33))':
+ dependencies:
+ '@inquirer/prompts': 7.3.2(@types/node@20.19.33)
+ '@inquirer/type': 1.5.5
+
+ '@lmdb/lmdb-darwin-arm64@3.2.6':
+ optional: true
+
+ '@lmdb/lmdb-darwin-x64@3.2.6':
+ optional: true
+
+ '@lmdb/lmdb-linux-arm64@3.2.6':
+ optional: true
+
+ '@lmdb/lmdb-linux-arm@3.2.6':
+ optional: true
+
+ '@lmdb/lmdb-linux-x64@3.2.6':
+ optional: true
+
+ '@lmdb/lmdb-win32-x64@3.2.6':
+ optional: true
+
+ '@manypkg/find-root@1.1.0':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@types/node': 12.20.55
+ find-up: 4.1.0
+ fs-extra: 8.1.0
+
+ '@manypkg/get-packages@1.1.3':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@changesets/types': 4.1.0
+ '@manypkg/find-root': 1.1.0
+ fs-extra: 8.1.0
+ globby: 11.1.0
+ read-yaml-file: 1.1.0
+
+ '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
optional: true
- '@esbuild/android-arm@0.25.12':
+ '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3':
optional: true
- '@esbuild/android-x64@0.25.12':
+ '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3':
optional: true
- '@esbuild/darwin-arm64@0.25.12':
+ '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3':
optional: true
- '@esbuild/darwin-x64@0.25.12':
+ '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3':
optional: true
- '@esbuild/freebsd-arm64@0.25.12':
+ '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
optional: true
- '@esbuild/freebsd-x64@0.25.12':
+ '@napi-rs/nice-android-arm-eabi@1.1.1':
optional: true
- '@esbuild/linux-arm64@0.25.12':
+ '@napi-rs/nice-android-arm64@1.1.1':
optional: true
- '@esbuild/linux-arm@0.25.12':
+ '@napi-rs/nice-darwin-arm64@1.1.1':
optional: true
- '@esbuild/linux-ia32@0.25.12':
+ '@napi-rs/nice-darwin-x64@1.1.1':
optional: true
- '@esbuild/linux-loong64@0.25.12':
+ '@napi-rs/nice-freebsd-x64@1.1.1':
optional: true
- '@esbuild/linux-mips64el@0.25.12':
+ '@napi-rs/nice-linux-arm-gnueabihf@1.1.1':
optional: true
- '@esbuild/linux-ppc64@0.25.12':
+ '@napi-rs/nice-linux-arm64-gnu@1.1.1':
optional: true
- '@esbuild/linux-riscv64@0.25.12':
+ '@napi-rs/nice-linux-arm64-musl@1.1.1':
optional: true
- '@esbuild/linux-s390x@0.25.12':
+ '@napi-rs/nice-linux-ppc64-gnu@1.1.1':
optional: true
- '@esbuild/linux-x64@0.25.12':
+ '@napi-rs/nice-linux-riscv64-gnu@1.1.1':
optional: true
- '@esbuild/netbsd-arm64@0.25.12':
+ '@napi-rs/nice-linux-s390x-gnu@1.1.1':
optional: true
- '@esbuild/netbsd-x64@0.25.12':
+ '@napi-rs/nice-linux-x64-gnu@1.1.1':
optional: true
- '@esbuild/openbsd-arm64@0.25.12':
+ '@napi-rs/nice-linux-x64-musl@1.1.1':
optional: true
- '@esbuild/openbsd-x64@0.25.12':
+ '@napi-rs/nice-openharmony-arm64@1.1.1':
optional: true
- '@esbuild/openharmony-arm64@0.25.12':
+ '@napi-rs/nice-win32-arm64-msvc@1.1.1':
optional: true
- '@esbuild/sunos-x64@0.25.12':
+ '@napi-rs/nice-win32-ia32-msvc@1.1.1':
optional: true
- '@esbuild/win32-arm64@0.25.12':
+ '@napi-rs/nice-win32-x64-msvc@1.1.1':
optional: true
- '@esbuild/win32-ia32@0.25.12':
+ '@napi-rs/nice@1.1.1':
+ optionalDependencies:
+ '@napi-rs/nice-android-arm-eabi': 1.1.1
+ '@napi-rs/nice-android-arm64': 1.1.1
+ '@napi-rs/nice-darwin-arm64': 1.1.1
+ '@napi-rs/nice-darwin-x64': 1.1.1
+ '@napi-rs/nice-freebsd-x64': 1.1.1
+ '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1
+ '@napi-rs/nice-linux-arm64-gnu': 1.1.1
+ '@napi-rs/nice-linux-arm64-musl': 1.1.1
+ '@napi-rs/nice-linux-ppc64-gnu': 1.1.1
+ '@napi-rs/nice-linux-riscv64-gnu': 1.1.1
+ '@napi-rs/nice-linux-s390x-gnu': 1.1.1
+ '@napi-rs/nice-linux-x64-gnu': 1.1.1
+ '@napi-rs/nice-linux-x64-musl': 1.1.1
+ '@napi-rs/nice-openharmony-arm64': 1.1.1
+ '@napi-rs/nice-win32-arm64-msvc': 1.1.1
+ '@napi-rs/nice-win32-ia32-msvc': 1.1.1
+ '@napi-rs/nice-win32-x64-msvc': 1.1.1
optional: true
- '@esbuild/win32-x64@0.25.12':
+ '@napi-rs/wasm-runtime@1.1.1':
+ dependencies:
+ '@emnapi/core': 1.8.1
+ '@emnapi/runtime': 1.8.1
+ '@tybys/wasm-util': 0.10.1
optional: true
- '@eslint-community/eslint-utils@4.9.1(eslint@9.39.3(jiti@2.6.1))':
+ '@ngtools/webpack@19.2.21(@angular/compiler-cli@19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3))(typescript@5.6.3)(webpack@5.105.0(esbuild@0.25.4))':
dependencies:
- eslint: 9.39.3(jiti@2.6.1)
- eslint-visitor-keys: 3.4.3
-
- '@eslint-community/regexpp@4.12.2': {}
+ '@angular/compiler-cli': 19.2.18(@angular/compiler@19.2.18)(typescript@5.6.3)
+ typescript: 5.6.3
+ webpack: 5.105.0(esbuild@0.25.4)
- '@eslint/config-array@0.21.1':
+ '@nodelib/fs.scandir@2.1.5':
dependencies:
- '@eslint/object-schema': 2.1.7
- debug: 4.4.3
- minimatch: 3.1.2
- transitivePeerDependencies:
- - supports-color
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
- '@eslint/config-helpers@0.4.2':
- dependencies:
- '@eslint/core': 0.17.0
+ '@nodelib/fs.stat@2.0.5': {}
- '@eslint/core@0.17.0':
+ '@nodelib/fs.walk@1.2.8':
dependencies:
- '@types/json-schema': 7.0.15
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.20.1
- '@eslint/eslintrc@3.3.3':
+ '@npmcli/agent@3.0.0':
dependencies:
- ajv: 6.14.0
- debug: 4.4.3
- espree: 10.4.0
- globals: 14.0.0
- ignore: 5.3.2
- import-fresh: 3.3.1
- js-yaml: 4.1.1
- minimatch: 3.1.2
- strip-json-comments: 3.1.1
+ agent-base: 7.1.4
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ lru-cache: 10.4.3
+ socks-proxy-agent: 8.0.5
transitivePeerDependencies:
- supports-color
- '@eslint/js@9.39.3': {}
-
- '@eslint/object-schema@2.1.7': {}
-
- '@eslint/plugin-kit@0.4.1':
- dependencies:
- '@eslint/core': 0.17.0
- levn: 0.4.1
-
- '@humanfs/core@0.19.1': {}
-
- '@humanfs/node@0.16.7':
- dependencies:
- '@humanfs/core': 0.19.1
- '@humanwhocodes/retry': 0.4.3
-
- '@humanwhocodes/module-importer@1.0.1': {}
-
- '@humanwhocodes/retry@0.4.3': {}
-
- '@inquirer/external-editor@1.0.3(@types/node@25.3.0)':
- dependencies:
- chardet: 2.1.1
- iconv-lite: 0.7.2
- optionalDependencies:
- '@types/node': 25.3.0
-
- '@jridgewell/gen-mapping@0.3.13':
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
- '@jridgewell/trace-mapping': 0.3.31
-
- '@jridgewell/remapping@2.3.5':
+ '@npmcli/fs@4.0.0':
dependencies:
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
-
- '@jridgewell/resolve-uri@3.1.2': {}
-
- '@jridgewell/sourcemap-codec@1.5.5': {}
+ semver: 7.7.4
- '@jridgewell/trace-mapping@0.3.31':
+ '@npmcli/git@6.0.3':
dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.5
+ '@npmcli/promise-spawn': 8.0.3
+ ini: 5.0.0
+ lru-cache: 10.4.3
+ npm-pick-manifest: 10.0.0
+ proc-log: 5.0.0
+ promise-retry: 2.0.1
+ semver: 7.7.4
+ which: 5.0.0
- '@manypkg/find-root@1.1.0':
+ '@npmcli/installed-package-contents@3.0.0':
dependencies:
- '@babel/runtime': 7.28.6
- '@types/node': 12.20.55
- find-up: 4.1.0
- fs-extra: 8.1.0
+ npm-bundled: 4.0.0
+ npm-normalize-package-bin: 4.0.0
- '@manypkg/get-packages@1.1.3':
- dependencies:
- '@babel/runtime': 7.28.6
- '@changesets/types': 4.1.0
- '@manypkg/find-root': 1.1.0
- fs-extra: 8.1.0
- globby: 11.1.0
- read-yaml-file: 1.1.0
+ '@npmcli/node-gyp@4.0.0': {}
- '@napi-rs/wasm-runtime@1.1.1':
+ '@npmcli/package-json@6.2.0':
dependencies:
- '@emnapi/core': 1.8.1
- '@emnapi/runtime': 1.8.1
- '@tybys/wasm-util': 0.10.1
- optional: true
+ '@npmcli/git': 6.0.3
+ glob: 10.5.0
+ hosted-git-info: 8.1.0
+ json-parse-even-better-errors: 4.0.0
+ proc-log: 5.0.0
+ semver: 7.7.4
+ validate-npm-package-license: 3.0.4
- '@nodelib/fs.scandir@2.1.5':
+ '@npmcli/promise-spawn@8.0.3':
dependencies:
- '@nodelib/fs.stat': 2.0.5
- run-parallel: 1.2.0
+ which: 5.0.0
- '@nodelib/fs.stat@2.0.5': {}
+ '@npmcli/redact@3.2.2': {}
- '@nodelib/fs.walk@1.2.8':
+ '@npmcli/run-script@9.1.0':
dependencies:
- '@nodelib/fs.scandir': 2.1.5
- fastq: 1.20.1
+ '@npmcli/node-gyp': 4.0.0
+ '@npmcli/package-json': 6.2.0
+ '@npmcli/promise-spawn': 8.0.3
+ node-gyp: 11.5.0
+ proc-log: 5.0.0
+ which: 5.0.0
+ transitivePeerDependencies:
+ - supports-color
'@nuxt/eslint-plugin@1.15.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
@@ -3616,6 +8774,70 @@ snapshots:
'@oxlint/binding-win32-x64-msvc@1.49.0':
optional: true
+ '@parcel/watcher-android-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-darwin-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-darwin-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-freebsd-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-x64-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-x64-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-ia32@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher@2.5.6':
+ dependencies:
+ detect-libc: 2.1.2
+ is-glob: 4.0.3
+ node-addon-api: 7.1.1
+ picomatch: 4.0.3
+ optionalDependencies:
+ '@parcel/watcher-android-arm64': 2.5.6
+ '@parcel/watcher-darwin-arm64': 2.5.6
+ '@parcel/watcher-darwin-x64': 2.5.6
+ '@parcel/watcher-freebsd-x64': 2.5.6
+ '@parcel/watcher-linux-arm-glibc': 2.5.6
+ '@parcel/watcher-linux-arm-musl': 2.5.6
+ '@parcel/watcher-linux-arm64-glibc': 2.5.6
+ '@parcel/watcher-linux-arm64-musl': 2.5.6
+ '@parcel/watcher-linux-x64-glibc': 2.5.6
+ '@parcel/watcher-linux-x64-musl': 2.5.6
+ '@parcel/watcher-win32-arm64': 2.5.6
+ '@parcel/watcher-win32-ia32': 2.5.6
+ '@parcel/watcher-win32-x64': 2.5.6
+ optional: true
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
'@polka/url@1.0.0-next.29': {}
'@quansync/fs@1.0.0':
@@ -3663,6 +8885,8 @@ snapshots:
'@rolldown/binding-win32-x64-msvc@1.0.0-rc.3':
optional: true
+ '@rolldown/pluginutils@1.0.0-beta.27': {}
+
'@rolldown/pluginutils@1.0.0-rc.3': {}
'@rollup/plugin-commonjs@25.0.8(rollup@4.58.0)':
@@ -3700,33 +8924,63 @@ snapshots:
optionalDependencies:
rollup: 4.58.0
+ '@rollup/rollup-android-arm-eabi@4.34.8':
+ optional: true
+
'@rollup/rollup-android-arm-eabi@4.58.0':
optional: true
+ '@rollup/rollup-android-arm64@4.34.8':
+ optional: true
+
'@rollup/rollup-android-arm64@4.58.0':
optional: true
+ '@rollup/rollup-darwin-arm64@4.34.8':
+ optional: true
+
'@rollup/rollup-darwin-arm64@4.58.0':
optional: true
+ '@rollup/rollup-darwin-x64@4.34.8':
+ optional: true
+
'@rollup/rollup-darwin-x64@4.58.0':
optional: true
+ '@rollup/rollup-freebsd-arm64@4.34.8':
+ optional: true
+
'@rollup/rollup-freebsd-arm64@4.58.0':
optional: true
+ '@rollup/rollup-freebsd-x64@4.34.8':
+ optional: true
+
'@rollup/rollup-freebsd-x64@4.58.0':
optional: true
+ '@rollup/rollup-linux-arm-gnueabihf@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-arm-gnueabihf@4.58.0':
optional: true
+ '@rollup/rollup-linux-arm-musleabihf@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-arm-musleabihf@4.58.0':
optional: true
+ '@rollup/rollup-linux-arm64-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-arm64-gnu@4.58.0':
optional: true
+ '@rollup/rollup-linux-arm64-musl@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-arm64-musl@4.58.0':
optional: true
@@ -3736,24 +8990,42 @@ snapshots:
'@rollup/rollup-linux-loong64-musl@4.58.0':
optional: true
+ '@rollup/rollup-linux-loongarch64-gnu@4.34.8':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-ppc64-gnu@4.58.0':
optional: true
'@rollup/rollup-linux-ppc64-musl@4.58.0':
optional: true
+ '@rollup/rollup-linux-riscv64-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-riscv64-gnu@4.58.0':
optional: true
'@rollup/rollup-linux-riscv64-musl@4.58.0':
optional: true
+ '@rollup/rollup-linux-s390x-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-s390x-gnu@4.58.0':
optional: true
+ '@rollup/rollup-linux-x64-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-x64-gnu@4.58.0':
optional: true
+ '@rollup/rollup-linux-x64-musl@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-x64-musl@4.58.0':
optional: true
@@ -3763,37 +9035,88 @@ snapshots:
'@rollup/rollup-openharmony-arm64@4.58.0':
optional: true
+ '@rollup/rollup-win32-arm64-msvc@4.34.8':
+ optional: true
+
'@rollup/rollup-win32-arm64-msvc@4.58.0':
optional: true
+ '@rollup/rollup-win32-ia32-msvc@4.34.8':
+ optional: true
+
'@rollup/rollup-win32-ia32-msvc@4.58.0':
optional: true
'@rollup/rollup-win32-x64-gnu@4.58.0':
optional: true
+ '@rollup/rollup-win32-x64-msvc@4.34.8':
+ optional: true
+
'@rollup/rollup-win32-x64-msvc@4.58.0':
optional: true
+ '@schematics/angular@19.2.21(chokidar@4.0.3)':
+ dependencies:
+ '@angular-devkit/core': 19.2.21(chokidar@4.0.3)
+ '@angular-devkit/schematics': 19.2.21(chokidar@4.0.3)
+ jsonc-parser: 3.3.1
+ transitivePeerDependencies:
+ - chokidar
+
+ '@sigstore/bundle@3.1.0':
+ dependencies:
+ '@sigstore/protobuf-specs': 0.4.3
+
+ '@sigstore/core@2.0.0': {}
+
+ '@sigstore/protobuf-specs@0.4.3': {}
+
+ '@sigstore/sign@3.1.0':
+ dependencies:
+ '@sigstore/bundle': 3.1.0
+ '@sigstore/core': 2.0.0
+ '@sigstore/protobuf-specs': 0.4.3
+ make-fetch-happen: 14.0.3
+ proc-log: 5.0.0
+ promise-retry: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@sigstore/tuf@3.1.1':
+ dependencies:
+ '@sigstore/protobuf-specs': 0.4.3
+ tuf-js: 3.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@sigstore/verify@2.1.1':
+ dependencies:
+ '@sigstore/bundle': 3.1.0
+ '@sigstore/core': 2.0.0
+ '@sigstore/protobuf-specs': 0.4.3
+
+ '@sindresorhus/merge-streams@2.3.0': {}
+
'@standard-schema/spec@1.1.0': {}
'@sveltejs/acorn-typescript@1.0.9(acorn@8.16.0)':
dependencies:
acorn: 8.16.0
- '@sveltejs/adapter-node@4.0.1(@sveltejs/kit@2.53.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)))(svelte@5.53.0)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)))':
+ '@sveltejs/adapter-node@4.0.1(@sveltejs/kit@2.53.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)))(svelte@5.53.0)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)))':
dependencies:
'@rollup/plugin-commonjs': 25.0.8(rollup@4.58.0)
'@rollup/plugin-json': 6.1.0(rollup@4.58.0)
'@rollup/plugin-node-resolve': 15.3.1(rollup@4.58.0)
- '@sveltejs/kit': 2.53.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)))(svelte@5.53.0)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))
+ '@sveltejs/kit': 2.53.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)))(svelte@5.53.0)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
rollup: 4.58.0
- '@sveltejs/kit@2.53.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)))(svelte@5.53.0)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))':
+ '@sveltejs/kit@2.53.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)))(svelte@5.53.0)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))':
dependencies:
'@standard-schema/spec': 1.1.0
'@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0)
- '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))
+ '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
'@types/cookie': 0.6.0
acorn: 8.16.0
cookie: 0.6.0
@@ -3805,67 +9128,224 @@ snapshots:
set-cookie-parser: 3.0.1
sirv: 3.0.2
svelte: 5.53.0
- vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
optionalDependencies:
typescript: 5.9.3
- '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)))(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))':
+ '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)))(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))':
+ dependencies:
+ '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
+ debug: 4.4.3
+ svelte: 5.53.0
+ vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))':
dependencies:
- '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))
+ '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)))(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
debug: 4.4.3
+ deepmerge: 4.3.1
+ kleur: 4.1.5
+ magic-string: 0.30.21
svelte: 5.53.0
- vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
+ vitefu: 1.1.1(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
transitivePeerDependencies:
- supports-color
- '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))':
+ '@tufjs/canonical-json@2.0.0': {}
+
+ '@tufjs/models@3.0.1':
+ dependencies:
+ '@tufjs/canonical-json': 2.0.0
+ minimatch: 9.0.6
+
+ '@tybys/wasm-util@0.10.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+ '@types/babel__generator': 7.27.0
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.28.0
+
+ '@types/babel__generator@7.27.0':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+
+ '@types/babel__traverse@7.28.0':
dependencies:
- '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)))(svelte@5.53.0)(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))
- debug: 4.4.3
- deepmerge: 4.3.1
- kleur: 4.1.5
- magic-string: 0.30.21
- svelte: 5.53.0
- vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
- vitefu: 1.1.1(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))
- transitivePeerDependencies:
- - supports-color
+ '@babel/types': 7.29.0
- '@tybys/wasm-util@0.10.1':
+ '@types/body-parser@1.19.6':
dependencies:
- tslib: 2.8.1
- optional: true
+ '@types/connect': 3.4.38
+ '@types/node': 20.19.33
+
+ '@types/bonjour@3.5.13':
+ dependencies:
+ '@types/node': 20.19.33
'@types/chai@5.2.3':
dependencies:
'@types/deep-eql': 4.0.2
assertion-error: 2.0.1
+ '@types/connect-history-api-fallback@1.5.4':
+ dependencies:
+ '@types/express-serve-static-core': 4.19.8
+ '@types/node': 20.19.33
+
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 20.19.33
+
'@types/cookie@0.6.0': {}
'@types/deep-eql@4.0.2': {}
+ '@types/eslint-scope@3.7.7':
+ dependencies:
+ '@types/eslint': 9.6.1
+ '@types/estree': 1.0.8
+
+ '@types/eslint@9.6.1':
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+
+ '@types/estree@1.0.6': {}
+
'@types/estree@1.0.8': {}
+ '@types/express-serve-static-core@4.19.8':
+ dependencies:
+ '@types/node': 20.19.33
+ '@types/qs': 6.14.0
+ '@types/range-parser': 1.2.7
+ '@types/send': 1.2.1
+
+ '@types/express@4.17.25':
+ dependencies:
+ '@types/body-parser': 1.19.6
+ '@types/express-serve-static-core': 4.19.8
+ '@types/qs': 6.14.0
+ '@types/serve-static': 1.15.10
+
+ '@types/http-errors@2.0.5': {}
+
+ '@types/http-proxy@1.17.17':
+ dependencies:
+ '@types/node': 20.19.33
+
'@types/jsesc@2.5.1': {}
'@types/json-schema@7.0.15': {}
+ '@types/mime@1.3.5': {}
+
+ '@types/node-forge@1.3.14':
+ dependencies:
+ '@types/node': 20.19.33
+
'@types/node@12.20.55': {}
+ '@types/node@20.19.33':
+ dependencies:
+ undici-types: 6.21.0
+
'@types/node@25.3.0':
dependencies:
undici-types: 7.18.2
'@types/prompts@2.4.9':
dependencies:
- '@types/node': 25.3.0
+ '@types/node': 20.19.33
kleur: 3.0.3
+ '@types/qs@6.14.0': {}
+
+ '@types/range-parser@1.2.7': {}
+
+ '@types/react-dom@19.2.3(@types/react@19.2.14)':
+ dependencies:
+ '@types/react': 19.2.14
+
+ '@types/react@19.2.14':
+ dependencies:
+ csstype: 3.2.3
+
'@types/resolve@1.20.2': {}
+ '@types/retry@0.12.2': {}
+
+ '@types/send@0.17.6':
+ dependencies:
+ '@types/mime': 1.3.5
+ '@types/node': 20.19.33
+
+ '@types/send@1.2.1':
+ dependencies:
+ '@types/node': 20.19.33
+
+ '@types/serve-index@1.9.4':
+ dependencies:
+ '@types/express': 4.17.25
+
+ '@types/serve-static@1.15.10':
+ dependencies:
+ '@types/http-errors': 2.0.5
+ '@types/node': 20.19.33
+ '@types/send': 0.17.6
+
+ '@types/sockjs@0.3.36':
+ dependencies:
+ '@types/node': 20.19.33
+
'@types/trusted-types@2.0.7': {}
+ '@types/ws@8.18.1':
+ dependencies:
+ '@types/node': 20.19.33
+
+ '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.56.1
+ '@typescript-eslint/type-utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.56.1
+ eslint: 9.39.3(jiti@2.6.1)
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.56.1
+ '@typescript-eslint/types': 8.56.1
+ '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.56.1
+ debug: 4.4.3
+ eslint: 9.39.3(jiti@2.6.1)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/project-service@8.56.1(typescript@5.9.3)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3)
@@ -3884,6 +9364,18 @@ snapshots:
dependencies:
typescript: 5.9.3
+ '@typescript-eslint/type-utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.56.1
+ '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ debug: 4.4.3
+ eslint: 9.39.3(jiti@2.6.1)
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/types@8.56.1': {}
'@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)':
@@ -3917,9 +9409,25 @@ snapshots:
'@typescript-eslint/types': 8.56.1
eslint-visitor-keys: 5.0.1
- '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))(vue@3.5.28(typescript@5.9.3))':
+ '@vitejs/plugin-basic-ssl@1.2.0(vite@6.4.1(@types/node@20.19.33)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))':
+ dependencies:
+ vite: 6.4.1(@types/node@20.19.33)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
+
+ '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0)
+ '@rolldown/pluginutils': 1.0.0-beta.27
+ '@types/babel__core': 7.20.5
+ react-refresh: 0.17.0
+ vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(vue@3.5.28(typescript@5.9.3))':
dependencies:
- vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
vue: 3.5.28(typescript@5.9.3)
'@vitest/expect@4.0.18':
@@ -3931,13 +9439,13 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.0.3
- '@vitest/mocker@4.0.18(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))':
+ '@vitest/mocker@4.0.18(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))':
dependencies:
'@vitest/spy': 4.0.18
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
'@vitest/pretty-format@4.0.18':
dependencies:
@@ -4045,12 +9553,125 @@ snapshots:
'@vue/shared@3.5.28': {}
+ '@webassemblyjs/ast@1.14.1':
+ dependencies:
+ '@webassemblyjs/helper-numbers': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2': {}
+
+ '@webassemblyjs/helper-api-error@1.13.2': {}
+
+ '@webassemblyjs/helper-buffer@1.14.1': {}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ dependencies:
+ '@webassemblyjs/floating-point-hex-parser': 1.13.2
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2': {}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/wasm-gen': 1.14.1
+
+ '@webassemblyjs/ieee754@1.13.2':
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+
+ '@webassemblyjs/leb128@1.13.2':
+ dependencies:
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/utf8@1.13.2': {}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/helper-wasm-section': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-opt': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ '@webassemblyjs/wast-printer': 1.14.1
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@xtuc/long': 4.2.2
+
+ '@xtuc/ieee754@1.2.0': {}
+
+ '@xtuc/long@4.2.2': {}
+
+ '@yarnpkg/lockfile@1.1.0': {}
+
+ abbrev@3.0.1: {}
+
+ accepts@1.3.8:
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+
+ acorn-import-phases@1.0.4(acorn@8.16.0):
+ dependencies:
+ acorn: 8.16.0
+
acorn-jsx@5.3.2(acorn@8.16.0):
dependencies:
acorn: 8.16.0
acorn@8.16.0: {}
+ adjust-sourcemap-loader@4.0.0:
+ dependencies:
+ loader-utils: 2.0.4
+ regex-parser: 2.3.1
+
+ agent-base@7.1.4: {}
+
+ ajv-formats@2.1.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
+ ajv-formats@3.0.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
+ ajv-keywords@5.1.0(ajv@8.17.1):
+ dependencies:
+ ajv: 8.17.1
+ fast-deep-equal: 3.1.3
+
ajv@6.14.0:
dependencies:
fast-deep-equal: 3.1.3
@@ -4058,14 +9679,41 @@ snapshots:
json-schema-traverse: 0.4.1
uri-js: 4.4.1
+ ajv@8.17.1:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.0
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
alien-signals@1.0.13: {}
+ angular-eslint@19.8.1(chokidar@4.0.3)(eslint@9.39.3(jiti@2.6.1))(typescript-eslint@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(typescript@5.9.3):
+ dependencies:
+ '@angular-devkit/core': 19.2.21(chokidar@4.0.3)
+ '@angular-devkit/schematics': 19.2.21(chokidar@4.0.3)
+ '@angular-eslint/builder': 19.8.1(chokidar@4.0.3)(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@angular-eslint/eslint-plugin': 19.8.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@angular-eslint/eslint-plugin-template': 19.8.1(@angular-eslint/template-parser@19.8.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.56.1)(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@angular-eslint/schematics': 19.8.1(@angular-eslint/template-parser@19.8.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.56.1)(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@4.0.3)(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@angular-eslint/template-parser': 19.8.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/types': 8.56.1
+ '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.3(jiti@2.6.1)
+ typescript: 5.9.3
+ typescript-eslint: 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ transitivePeerDependencies:
+ - chokidar
+ - supports-color
+
ansi-colors@4.1.3: {}
ansi-escapes@7.3.0:
dependencies:
environment: 1.1.0
+ ansi-html-community@0.0.8: {}
+
ansi-regex@5.0.1: {}
ansi-regex@6.2.2: {}
@@ -4078,6 +9726,11 @@ snapshots:
ansis@4.2.0: {}
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
argparse@1.0.10:
dependencies:
sprintf-js: 1.0.3
@@ -4086,6 +9739,8 @@ snapshots:
aria-query@5.3.2: {}
+ array-flatten@1.1.1: {}
+
array-union@2.1.0: {}
assertion-error@2.0.1: {}
@@ -4096,20 +9751,108 @@ snapshots:
estree-walker: 3.0.3
pathe: 2.0.3
+ autoprefixer@10.4.20(postcss@8.5.2):
+ dependencies:
+ browserslist: 4.28.1
+ caniuse-lite: 1.0.30001770
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.1.1
+ postcss: 8.5.2
+ postcss-value-parser: 4.2.0
+
axobject-query@4.1.0: {}
+ babel-loader@9.2.1(@babel/core@7.26.10)(webpack@5.105.0(esbuild@0.25.4)):
+ dependencies:
+ '@babel/core': 7.26.10
+ find-cache-dir: 4.0.0
+ schema-utils: 4.3.3
+ webpack: 5.105.0(esbuild@0.25.4)
+
+ babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.26.10):
+ dependencies:
+ '@babel/compat-data': 7.29.0
+ '@babel/core': 7.26.10
+ '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.26.10)
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10):
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.26.10)
+ core-js-compat: 3.48.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.26.10):
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.26.10)
+ transitivePeerDependencies:
+ - supports-color
+
balanced-match@1.0.2: {}
balanced-match@4.0.3: {}
+ base64-js@1.5.1: {}
+
baseline-browser-mapping@2.10.0: {}
+ batch@0.6.1: {}
+
+ beasties@0.3.2:
+ dependencies:
+ css-select: 5.2.2
+ css-what: 6.2.2
+ dom-serializer: 2.0.0
+ domhandler: 5.0.3
+ htmlparser2: 10.1.0
+ picocolors: 1.1.1
+ postcss: 8.5.6
+ postcss-media-query-parser: 0.2.3
+
better-path-resolve@1.0.0:
dependencies:
is-windows: 1.0.2
+ big.js@5.2.2: {}
+
+ binary-extensions@2.3.0: {}
+
birpc@4.0.0: {}
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ body-parser@1.20.4:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.1
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.14.2
+ raw-body: 2.5.3
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ bonjour-service@1.3.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ multicast-dns: 7.2.5
+
boolbase@1.0.0: {}
brace-expansion@1.1.12:
@@ -4137,8 +9880,46 @@ snapshots:
node-releases: 2.0.27
update-browserslist-db: 1.2.3(browserslist@4.28.1)
+ buffer-from@1.1.2: {}
+
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ bundle-name@4.1.0:
+ dependencies:
+ run-applescript: 7.1.0
+
+ bytes@3.1.2: {}
+
cac@6.7.14: {}
+ cacache@19.0.1:
+ dependencies:
+ '@npmcli/fs': 4.0.0
+ fs-minipass: 3.0.3
+ glob: 10.5.0
+ lru-cache: 10.4.3
+ minipass: 7.1.3
+ minipass-collect: 2.0.1
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ p-map: 7.0.4
+ ssri: 12.0.0
+ tar: 7.5.9
+ unique-filename: 4.0.0
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
callsites@3.1.0: {}
caniuse-lite@1.0.30001770: {}
@@ -4154,16 +9935,40 @@ snapshots:
chardet@2.1.1: {}
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
chokidar@4.0.3:
dependencies:
readdirp: 4.1.2
+ chownr@2.0.0: {}
+
+ chownr@3.0.0: {}
+
+ chrome-trace-event@1.0.4: {}
+
ci-info@3.9.0: {}
+ cli-cursor@3.1.0:
+ dependencies:
+ restore-cursor: 3.1.0
+
cli-cursor@5.0.0:
dependencies:
restore-cursor: 5.1.0
+ cli-spinners@2.9.2: {}
+
cli-spinners@3.4.0: {}
cli-truncate@4.0.0:
@@ -4171,6 +9976,22 @@ snapshots:
slice-ansi: 5.0.0
string-width: 7.2.0
+ cli-width@4.1.0: {}
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ clone-deep@4.0.1:
+ dependencies:
+ is-plain-object: 2.0.4
+ kind-of: 6.0.3
+ shallow-clone: 3.0.1
+
+ clone@1.0.4: {}
+
clsx@2.1.1: {}
color-convert@2.0.1:
@@ -4185,13 +10006,76 @@ snapshots:
commander@14.0.3: {}
+ commander@2.20.3: {}
+
+ common-path-prefix@3.0.0: {}
+
commondir@1.0.1: {}
+ compressible@2.0.18:
+ dependencies:
+ mime-db: 1.54.0
+
+ compression@1.8.1:
+ dependencies:
+ bytes: 3.1.2
+ compressible: 2.0.18
+ debug: 2.6.9
+ negotiator: 0.6.4
+ on-headers: 1.1.0
+ safe-buffer: 5.2.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
concat-map@0.0.1: {}
- convert-source-map@2.0.0: {}
+ connect-history-api-fallback@2.0.0: {}
+
+ content-disposition@0.5.4:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ content-type@1.0.5: {}
+
+ convert-source-map@1.9.0: {}
+
+ convert-source-map@2.0.0: {}
+
+ cookie-signature@1.0.7: {}
+
+ cookie@0.6.0: {}
+
+ cookie@0.7.2: {}
+
+ copy-anything@2.0.6:
+ dependencies:
+ is-what: 3.14.1
+
+ copy-webpack-plugin@12.0.2(webpack@5.105.0(esbuild@0.25.4)):
+ dependencies:
+ fast-glob: 3.3.3
+ glob-parent: 6.0.2
+ globby: 14.1.0
+ normalize-path: 3.0.0
+ schema-utils: 4.3.3
+ serialize-javascript: 6.0.2
+ webpack: 5.105.0(esbuild@0.25.4)
+
+ core-js-compat@3.48.0:
+ dependencies:
+ browserslist: 4.28.1
+
+ core-util-is@1.0.3: {}
- cookie@0.6.0: {}
+ cosmiconfig@9.0.0(typescript@5.6.3):
+ dependencies:
+ env-paths: 2.2.1
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ parse-json: 5.2.0
+ optionalDependencies:
+ typescript: 5.6.3
cross-env@10.1.0:
dependencies:
@@ -4204,12 +10088,39 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
+ css-loader@7.1.2(webpack@5.105.0(esbuild@0.25.4)):
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.5.6)
+ postcss: 8.5.6
+ postcss-modules-extract-imports: 3.1.0(postcss@8.5.6)
+ postcss-modules-local-by-default: 4.2.0(postcss@8.5.6)
+ postcss-modules-scope: 3.2.1(postcss@8.5.6)
+ postcss-modules-values: 4.0.0(postcss@8.5.6)
+ postcss-value-parser: 4.2.0
+ semver: 7.7.4
+ optionalDependencies:
+ webpack: 5.105.0(esbuild@0.25.4)
+
+ css-select@5.2.2:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.2.2
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-what@6.2.2: {}
+
cssesc@3.0.0: {}
csstype@3.2.3: {}
de-indent@1.0.2: {}
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
debug@4.4.3:
dependencies:
ms: 2.1.3
@@ -4218,37 +10129,140 @@ snapshots:
deepmerge@4.3.1: {}
+ default-browser-id@5.0.1: {}
+
+ default-browser@5.5.0:
+ dependencies:
+ bundle-name: 4.1.0
+ default-browser-id: 5.0.1
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ define-lazy-prop@3.0.0: {}
+
defu@6.1.4: {}
+ depd@1.1.2: {}
+
+ depd@2.0.0: {}
+
+ destroy@1.2.0: {}
+
detect-indent@6.1.0: {}
+ detect-libc@2.1.2:
+ optional: true
+
+ detect-node@2.1.0: {}
+
devalue@5.6.3: {}
dir-glob@3.0.1:
dependencies:
path-type: 4.0.0
+ dns-packet@5.6.1:
+ dependencies:
+ '@leichtgewicht/ip-codec': 2.0.5
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
dts-resolver@2.1.3(oxc-resolver@11.17.1):
optionalDependencies:
oxc-resolver: 11.17.1
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ eastasianwidth@0.2.0: {}
+
+ ee-first@1.1.1: {}
+
electron-to-chromium@1.5.302: {}
emoji-regex@10.6.0: {}
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ emojis-list@3.0.0: {}
+
empathic@2.0.0: {}
+ encodeurl@2.0.0: {}
+
+ encoding@0.1.13:
+ dependencies:
+ iconv-lite: 0.6.3
+ optional: true
+
+ enhanced-resolve@5.19.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.0
+
enquirer@2.4.1:
dependencies:
ansi-colors: 4.1.3
strip-ansi: 6.0.1
+ entities@4.5.0: {}
+
+ entities@6.0.1: {}
+
entities@7.0.1: {}
+ env-paths@2.2.1: {}
+
environment@1.1.0: {}
+ err-code@2.0.3: {}
+
+ errno@0.1.8:
+ dependencies:
+ prr: 1.0.1
+ optional: true
+
+ error-ex@1.3.4:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
es-module-lexer@1.7.0: {}
+ es-module-lexer@2.0.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ esbuild-wasm@0.25.4: {}
+
esbuild@0.25.12:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.12
@@ -4278,8 +10292,38 @@ snapshots:
'@esbuild/win32-ia32': 0.25.12
'@esbuild/win32-x64': 0.25.12
+ esbuild@0.25.4:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.4
+ '@esbuild/android-arm': 0.25.4
+ '@esbuild/android-arm64': 0.25.4
+ '@esbuild/android-x64': 0.25.4
+ '@esbuild/darwin-arm64': 0.25.4
+ '@esbuild/darwin-x64': 0.25.4
+ '@esbuild/freebsd-arm64': 0.25.4
+ '@esbuild/freebsd-x64': 0.25.4
+ '@esbuild/linux-arm': 0.25.4
+ '@esbuild/linux-arm64': 0.25.4
+ '@esbuild/linux-ia32': 0.25.4
+ '@esbuild/linux-loong64': 0.25.4
+ '@esbuild/linux-mips64el': 0.25.4
+ '@esbuild/linux-ppc64': 0.25.4
+ '@esbuild/linux-riscv64': 0.25.4
+ '@esbuild/linux-s390x': 0.25.4
+ '@esbuild/linux-x64': 0.25.4
+ '@esbuild/netbsd-arm64': 0.25.4
+ '@esbuild/netbsd-x64': 0.25.4
+ '@esbuild/openbsd-arm64': 0.25.4
+ '@esbuild/openbsd-x64': 0.25.4
+ '@esbuild/sunos-x64': 0.25.4
+ '@esbuild/win32-arm64': 0.25.4
+ '@esbuild/win32-ia32': 0.25.4
+ '@esbuild/win32-x64': 0.25.4
+
escalade@3.2.0: {}
+ escape-html@1.0.3: {}
+
escape-string-regexp@4.0.0: {}
eslint-plugin-react-hooks@7.0.1(eslint@9.39.3(jiti@2.6.1)):
@@ -4316,6 +10360,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ eslint-scope@5.1.1:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+
eslint-scope@7.2.2:
dependencies:
esrecurse: 4.3.0
@@ -4401,6 +10450,8 @@ snapshots:
dependencies:
estraverse: 5.3.0
+ estraverse@4.3.0: {}
+
estraverse@5.3.0: {}
estree-walker@2.0.2: {}
@@ -4411,8 +10462,14 @@ snapshots:
esutils@2.0.3: {}
+ etag@1.8.1: {}
+
+ eventemitter3@4.0.7: {}
+
eventemitter3@5.0.4: {}
+ events@3.3.0: {}
+
execa@8.0.1:
dependencies:
cross-spawn: 7.0.6
@@ -4427,6 +10484,44 @@ snapshots:
expect-type@1.3.0: {}
+ exponential-backoff@3.1.3: {}
+
+ express@4.22.1:
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.4
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.7.2
+ cookie-signature: 1.0.7
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.3.2
+ fresh: 0.5.2
+ http-errors: 2.0.1
+ merge-descriptors: 1.0.3
+ methods: 1.1.2
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.12
+ proxy-addr: 2.0.7
+ qs: 6.14.2
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.19.2
+ serve-static: 1.16.3
+ setprototypeof: 1.2.0
+ statuses: 2.0.2
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
extendable-error@0.1.7: {}
fast-deep-equal@3.1.3: {}
@@ -4443,10 +10538,16 @@ snapshots:
fast-levenshtein@2.0.6: {}
+ fast-uri@3.1.0: {}
+
fastq@1.20.1:
dependencies:
reusify: 1.1.0
+ faye-websocket@0.11.4:
+ dependencies:
+ websocket-driver: 0.7.4
+
fd-package-json@2.0.0:
dependencies:
walk-up-path: 4.0.0
@@ -4463,6 +10564,23 @@ snapshots:
dependencies:
to-regex-range: 5.0.1
+ finalhandler@1.3.2:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.2
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ find-cache-dir@4.0.0:
+ dependencies:
+ common-path-prefix: 3.0.0
+ pkg-dir: 7.0.0
+
find-up@4.1.0:
dependencies:
locate-path: 5.0.0
@@ -4473,17 +10591,39 @@ snapshots:
locate-path: 6.0.0
path-exists: 4.0.0
+ find-up@6.3.0:
+ dependencies:
+ locate-path: 7.2.0
+ path-exists: 5.0.0
+
flat-cache@4.0.1:
dependencies:
flatted: 3.3.3
keyv: 4.5.4
+ flat@5.0.2: {}
+
flatted@3.3.3: {}
+ follow-redirects@1.15.11(debug@4.4.3):
+ optionalDependencies:
+ debug: 4.4.3
+
+ foreground-child@3.3.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
+
formatly@0.3.0:
dependencies:
fd-package-json: 2.0.0
+ forwarded@0.2.0: {}
+
+ fraction.js@4.3.7: {}
+
+ fresh@0.5.2: {}
+
fs-extra@7.0.1:
dependencies:
graceful-fs: 4.2.11
@@ -4496,6 +10636,14 @@ snapshots:
jsonfile: 4.0.0
universalify: 0.1.2
+ fs-minipass@2.1.0:
+ dependencies:
+ minipass: 3.3.6
+
+ fs-minipass@3.0.3:
+ dependencies:
+ minipass: 7.1.3
+
fs.realpath@1.0.0: {}
fsevents@2.3.3:
@@ -4505,8 +10653,28 @@ snapshots:
gensync@1.0.0-beta.2: {}
+ get-caller-file@2.0.5: {}
+
get-east-asian-width@1.5.0: {}
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
get-stream@8.0.1: {}
get-tsconfig@4.13.6:
@@ -4521,6 +10689,21 @@ snapshots:
dependencies:
is-glob: 4.0.3
+ glob-to-regex.js@1.2.0(tslib@2.8.1):
+ dependencies:
+ tslib: 2.8.1
+
+ glob-to-regexp@0.4.1: {}
+
+ glob@10.5.0:
+ dependencies:
+ foreground-child: 3.3.1
+ jackspeak: 3.4.3
+ minimatch: 9.0.6
+ minipass: 7.1.3
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
+
glob@13.0.6:
dependencies:
minimatch: 10.2.2
@@ -4550,10 +10733,25 @@ snapshots:
merge2: 1.4.1
slash: 3.0.0
+ globby@14.1.0:
+ dependencies:
+ '@sindresorhus/merge-streams': 2.3.0
+ fast-glob: 3.3.3
+ ignore: 7.0.5
+ path-type: 6.0.0
+ slash: 5.1.0
+ unicorn-magic: 0.3.0
+
+ gopd@1.2.0: {}
+
graceful-fs@4.2.11: {}
+ handle-thing@2.0.1: {}
+
has-flag@4.0.0: {}
+ has-symbols@1.1.0: {}
+
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
@@ -4568,18 +10766,130 @@ snapshots:
hookable@6.0.1: {}
+ hosted-git-info@8.1.0:
+ dependencies:
+ lru-cache: 10.4.3
+
+ hpack.js@2.1.6:
+ dependencies:
+ inherits: 2.0.4
+ obuf: 1.1.2
+ readable-stream: 2.3.8
+ wbuf: 1.7.3
+
+ htmlparser2@10.1.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ entities: 7.0.1
+
+ http-cache-semantics@4.2.0: {}
+
+ http-deceiver@1.2.7: {}
+
+ http-errors@1.8.1:
+ dependencies:
+ depd: 1.1.2
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 1.5.0
+ toidentifier: 1.0.1
+
+ http-errors@2.0.1:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.2
+ toidentifier: 1.0.1
+
+ http-parser-js@0.5.10: {}
+
+ http-proxy-agent@7.0.2:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ http-proxy-middleware@2.0.9(@types/express@4.17.25):
+ dependencies:
+ '@types/http-proxy': 1.17.17
+ http-proxy: 1.18.1(debug@4.4.3)
+ is-glob: 4.0.3
+ is-plain-obj: 3.0.0
+ micromatch: 4.0.8
+ optionalDependencies:
+ '@types/express': 4.17.25
+ transitivePeerDependencies:
+ - debug
+
+ http-proxy-middleware@3.0.5:
+ dependencies:
+ '@types/http-proxy': 1.17.17
+ debug: 4.4.3
+ http-proxy: 1.18.1(debug@4.4.3)
+ is-glob: 4.0.3
+ is-plain-object: 5.0.0
+ micromatch: 4.0.8
+ transitivePeerDependencies:
+ - supports-color
+
+ http-proxy@1.18.1(debug@4.4.3):
+ dependencies:
+ eventemitter3: 4.0.7
+ follow-redirects: 1.15.11(debug@4.4.3)
+ requires-port: 1.0.0
+ transitivePeerDependencies:
+ - debug
+
+ https-proxy-agent@7.0.6:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
human-id@4.1.3: {}
human-signals@5.0.0: {}
husky@9.1.7: {}
+ hyperdyperid@1.2.0: {}
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
iconv-lite@0.7.2:
dependencies:
safer-buffer: 2.1.2
+ icss-utils@5.1.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ ieee754@1.2.1: {}
+
+ ignore-walk@7.0.0:
+ dependencies:
+ minimatch: 9.0.6
+
ignore@5.3.2: {}
+ ignore@7.0.5: {}
+
+ image-size@0.5.5:
+ optional: true
+
+ immutable@5.1.4: {}
+
import-fresh@3.3.1:
dependencies:
parent-module: 1.0.1
@@ -4596,12 +10906,30 @@ snapshots:
inherits@2.0.4: {}
+ ini@5.0.0: {}
+
+ ip-address@10.1.0: {}
+
+ ipaddr.js@1.9.1: {}
+
+ ipaddr.js@2.3.0: {}
+
+ is-arrayish@0.2.1: {}
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
is-core-module@2.16.1:
dependencies:
hasown: 2.0.2
+ is-docker@3.0.0: {}
+
is-extglob@2.1.1: {}
+ is-fullwidth-code-point@3.0.0: {}
+
is-fullwidth-code-point@4.0.0: {}
is-fullwidth-code-point@5.1.0:
@@ -4612,12 +10940,28 @@ snapshots:
dependencies:
is-extglob: 2.1.1
+ is-inside-container@1.0.0:
+ dependencies:
+ is-docker: 3.0.0
+
+ is-interactive@1.0.0: {}
+
is-interactive@2.0.0: {}
is-module@1.0.0: {}
+ is-network-error@1.3.0: {}
+
is-number@7.0.0: {}
+ is-plain-obj@3.0.0: {}
+
+ is-plain-object@2.0.4:
+ dependencies:
+ isobject: 3.0.1
+
+ is-plain-object@5.0.0: {}
+
is-reference@1.2.1:
dependencies:
'@types/estree': 1.0.8
@@ -4632,12 +10976,52 @@ snapshots:
dependencies:
better-path-resolve: 1.0.0
+ is-unicode-supported@0.1.0: {}
+
is-unicode-supported@2.1.0: {}
+ is-what@3.14.1: {}
+
is-windows@1.0.2: {}
+ is-wsl@3.1.1:
+ dependencies:
+ is-inside-container: 1.0.0
+
+ isarray@1.0.0: {}
+
isexe@2.0.0: {}
+ isexe@3.1.5: {}
+
+ isobject@3.0.1: {}
+
+ istanbul-lib-coverage@3.2.2: {}
+
+ istanbul-lib-instrument@6.0.3:
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/parser': 7.29.0
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 7.7.4
+ transitivePeerDependencies:
+ - supports-color
+
+ jackspeak@3.4.3:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ jest-worker@27.5.1:
+ dependencies:
+ '@types/node': 20.19.33
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ jiti@1.21.7: {}
+
jiti@2.6.1: {}
js-tokens@4.0.0: {}
@@ -4655,20 +11039,36 @@ snapshots:
json-buffer@3.0.1: {}
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-parse-even-better-errors@4.0.0: {}
+
json-schema-traverse@0.4.1: {}
+ json-schema-traverse@1.0.0: {}
+
json-stable-stringify-without-jsonify@1.0.1: {}
json5@2.2.3: {}
+ jsonc-parser@3.3.1: {}
+
jsonfile@4.0.0:
optionalDependencies:
graceful-fs: 4.2.11
+ jsonparse@1.3.1: {}
+
+ karma-source-map-support@1.4.0:
+ dependencies:
+ source-map-support: 0.5.21
+
keyv@4.5.4:
dependencies:
json-buffer: 3.0.1
+ kind-of@6.0.3: {}
+
kleur@3.0.3: {}
kleur@4.1.5: {}
@@ -4690,13 +11090,46 @@ snapshots:
typescript: 5.9.3
zod: 4.3.6
+ launch-editor@2.13.0:
+ dependencies:
+ picocolors: 1.1.1
+ shell-quote: 1.8.3
+
+ less-loader@12.2.0(less@4.2.2)(webpack@5.105.0(esbuild@0.25.4)):
+ dependencies:
+ less: 4.2.2
+ optionalDependencies:
+ webpack: 5.105.0(esbuild@0.25.4)
+
+ less@4.2.2:
+ dependencies:
+ copy-anything: 2.0.6
+ parse-node-version: 1.0.1
+ tslib: 2.8.1
+ optionalDependencies:
+ errno: 0.1.8
+ graceful-fs: 4.2.11
+ image-size: 0.5.5
+ make-dir: 2.1.0
+ mime: 1.6.0
+ needle: 3.3.1
+ source-map: 0.6.1
+
levn@0.4.1:
dependencies:
prelude-ls: 1.2.1
type-check: 0.4.0
+ license-webpack-plugin@4.0.2(webpack@5.105.0(esbuild@0.25.4)):
+ dependencies:
+ webpack-sources: 3.3.4
+ optionalDependencies:
+ webpack: 5.105.0(esbuild@0.25.4)
+
lilconfig@3.1.3: {}
+ lines-and-columns@1.2.4: {}
+
lint-staged@15.5.2:
dependencies:
chalk: 5.6.2
@@ -4712,6 +11145,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ listr2@8.2.5:
+ dependencies:
+ cli-truncate: 4.0.0
+ colorette: 2.0.20
+ eventemitter3: 5.0.4
+ log-update: 6.1.0
+ rfdc: 1.4.1
+ wrap-ansi: 9.0.2
+
listr2@8.3.3:
dependencies:
cli-truncate: 4.0.0
@@ -4721,6 +11163,32 @@ snapshots:
rfdc: 1.4.1
wrap-ansi: 9.0.2
+ lmdb@3.2.6:
+ dependencies:
+ msgpackr: 1.11.8
+ node-addon-api: 6.1.0
+ node-gyp-build-optional-packages: 5.2.2
+ ordered-binary: 1.6.1
+ weak-lru-cache: 1.2.2
+ optionalDependencies:
+ '@lmdb/lmdb-darwin-arm64': 3.2.6
+ '@lmdb/lmdb-darwin-x64': 3.2.6
+ '@lmdb/lmdb-linux-arm': 3.2.6
+ '@lmdb/lmdb-linux-arm64': 3.2.6
+ '@lmdb/lmdb-linux-x64': 3.2.6
+ '@lmdb/lmdb-win32-x64': 3.2.6
+ optional: true
+
+ loader-runner@4.3.1: {}
+
+ loader-utils@2.0.4:
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 2.2.3
+
+ loader-utils@3.3.1: {}
+
locate-character@3.0.0: {}
locate-path@5.0.0:
@@ -4731,12 +11199,23 @@ snapshots:
dependencies:
p-locate: 5.0.0
+ locate-path@7.2.0:
+ dependencies:
+ p-locate: 6.0.0
+
+ lodash.debounce@4.0.8: {}
+
lodash.merge@4.6.2: {}
lodash.startcase@4.4.0: {}
lodash@4.17.23: {}
+ log-symbols@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
log-symbols@7.0.1:
dependencies:
is-unicode-supported: 2.1.0
@@ -4750,29 +11229,102 @@ snapshots:
strip-ansi: 7.1.2
wrap-ansi: 9.0.2
+ lru-cache@10.4.3: {}
+
lru-cache@11.2.6: {}
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
+ magic-string@0.30.17:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
magic-string@0.30.21:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
+ make-dir@2.1.0:
+ dependencies:
+ pify: 4.0.1
+ semver: 5.7.2
+ optional: true
+
+ make-fetch-happen@14.0.3:
+ dependencies:
+ '@npmcli/agent': 3.0.0
+ cacache: 19.0.1
+ http-cache-semantics: 4.2.0
+ minipass: 7.1.3
+ minipass-fetch: 4.0.1
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ negotiator: 1.0.0
+ proc-log: 5.0.0
+ promise-retry: 2.0.1
+ ssri: 12.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ math-intrinsics@1.1.0: {}
+
+ media-typer@0.3.0: {}
+
+ memfs@4.56.10(tslib@2.8.1):
+ dependencies:
+ '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-to-fsa': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1)
+ '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1)
+ '@jsonjoy.com/util': 1.9.0(tslib@2.8.1)
+ glob-to-regex.js: 1.2.0(tslib@2.8.1)
+ thingies: 2.5.0(tslib@2.8.1)
+ tree-dump: 1.1.0(tslib@2.8.1)
+ tslib: 2.8.1
+
+ merge-descriptors@1.0.3: {}
+
merge-stream@2.0.0: {}
merge2@1.4.1: {}
+ methods@1.1.2: {}
+
micromatch@4.0.8:
dependencies:
braces: 3.0.3
picomatch: 2.3.1
+ mime-db@1.52.0: {}
+
+ mime-db@1.54.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime@1.6.0: {}
+
+ mimic-fn@2.1.0: {}
+
mimic-fn@4.0.0: {}
mimic-function@5.0.1: {}
+ mini-css-extract-plugin@2.9.2(webpack@5.105.0(esbuild@0.25.4)):
+ dependencies:
+ schema-utils: 4.3.3
+ tapable: 2.3.0
+ webpack: 5.105.0(esbuild@0.25.4)
+
+ minimalistic-assert@1.0.1: {}
+
minimatch@10.2.2:
dependencies:
brace-expansion: 5.0.2
@@ -4791,22 +11343,182 @@ snapshots:
minimist@1.2.8: {}
+ minipass-collect@2.0.1:
+ dependencies:
+ minipass: 7.1.3
+
+ minipass-fetch@4.0.1:
+ dependencies:
+ minipass: 7.1.3
+ minipass-sized: 1.0.3
+ minizlib: 3.1.0
+ optionalDependencies:
+ encoding: 0.1.13
+
+ minipass-flush@1.0.5:
+ dependencies:
+ minipass: 3.3.6
+
+ minipass-pipeline@1.2.4:
+ dependencies:
+ minipass: 3.3.6
+
+ minipass-sized@1.0.3:
+ dependencies:
+ minipass: 3.3.6
+
+ minipass@3.3.6:
+ dependencies:
+ yallist: 4.0.0
+
+ minipass@5.0.0: {}
+
minipass@7.1.3: {}
+ minizlib@2.1.2:
+ dependencies:
+ minipass: 3.3.6
+ yallist: 4.0.0
+
+ minizlib@3.1.0:
+ dependencies:
+ minipass: 7.1.3
+
+ mkdirp@1.0.4: {}
+
mri@1.2.0: {}
mrmime@2.0.1: {}
+ ms@2.0.0: {}
+
ms@2.1.3: {}
+ msgpackr-extract@3.0.3:
+ dependencies:
+ node-gyp-build-optional-packages: 5.2.2
+ optionalDependencies:
+ '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3
+ optional: true
+
+ msgpackr@1.11.8:
+ optionalDependencies:
+ msgpackr-extract: 3.0.3
+ optional: true
+
muggle-string@0.4.1: {}
+ multicast-dns@7.2.5:
+ dependencies:
+ dns-packet: 5.6.1
+ thunky: 1.1.0
+
+ mute-stream@1.0.0: {}
+
+ mute-stream@2.0.0: {}
+
nanoid@3.3.11: {}
natural-compare@1.4.0: {}
+ needle@3.3.1:
+ dependencies:
+ iconv-lite: 0.6.3
+ sax: 1.4.4
+ optional: true
+
+ negotiator@0.6.3: {}
+
+ negotiator@0.6.4: {}
+
+ negotiator@1.0.0: {}
+
+ neo-async@2.6.2: {}
+
+ node-addon-api@6.1.0:
+ optional: true
+
+ node-addon-api@7.1.1:
+ optional: true
+
+ node-forge@1.3.3: {}
+
+ node-gyp-build-optional-packages@5.2.2:
+ dependencies:
+ detect-libc: 2.1.2
+ optional: true
+
+ node-gyp@11.5.0:
+ dependencies:
+ env-paths: 2.2.1
+ exponential-backoff: 3.1.3
+ graceful-fs: 4.2.11
+ make-fetch-happen: 14.0.3
+ nopt: 8.1.0
+ proc-log: 5.0.0
+ semver: 7.7.4
+ tar: 7.5.9
+ tinyglobby: 0.2.15
+ which: 5.0.0
+ transitivePeerDependencies:
+ - supports-color
+
node-releases@2.0.27: {}
+ nopt@8.1.0:
+ dependencies:
+ abbrev: 3.0.1
+
+ normalize-path@3.0.0: {}
+
+ normalize-range@0.1.2: {}
+
+ npm-bundled@4.0.0:
+ dependencies:
+ npm-normalize-package-bin: 4.0.0
+
+ npm-install-checks@7.1.2:
+ dependencies:
+ semver: 7.7.4
+
+ npm-normalize-package-bin@4.0.0: {}
+
+ npm-package-arg@12.0.2:
+ dependencies:
+ hosted-git-info: 8.1.0
+ proc-log: 5.0.0
+ semver: 7.7.4
+ validate-npm-package-name: 6.0.2
+
+ npm-packlist@9.0.0:
+ dependencies:
+ ignore-walk: 7.0.0
+
+ npm-pick-manifest@10.0.0:
+ dependencies:
+ npm-install-checks: 7.1.2
+ npm-normalize-package-bin: 4.0.0
+ npm-package-arg: 12.0.2
+ semver: 7.7.4
+
+ npm-registry-fetch@18.0.2:
+ dependencies:
+ '@npmcli/redact': 3.2.2
+ jsonparse: 1.3.1
+ make-fetch-happen: 14.0.3
+ minipass: 7.1.3
+ minipass-fetch: 4.0.1
+ minizlib: 3.1.0
+ npm-package-arg: 12.0.2
+ proc-log: 5.0.0
+ transitivePeerDependencies:
+ - supports-color
+
npm-run-path@5.3.0:
dependencies:
path-key: 4.0.0
@@ -4815,12 +11527,26 @@ snapshots:
dependencies:
boolbase: 1.0.0
+ object-inspect@1.13.4: {}
+
+ obuf@1.1.2: {}
+
obug@2.1.1: {}
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ on-headers@1.1.0: {}
+
once@1.4.0:
dependencies:
wrappy: 1.0.2
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
onetime@6.0.0:
dependencies:
mimic-fn: 4.0.0
@@ -4829,6 +11555,13 @@ snapshots:
dependencies:
mimic-function: 5.0.1
+ open@10.1.0:
+ dependencies:
+ default-browser: 5.5.0
+ define-lazy-prop: 3.0.0
+ is-inside-container: 1.0.0
+ is-wsl: 3.1.1
+
optionator@0.9.4:
dependencies:
deep-is: 0.1.4
@@ -4838,6 +11571,18 @@ snapshots:
type-check: 0.4.0
word-wrap: 1.2.5
+ ora@5.4.1:
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.2
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+
ora@9.3.0:
dependencies:
chalk: 5.6.2
@@ -4849,6 +11594,9 @@ snapshots:
stdin-discarder: 0.3.1
string-width: 8.2.0
+ ordered-binary@1.6.1:
+ optional: true
+
outdent@0.5.0: {}
oxc-resolver@11.17.1:
@@ -4908,6 +11656,10 @@ snapshots:
dependencies:
yocto-queue: 0.1.0
+ p-limit@4.0.0:
+ dependencies:
+ yocto-queue: 1.2.2
+
p-locate@4.1.0:
dependencies:
p-limit: 2.3.0
@@ -4916,8 +11668,20 @@ snapshots:
dependencies:
p-limit: 3.1.0
+ p-locate@6.0.0:
+ dependencies:
+ p-limit: 4.0.0
+
p-map@2.1.0: {}
+ p-map@7.0.4: {}
+
+ p-retry@6.2.1:
+ dependencies:
+ '@types/retry': 0.12.2
+ is-network-error: 1.3.0
+ retry: 0.13.1
+
p-try@2.2.0: {}
package-json-from-dist@1.0.1: {}
@@ -4926,44 +11690,159 @@ snapshots:
dependencies:
quansync: 0.2.11
+ pacote@20.0.0:
+ dependencies:
+ '@npmcli/git': 6.0.3
+ '@npmcli/installed-package-contents': 3.0.0
+ '@npmcli/package-json': 6.2.0
+ '@npmcli/promise-spawn': 8.0.3
+ '@npmcli/run-script': 9.1.0
+ cacache: 19.0.1
+ fs-minipass: 3.0.3
+ minipass: 7.1.3
+ npm-package-arg: 12.0.2
+ npm-packlist: 9.0.0
+ npm-pick-manifest: 10.0.0
+ npm-registry-fetch: 18.0.2
+ proc-log: 5.0.0
+ promise-retry: 2.0.1
+ sigstore: 3.1.0
+ ssri: 12.0.0
+ tar: 6.2.1
+ transitivePeerDependencies:
+ - supports-color
+
parent-module@1.0.1:
dependencies:
callsites: 3.1.0
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ error-ex: 1.3.4
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ parse-node-version@1.0.1: {}
+
+ parse5-html-rewriting-stream@7.0.0:
+ dependencies:
+ entities: 4.5.0
+ parse5: 7.3.0
+ parse5-sax-parser: 7.0.0
+
+ parse5-sax-parser@7.0.0:
+ dependencies:
+ parse5: 7.3.0
+
+ parse5@7.3.0:
+ dependencies:
+ entities: 6.0.1
+
+ parseurl@1.3.3: {}
+
path-browserify@1.0.1: {}
path-exists@4.0.0: {}
+ path-exists@5.0.0: {}
+
path-key@3.1.1: {}
path-key@4.0.0: {}
path-parse@1.0.7: {}
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.3
+
path-scurry@2.0.2:
dependencies:
lru-cache: 11.2.6
minipass: 7.1.3
+ path-to-regexp@0.1.12: {}
+
path-type@4.0.0: {}
+ path-type@6.0.0: {}
+
pathe@2.0.3: {}
picocolors@1.1.1: {}
picomatch@2.3.1: {}
+ picomatch@4.0.2: {}
+
picomatch@4.0.3: {}
pidtree@0.6.0: {}
pify@4.0.1: {}
+ piscina@4.8.0:
+ optionalDependencies:
+ '@napi-rs/nice': 1.1.1
+
+ pkg-dir@7.0.0:
+ dependencies:
+ find-up: 6.3.0
+
+ postcss-loader@8.1.1(postcss@8.5.2)(typescript@5.6.3)(webpack@5.105.0(esbuild@0.25.4)):
+ dependencies:
+ cosmiconfig: 9.0.0(typescript@5.6.3)
+ jiti: 1.21.7
+ postcss: 8.5.2
+ semver: 7.7.4
+ optionalDependencies:
+ webpack: 5.105.0(esbuild@0.25.4)
+ transitivePeerDependencies:
+ - typescript
+
+ postcss-media-query-parser@0.2.3: {}
+
+ postcss-modules-extract-imports@3.1.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-modules-local-by-default@4.2.0(postcss@8.5.6):
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.5.6)
+ postcss: 8.5.6
+ postcss-selector-parser: 7.1.1
+ postcss-value-parser: 4.2.0
+
+ postcss-modules-scope@3.2.1(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 7.1.1
+
+ postcss-modules-values@4.0.0(postcss@8.5.6):
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.5.6)
+ postcss: 8.5.6
+
postcss-selector-parser@6.1.2:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
+ postcss-selector-parser@7.1.1:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.5.2:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
postcss@8.5.6:
dependencies:
nanoid: 3.3.11
@@ -4988,19 +11867,62 @@ snapshots:
prettier@3.8.1: {}
+ proc-log@5.0.0: {}
+
+ process-nextick-args@2.0.1: {}
+
+ promise-retry@2.0.1:
+ dependencies:
+ err-code: 2.0.3
+ retry: 0.12.0
+
prompts@2.4.2:
dependencies:
kleur: 3.0.3
sisteransi: 1.0.5
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
+ prr@1.0.1:
+ optional: true
+
punycode@2.3.1: {}
+ qs@6.14.2:
+ dependencies:
+ side-channel: 1.1.0
+
quansync@0.2.11: {}
quansync@1.0.0: {}
queue-microtask@1.2.3: {}
+ randombytes@2.1.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ range-parser@1.2.1: {}
+
+ raw-body@2.5.3:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.1
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+
+ react-dom@19.2.4(react@19.2.4):
+ dependencies:
+ react: 19.2.4
+ scheduler: 0.27.0
+
+ react-refresh@0.17.0: {}
+
+ react@19.2.4: {}
+
read-yaml-file@1.1.0:
dependencies:
graceful-fs: 4.2.11
@@ -5008,25 +11930,101 @@ snapshots:
pify: 4.0.1
strip-bom: 3.0.0
+ readable-stream@2.3.8:
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
readdirp@4.1.2: {}
+ reflect-metadata@0.2.2: {}
+
+ regenerate-unicode-properties@10.2.2:
+ dependencies:
+ regenerate: 1.4.2
+
+ regenerate@1.4.2: {}
+
+ regenerator-runtime@0.14.1: {}
+
+ regex-parser@2.3.1: {}
+
+ regexpu-core@6.4.0:
+ dependencies:
+ regenerate: 1.4.2
+ regenerate-unicode-properties: 10.2.2
+ regjsgen: 0.8.0
+ regjsparser: 0.13.0
+ unicode-match-property-ecmascript: 2.0.0
+ unicode-match-property-value-ecmascript: 2.2.1
+
+ regjsgen@0.8.0: {}
+
+ regjsparser@0.13.0:
+ dependencies:
+ jsesc: 3.1.0
+
+ require-directory@2.1.1: {}
+
+ require-from-string@2.0.2: {}
+
+ requires-port@1.0.0: {}
+
resolve-from@4.0.0: {}
resolve-from@5.0.0: {}
resolve-pkg-maps@1.0.0: {}
+ resolve-url-loader@5.0.0:
+ dependencies:
+ adjust-sourcemap-loader: 4.0.0
+ convert-source-map: 1.9.0
+ loader-utils: 2.0.4
+ postcss: 8.5.6
+ source-map: 0.6.1
+
+ resolve@1.22.10:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
resolve@1.22.11:
dependencies:
is-core-module: 2.16.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
+ restore-cursor@3.1.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
restore-cursor@5.1.0:
dependencies:
onetime: 7.0.0
signal-exit: 4.1.0
+ retry@0.12.0: {}
+
+ retry@0.13.1: {}
+
reusify@1.1.0: {}
rfdc@1.4.1: {}
@@ -5073,6 +12071,31 @@ snapshots:
'@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.3
'@rolldown/binding-win32-x64-msvc': 1.0.0-rc.3
+ rollup@4.34.8:
+ dependencies:
+ '@types/estree': 1.0.6
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.34.8
+ '@rollup/rollup-android-arm64': 4.34.8
+ '@rollup/rollup-darwin-arm64': 4.34.8
+ '@rollup/rollup-darwin-x64': 4.34.8
+ '@rollup/rollup-freebsd-arm64': 4.34.8
+ '@rollup/rollup-freebsd-x64': 4.34.8
+ '@rollup/rollup-linux-arm-gnueabihf': 4.34.8
+ '@rollup/rollup-linux-arm-musleabihf': 4.34.8
+ '@rollup/rollup-linux-arm64-gnu': 4.34.8
+ '@rollup/rollup-linux-arm64-musl': 4.34.8
+ '@rollup/rollup-linux-loongarch64-gnu': 4.34.8
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8
+ '@rollup/rollup-linux-riscv64-gnu': 4.34.8
+ '@rollup/rollup-linux-s390x-gnu': 4.34.8
+ '@rollup/rollup-linux-x64-gnu': 4.34.8
+ '@rollup/rollup-linux-x64-musl': 4.34.8
+ '@rollup/rollup-win32-arm64-msvc': 4.34.8
+ '@rollup/rollup-win32-ia32-msvc': 4.34.8
+ '@rollup/rollup-win32-x64-msvc': 4.34.8
+ fsevents: 2.3.3
+
rollup@4.58.0:
dependencies:
'@types/estree': 1.0.8
@@ -5104,32 +12127,175 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.58.0
fsevents: 2.3.3
+ run-applescript@7.1.0: {}
+
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
+ rxjs@7.8.1:
+ dependencies:
+ tslib: 2.8.1
+
sade@1.8.1:
dependencies:
mri: 1.2.0
+ safe-buffer@5.1.2: {}
+
+ safe-buffer@5.2.1: {}
+
safer-buffer@2.1.2: {}
+ sass-loader@16.0.5(sass@1.85.0)(webpack@5.105.0(esbuild@0.25.4)):
+ dependencies:
+ neo-async: 2.6.2
+ optionalDependencies:
+ sass: 1.85.0
+ webpack: 5.105.0(esbuild@0.25.4)
+
+ sass@1.85.0:
+ dependencies:
+ chokidar: 4.0.3
+ immutable: 5.1.4
+ source-map-js: 1.2.1
+ optionalDependencies:
+ '@parcel/watcher': 2.5.6
+
+ sax@1.4.4:
+ optional: true
+
+ scheduler@0.27.0: {}
+
+ schema-utils@4.3.3:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ ajv-keywords: 5.1.0(ajv@8.17.1)
+
+ select-hose@2.0.0: {}
+
+ selfsigned@2.4.1:
+ dependencies:
+ '@types/node-forge': 1.3.14
+ node-forge: 1.3.3
+
+ semver@5.7.2:
+ optional: true
+
semver@6.3.1: {}
+ semver@7.7.1: {}
+
+ semver@7.7.2: {}
+
semver@7.7.4: {}
+ send@0.19.2:
+ 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
+ transitivePeerDependencies:
+ - supports-color
+
+ serialize-javascript@6.0.2:
+ dependencies:
+ randombytes: 2.1.0
+
+ serve-index@1.9.2:
+ dependencies:
+ accepts: 1.3.8
+ batch: 0.6.1
+ debug: 2.6.9
+ escape-html: 1.0.3
+ http-errors: 1.8.1
+ mime-types: 2.1.35
+ parseurl: 1.3.3
+ transitivePeerDependencies:
+ - supports-color
+
+ serve-static@1.16.3:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.2
+ transitivePeerDependencies:
+ - supports-color
+
set-cookie-parser@3.0.1: {}
+ setprototypeof@1.2.0: {}
+
+ shallow-clone@3.0.1:
+ dependencies:
+ kind-of: 6.0.3
+
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
shebang-regex@3.0.0: {}
+ shell-quote@1.8.3: {}
+
+ side-channel-list@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
siginfo@2.0.0: {}
+ signal-exit@3.0.7: {}
+
signal-exit@4.1.0: {}
+ sigstore@3.1.0:
+ dependencies:
+ '@sigstore/bundle': 3.1.0
+ '@sigstore/core': 2.0.0
+ '@sigstore/protobuf-specs': 0.4.3
+ '@sigstore/sign': 3.1.0
+ '@sigstore/tuf': 3.1.1
+ '@sigstore/verify': 2.1.1
+ transitivePeerDependencies:
+ - supports-color
+
sirv@3.0.2:
dependencies:
'@polka/url': 1.0.0-next.29
@@ -5140,6 +12306,8 @@ snapshots:
slash@3.0.0: {}
+ slash@5.1.0: {}
+
slice-ansi@5.0.0:
dependencies:
ansi-styles: 6.2.3
@@ -5150,25 +12318,116 @@ snapshots:
ansi-styles: 6.2.3
is-fullwidth-code-point: 5.1.0
+ smart-buffer@4.2.0: {}
+
smol-toml@1.6.0: {}
+ sockjs@0.3.24:
+ dependencies:
+ faye-websocket: 0.11.4
+ uuid: 8.3.2
+ websocket-driver: 0.7.4
+
+ socks-proxy-agent@8.0.5:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ socks: 2.8.7
+ transitivePeerDependencies:
+ - supports-color
+
+ socks@2.8.7:
+ dependencies:
+ ip-address: 10.1.0
+ smart-buffer: 4.2.0
+
source-map-js@1.2.1: {}
+ source-map-loader@5.0.0(webpack@5.105.0(esbuild@0.25.4)):
+ dependencies:
+ iconv-lite: 0.6.3
+ source-map-js: 1.2.1
+ webpack: 5.105.0(esbuild@0.25.4)
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
+ source-map@0.7.4: {}
+
spawndamnit@3.0.1:
dependencies:
cross-spawn: 7.0.6
signal-exit: 4.1.0
+ spdx-correct@3.2.0:
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.23
+
+ spdx-exceptions@2.5.0: {}
+
+ spdx-expression-parse@3.0.1:
+ dependencies:
+ spdx-exceptions: 2.5.0
+ spdx-license-ids: 3.0.23
+
+ spdx-license-ids@3.0.23: {}
+
+ spdy-transport@3.0.0:
+ dependencies:
+ debug: 4.4.3
+ detect-node: 2.1.0
+ hpack.js: 2.1.6
+ obuf: 1.1.2
+ readable-stream: 3.6.2
+ wbuf: 1.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ spdy@4.0.2:
+ dependencies:
+ debug: 4.4.3
+ handle-thing: 2.0.1
+ http-deceiver: 1.2.7
+ select-hose: 2.0.0
+ spdy-transport: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
sprintf-js@1.0.3: {}
+ ssri@12.0.0:
+ dependencies:
+ minipass: 7.1.3
+
stackback@0.0.2: {}
+ statuses@1.5.0: {}
+
+ statuses@2.0.2: {}
+
std-env@3.10.0: {}
stdin-discarder@0.3.1: {}
string-argv@0.3.2: {}
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.2
+
string-width@7.2.0:
dependencies:
emoji-regex: 10.6.0
@@ -5180,6 +12439,14 @@ snapshots:
get-east-asian-width: 1.5.0
strip-ansi: 7.1.2
+ string_decoder@1.1.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
@@ -5200,6 +12467,10 @@ snapshots:
dependencies:
has-flag: 4.0.0
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
supports-preserve-symlinks-flag@1.0.0: {}
svelte-check@4.4.3(picomatch@4.0.3)(svelte@5.53.0)(typescript@5.9.3):
@@ -5233,8 +12504,53 @@ snapshots:
magic-string: 0.30.21
zimmerframe: 1.1.4
+ symbol-observable@4.0.0: {}
+
+ tapable@2.3.0: {}
+
+ tar@6.2.1:
+ dependencies:
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ minipass: 5.0.0
+ minizlib: 2.1.2
+ mkdirp: 1.0.4
+ yallist: 4.0.0
+
+ tar@7.5.9:
+ dependencies:
+ '@isaacs/fs-minipass': 4.0.1
+ chownr: 3.0.0
+ minipass: 7.1.3
+ minizlib: 3.1.0
+ yallist: 5.0.0
+
term-size@2.2.1: {}
+ terser-webpack-plugin@5.3.16(esbuild@0.25.4)(webpack@5.105.0):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ jest-worker: 27.5.1
+ schema-utils: 4.3.3
+ serialize-javascript: 6.0.2
+ terser: 5.39.0
+ webpack: 5.105.0(esbuild@0.25.4)
+ optionalDependencies:
+ esbuild: 0.25.4
+
+ terser@5.39.0:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.16.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ thingies@2.5.0(tslib@2.8.1):
+ dependencies:
+ tslib: 2.8.1
+
+ thunky@1.1.0: {}
+
tinybench@2.9.0: {}
tinyexec@1.0.2: {}
@@ -5250,8 +12566,14 @@ snapshots:
dependencies:
is-number: 7.0.0
+ toidentifier@1.0.1: {}
+
totalist@3.0.1: {}
+ tree-dump@1.1.0(tslib@2.8.1):
+ dependencies:
+ tslib: 2.8.1
+
tree-kill@1.2.2: {}
ts-api-utils@2.4.0(typescript@5.9.3):
@@ -5285,8 +12607,15 @@ snapshots:
- synckit
- vue-tsc
- tslib@2.8.1:
- optional: true
+ tslib@2.8.1: {}
+
+ tuf-js@3.1.0:
+ dependencies:
+ '@tufjs/models': 3.0.1
+ debug: 4.4.3
+ make-fetch-happen: 14.0.3
+ transitivePeerDependencies:
+ - supports-color
turbo-darwin-64@2.8.10:
optional: true
@@ -5321,6 +12650,26 @@ snapshots:
type-fest@0.20.2: {}
+ type-is@1.6.18:
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+
+ typed-assert@1.0.9: {}
+
+ typescript-eslint@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.3(jiti@2.6.1)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.6.3: {}
+
typescript@5.9.3: {}
unconfig-core@7.5.0:
@@ -5328,10 +12677,35 @@ snapshots:
'@quansync/fs': 1.0.0
quansync: 1.0.0
+ undici-types@6.21.0: {}
+
undici-types@7.18.2: {}
+ unicode-canonical-property-names-ecmascript@2.0.1: {}
+
+ unicode-match-property-ecmascript@2.0.0:
+ dependencies:
+ unicode-canonical-property-names-ecmascript: 2.0.1
+ unicode-property-aliases-ecmascript: 2.2.0
+
+ unicode-match-property-value-ecmascript@2.2.1: {}
+
+ unicode-property-aliases-ecmascript@2.2.0: {}
+
+ unicorn-magic@0.3.0: {}
+
+ unique-filename@4.0.0:
+ dependencies:
+ unique-slug: 5.0.0
+
+ unique-slug@5.0.0:
+ dependencies:
+ imurmurhash: 0.1.4
+
universalify@0.1.2: {}
+ unpipe@1.0.0: {}
+
unrun@0.2.27:
dependencies:
rolldown: 1.0.0-rc.3
@@ -5348,7 +12722,37 @@ snapshots:
util-deprecate@1.0.2: {}
- vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2):
+ utils-merge@1.0.1: {}
+
+ uuid@8.3.2: {}
+
+ validate-npm-package-license@3.0.4:
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+
+ validate-npm-package-name@6.0.2: {}
+
+ vary@1.1.2: {}
+
+ vite@6.4.1(@types/node@20.19.33)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2):
+ dependencies:
+ esbuild: 0.25.12
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.6
+ rollup: 4.58.0
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 20.19.33
+ fsevents: 2.3.3
+ jiti: 2.6.1
+ less: 4.2.2
+ sass: 1.85.0
+ terser: 5.39.0
+ yaml: 2.8.2
+
+ vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2):
dependencies:
esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3)
@@ -5360,16 +12764,19 @@ snapshots:
'@types/node': 25.3.0
fsevents: 2.3.3
jiti: 2.6.1
+ less: 4.2.2
+ sass: 1.85.0
+ terser: 5.39.0
yaml: 2.8.2
- vitefu@1.1.1(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)):
+ vitefu@1.1.1(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)):
optionalDependencies:
- vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
- vitest@4.0.18(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2):
+ vitest@4.0.18(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2):
dependencies:
'@vitest/expect': 4.0.18
- '@vitest/mocker': 4.0.18(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))
+ '@vitest/mocker': 4.0.18(vite@6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))
'@vitest/pretty-format': 4.0.18
'@vitest/runner': 4.0.18
'@vitest/snapshot': 4.0.18
@@ -5386,7 +12793,7 @@ snapshots:
tinyexec: 1.0.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
- vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)
+ vite: 6.4.1(@types/node@25.3.0)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 25.3.0
@@ -5448,17 +12855,167 @@ snapshots:
walk-up-path@4.0.0: {}
+ watchpack@2.4.2:
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
+ watchpack@2.5.1:
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
+ wbuf@1.7.3:
+ dependencies:
+ minimalistic-assert: 1.0.1
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ weak-lru-cache@1.2.2:
+ optional: true
+
+ webpack-dev-middleware@7.4.2(tslib@2.8.1)(webpack@5.105.0):
+ dependencies:
+ colorette: 2.0.20
+ memfs: 4.56.10(tslib@2.8.1)
+ mime-types: 2.1.35
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ schema-utils: 4.3.3
+ optionalDependencies:
+ webpack: 5.105.0(esbuild@0.25.4)
+ transitivePeerDependencies:
+ - tslib
+
+ webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.0):
+ dependencies:
+ '@types/bonjour': 3.5.13
+ '@types/connect-history-api-fallback': 1.5.4
+ '@types/express': 4.17.25
+ '@types/express-serve-static-core': 4.19.8
+ '@types/serve-index': 1.9.4
+ '@types/serve-static': 1.15.10
+ '@types/sockjs': 0.3.36
+ '@types/ws': 8.18.1
+ ansi-html-community: 0.0.8
+ bonjour-service: 1.3.0
+ chokidar: 3.6.0
+ colorette: 2.0.20
+ compression: 1.8.1
+ connect-history-api-fallback: 2.0.0
+ express: 4.22.1
+ graceful-fs: 4.2.11
+ http-proxy-middleware: 2.0.9(@types/express@4.17.25)
+ ipaddr.js: 2.3.0
+ launch-editor: 2.13.0
+ open: 10.1.0
+ p-retry: 6.2.1
+ schema-utils: 4.3.3
+ selfsigned: 2.4.1
+ serve-index: 1.9.2
+ sockjs: 0.3.24
+ spdy: 4.0.2
+ webpack-dev-middleware: 7.4.2(tslib@2.8.1)(webpack@5.105.0)
+ ws: 8.19.0
+ optionalDependencies:
+ webpack: 5.105.0(esbuild@0.25.4)
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - supports-color
+ - tslib
+ - utf-8-validate
+
+ webpack-merge@6.0.1:
+ dependencies:
+ clone-deep: 4.0.1
+ flat: 5.0.2
+ wildcard: 2.0.1
+
+ webpack-sources@3.3.4: {}
+
+ webpack-subresource-integrity@5.1.0(webpack@5.105.0(esbuild@0.25.4)):
+ dependencies:
+ typed-assert: 1.0.9
+ webpack: 5.105.0(esbuild@0.25.4)
+
+ webpack@5.105.0(esbuild@0.25.4):
+ dependencies:
+ '@types/eslint-scope': 3.7.7
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.16.0
+ acorn-import-phases: 1.0.4(acorn@8.16.0)
+ browserslist: 4.28.1
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.19.0
+ es-module-lexer: 2.0.0
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+ json-parse-even-better-errors: 2.3.1
+ loader-runner: 4.3.1
+ mime-types: 2.1.35
+ neo-async: 2.6.2
+ schema-utils: 4.3.3
+ tapable: 2.3.0
+ terser-webpack-plugin: 5.3.16(esbuild@0.25.4)(webpack@5.105.0)
+ watchpack: 2.5.1
+ webpack-sources: 3.3.4
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - uglify-js
+
+ websocket-driver@0.7.4:
+ dependencies:
+ http-parser-js: 0.5.10
+ safe-buffer: 5.2.1
+ websocket-extensions: 0.1.4
+
+ websocket-extensions@0.1.4: {}
+
which@2.0.2:
dependencies:
isexe: 2.0.0
+ which@5.0.0:
+ dependencies:
+ isexe: 3.1.5
+
why-is-node-running@2.3.0:
dependencies:
siginfo: 2.0.0
stackback: 0.0.2
+ wildcard@2.0.1: {}
+
word-wrap@1.2.5: {}
+ wrap-ansi@6.2.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 5.1.2
+ strip-ansi: 7.1.2
+
wrap-ansi@9.0.2:
dependencies:
ansi-styles: 6.2.3
@@ -5467,14 +13024,38 @@ snapshots:
wrappy@1.0.2: {}
+ ws@8.19.0: {}
+
xml-name-validator@4.0.0: {}
+ y18n@5.0.8: {}
+
yallist@3.1.1: {}
+ yallist@4.0.0: {}
+
+ yallist@5.0.0: {}
+
yaml@2.8.2: {}
+ yargs-parser@21.1.1: {}
+
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+
yocto-queue@0.1.0: {}
+ yocto-queue@1.2.2: {}
+
+ yoctocolors-cjs@2.1.3: {}
+
yoctocolors@2.1.2: {}
zimmerframe@1.1.4: {}
@@ -5484,3 +13065,5 @@ snapshots:
zod: 4.3.6
zod@4.3.6: {}
+
+ zone.js@0.15.1: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 16d8e18..06bc502 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,11 +1,15 @@
packages:
- packages/*
+ - examples/angular/demo-app
+ - examples/react/demo-app
- examples/svelte/demo-app
- examples/vue/demo-app
catalog:
'@changesets/cli': ^2.29.7
'@nuxt/eslint-plugin': ^1.15.1
+ angular-eslint: ^19.4.0
+ typescript-eslint: ^8.32.0
'@types/node': ^25.3.0
'@types/prompts': ^2.4.9
commander: ^14.0.3