ci: Add UI coverage for e2e tests (#20236)

This commit is contained in:
Declan Carroll 2025-10-01 14:34:55 +01:00 committed by GitHub
parent 7aed600a2e
commit d3c5fcf49f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 730 additions and 45 deletions

View File

@ -4,3 +4,4 @@ self-hosted-runner:
- blacksmith-4vcpu-ubuntu-2204
- blacksmith-2vcpu-ubuntu-2204-arm
- blacksmith-4vcpu-ubuntu-2204-arm
- blacksmith-8vcpu-ubuntu-2204

View File

@ -0,0 +1,49 @@
name: Weekly Coverage Tests
on:
schedule:
- cron: '0 2 * * 1' # Every Monday at 2 AM
workflow_dispatch: # Allow manual triggering
env:
PLAYWRIGHT_BROWSERS_PATH: packages/testing/playwright/ms-playwright-cache
NODE_OPTIONS: --max-old-space-size=16384
TESTCONTAINERS_RYUK_DISABLED: true
PLAYWRIGHT_WORKERS: 4
jobs:
coverage:
runs-on: blacksmith-8vcpu-ubuntu-2204
name: Coverage Tests
steps:
- name: Checkout
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
- name: Setup Environment
uses: ./.github/actions/setup-nodejs-blacksmith
with:
build-command: pnpm turbo build:playwright
- name: Build with Coverage
run: pnpm --filter n8n-editor-ui build:coverage
- name: Run Coverage Tests
run: |
pnpm --filter n8n-playwright test:local \
--workers=${{ env.PLAYWRIGHT_WORKERS }}
env:
CURRENTS_RECORD_KEY: ${{ secrets.CURRENTS_RECORD_KEY }}
QA_PERFORMANCE_METRICS_WEBHOOK_URL: ${{ secrets.QA_PERFORMANCE_METRICS_WEBHOOK_URL }}
QA_PERFORMANCE_METRICS_WEBHOOK_USER: ${{ secrets.QA_PERFORMANCE_METRICS_WEBHOOK_USER }}
QA_PERFORMANCE_METRICS_WEBHOOK_PASSWORD: ${{ secrets.QA_PERFORMANCE_METRICS_WEBHOOK_PASSWORD }}
- name: Generate Coverage Report
run: pnpm --filter n8n-playwright coverage:report
- name: Upload Coverage Report
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: coverage-report
path: packages/testing/playwright/coverage/
retention-days: 14

1
.gitignore vendored
View File

@ -42,4 +42,5 @@ packages/testing/**/.cursor/rules/
__pycache__
packages/cli/THIRD_PARTY_LICENSES.md
.coverage
.nyc_output
packages/cli/src/commands/export/outputs

View File

@ -9,6 +9,7 @@
"popularity-cache-marker": "node scripts/cache-marker.mjs",
"fetch-popularity": "node scripts/fetch-node-popularity.mjs",
"build": "cross-env VUE_APP_PUBLIC_PATH=\"/{{BASE_PATH}}/\" NODE_OPTIONS=\"--max-old-space-size=8192\" vite build",
"build:coverage": "cross-env VUE_APP_PUBLIC_PATH=\"/{{BASE_PATH}}/\" NODE_OPTIONS=\"--max-old-space-size=14000\" BUILD_WITH_COVERAGE=true vite build",
"typecheck": "vue-tsc --noEmit",
"typecheck:watch": "vue-tsc --watch --noEmit",
"dev": "pnpm serve",
@ -135,6 +136,7 @@
"unplugin-icons": "catalog:frontend",
"unplugin-vue-components": "catalog:frontend",
"vite": "catalog:",
"vite-plugin-istanbul": "^7.2.0",
"vite-plugin-node-polyfills": "^0.24.0",
"vite-plugin-static-copy": "2.2.0",
"vite-svg-loader": "5.1.0",

View File

@ -4,6 +4,7 @@ import { defineConfig, mergeConfig, type UserConfig } from 'vite';
import { viteStaticCopy } from 'vite-plugin-static-copy';
import { nodePolyfills } from 'vite-plugin-node-polyfills';
import svgLoader from 'vite-svg-loader';
import istanbul from 'vite-plugin-istanbul';
import { sentryVitePlugin } from '@sentry/vite-plugin';
import { vitestConfig } from '@n8n/vitest-config/frontend';
@ -96,6 +97,18 @@ const plugins: UserConfig['plugins'] = [
}),
],
}),
// Add istanbul coverage plugin for E2E tests
...(process.env.BUILD_WITH_COVERAGE === 'true'
? [
istanbul({
include: 'src/**/*',
exclude: ['node_modules', 'tests/', 'dist/'],
extension: ['.js', '.ts', '.vue'],
forceBuildInstrument: true,
requireEnv: false,
}),
]
: []),
viteStaticCopy({
targets: [
{

View File

@ -3,6 +3,9 @@ import type { CurrentsConfig } from '@currents/playwright';
const config: CurrentsConfig = {
recordKey: process.env.CURRENTS_RECORD_KEY ?? '',
projectId: process.env.CURRENTS_PROJECT_ID ?? 'I0yzoc',
coverage: {
projects: true,
},
};
// eslint-disable-next-line import-x/no-default-export

View File

@ -5,7 +5,12 @@ export default [
...baseConfig,
playwrightPlugin.configs['flat/recommended'],
{
ignores: ['playwright-report/**/*', 'ms-playwright-cache/**/*', 'scripts/**/*'],
ignores: [
'playwright-report/**/*',
'ms-playwright-cache/**/*',
'coverage/**/*',
'scripts/**/*',
],
},
{
rules: {

View File

@ -1,3 +1,5 @@
import type { CurrentsFixtures, CurrentsWorkerFixtures } from '@currents/playwright';
import { fixtures as currentsFixtures } from '@currents/playwright';
import { test as base, expect, request } from '@playwright/test';
import type { N8NStack } from 'n8n-containers/n8n-test-container-creation';
import { createN8NStack } from 'n8n-containers/n8n-test-container-creation';
@ -42,7 +44,13 @@ interface ContainerConfig {
* Supports both external n8n instances (via N8N_BASE_URL) and containerized testing.
* Provides tag-driven authentication and database management.
*/
export const test = base.extend<TestFixtures, WorkerFixtures>({
export const test = base.extend<
TestFixtures & CurrentsFixtures,
WorkerFixtures & CurrentsWorkerFixtures
>({
...currentsFixtures.baseFixtures,
...currentsFixtures.coverageFixtures,
...currentsFixtures.actionFixtures,
// Container configuration from the project use options
containerConfig: [
async ({}, use, workerInfo) => {
@ -123,18 +131,8 @@ export const test = base.extend<TestFixtures, WorkerFixtures>({
await use(n8nUrl);
},
// Browser, baseURL, and dbSetup are required here to ensure they run first.
// This is how Playwright does dependency graphs
context: async ({ context, browser, baseURL, dbSetup }, use) => {
// Dependencies: browser, baseURL, dbSetup (ensure they run first)
void browser;
void baseURL;
void dbSetup;
await setupDefaultInterceptors(context);
await use(context);
},
n8n: async ({ context }, use, testInfo) => {
await setupDefaultInterceptors(context);
const page = await context.newPage();
const n8nInstance = new n8nPage(page);
await n8nInstance.api.setupFromTags(testInfo.tags);

View File

@ -0,0 +1,19 @@
const config = {
reporter: ['html'],
reportDir: 'coverage',
tempDir: '.nyc_output',
include: [
'../../../packages/frontend/editor-ui/src/**/*.{js,ts,vue}',
'../../../packages/frontend/editor-ui/dist/**/*.{js,ts}',
],
exclude: [
'**/*.test.{js,ts}',
'**/*.spec.{js,ts}',
'**/node_modules/**',
'**/coverage/**',
'**/.nyc_output/**',
],
sourceMap: true,
};
export = config;

View File

@ -16,6 +16,8 @@
"test:workflows": "playwright test --project=cli-workflows",
"test:workflows:schema": "SCHEMA=true playwright test --project=cli-workflows",
"test:workflows:update": "playwright test --project=cli-workflows --update-snapshots",
"coverage:report": "node scripts/generate-coverage-report.js",
"coverage:clean": "rm -rf coverage .nyc_output",
"install-browsers:local": "playwright install chromium --with-deps",
"install-browsers:ci": "PLAYWRIGHT_BROWSERS_PATH=./ms-playwright-cache playwright install chromium --with-deps",
"browsers:uninstall": "playwright uninstall --all",
@ -31,6 +33,7 @@
"@types/lodash": "catalog:",
"eslint-plugin-playwright": "2.2.2",
"generate-schema": "2.6.0",
"mockserver-client": "^5.15.0",
"n8n": "workspace:*",
"n8n-containers": "workspace:*",
"n8n-core": "workspace:*",
@ -38,9 +41,9 @@
"@n8n/db": "workspace:*",
"flatted": "catalog:",
"nanoid": "catalog:",
"nyc": "^17.1.0",
"otplib": "^12.0.1",
"tsx": "catalog:",
"mockserver-client": "^5.15.0",
"zod": "catalog:"
}
}

View File

@ -1,4 +1,5 @@
/* eslint-disable import-x/no-default-export */
import type { CurrentsFixtures, CurrentsWorkerFixtures } from '@currents/playwright';
import { currentsReporter } from '@currents/playwright';
import { defineConfig } from '@playwright/test';
import os from 'os';
@ -21,7 +22,7 @@ const LOCAL_WORKERS = Math.min(6, Math.floor(CPU_COUNT / 2));
const CI_WORKERS = CPU_COUNT;
const WORKERS = IS_CI ? CI_WORKERS : LOCAL_WORKERS;
export default defineConfig({
export default defineConfig<CurrentsFixtures, CurrentsWorkerFixtures>({
globalSetup: './global-setup.ts',
forbidOnly: IS_CI,
retries: IS_CI ? 2 : 0,
@ -59,6 +60,7 @@ export default defineConfig({
viewport: MACBOOK_WINDOW_SIZE,
actionTimeout: 20000, // TODO: We might need to make this dynamic for container tests if we have low resource containers etc
navigationTimeout: 10000,
currentsFixturesEnabled: !!process.env.CI,
},
reporter: IS_CI

View File

@ -0,0 +1,186 @@
# Playwright Coverage Workflow
This document explains how to generate HTML coverage reports from your Playwright tests to see exactly which parts of your code are being hit.
## Overview
The coverage workflow consists of three main steps:
1. **Build with Coverage**: Build the editor-ui with istanbul instrumentation
2. **Run Tests with Coverage**: Execute Playwright tests that collect coverage data
3. **Generate HTML Report**: Convert NYC coverage data into readable HTML reports
## Step-by-Step Instructions
### 1. Build Editor-UI with Coverage Instrumentation
First, build the editor-ui with coverage enabled:
```bash
# From the project root
pnpm --filter n8n-editor-ui build:coverage
```
This will:
- Enable istanbul instrumentation in the Vite build
- Create instrumented JavaScript files in the `dist/` directory
- Add coverage collection hooks to your code
### 2. Run Playwright Tests with Coverage Collection
Run your Playwright tests with coverage collection enabled:
```bash
# From the playwright package directory
cd packages/testing/playwright
# Run UI tests
pnpm test:ui
```
This will:
- Execute your Playwright tests
- Collect coverage data as tests interact with the instrumented code
- Store coverage data in NYC format
### 3. Generate HTML Coverage Report
Generate a detailed HTML report from the collected coverage data:
```bash
# From the playwright package directory
pnpm coverage:report
```
This will:
- Find and merge all coverage files
- Generate an HTML report showing exactly which lines are covered
- Create a detailed coverage analysis
### 4. View the Coverage Report
Open the generated HTML report in your browser:
```bash
# The report will be available at:
open coverage/index.html
# Or navigate to:
file:///path/to/packages/testing/playwright/coverage/index.html
```
## Understanding the Coverage Report
The HTML report will show you:
- **Overall Coverage**: Percentage of statements, branches, functions, and lines covered
- **File-by-File Breakdown**: Coverage for each source file
- **Line-by-Line Details**: Exactly which lines are covered (green) vs uncovered (red)
- **Branch Coverage**: Which conditional branches are tested
- **Function Coverage**: Which functions are called during tests
## Troubleshooting
### No Coverage Data Found
If you see "No coverage files found":
1. Ensure you built with coverage: `pnpm --filter n8n-editor-ui build:coverage`
2. Run tests with coverage enabled: `COVERAGE_ENABLED=true pnpm test:ui`
3. Check that coverage files exist in the expected locations
### Low Coverage Percentage
If you see low coverage (like 15%):
1. **Check the HTML report** to see which specific files/lines are uncovered
2. **Look for untested code paths** in your components
3. **Add more test scenarios** to cover missing branches
4. **Focus on critical user flows** that should have high coverage
### Coverage Data Not Merging
If multiple coverage files aren't merging:
1. Check that all coverage files are in valid NYC format
2. Ensure the files contain actual coverage data (not empty)
3. Try running the merge command manually: `npx nyc merge coverage/*.json .nyc_output/out.json`
## Advanced Usage
### Custom Coverage Configuration
You can modify `nyc.config.js` to:
- Change coverage thresholds
- Exclude specific files or patterns
- Adjust report formats
- Set custom watermarks
### CI/CD Integration
For automated coverage reporting:
```yaml
# Example GitHub Actions step
- name: Generate Coverage Report
run: |
pnpm --filter n8n-editor-ui build:coverage
pnpm --filter n8n-playwright test:ui:coverage
pnpm --filter n8n-playwright coverage:report
env:
COVERAGE_ENABLED: true
```
### Coverage Thresholds
Set minimum coverage requirements in `nyc.config.js`:
```javascript
checkCoverage: true,
statements: 80,
branches: 80,
functions: 80,
lines: 80
```
## File Structure
After running the coverage workflow, you'll have:
```
packages/testing/playwright/
├── coverage/ # HTML coverage reports
│ ├── index.html # Main coverage report
│ ├── base.css # Report styling
│ └── ... # Individual file reports
├── .nyc_output/ # Raw coverage data
│ └── out.json # Merged coverage data
├── nyc.config.js # NYC configuration
└── scripts/
└── generate-coverage-report.js # Report generation script
```
## Best Practices
1. **Regular Coverage Checks**: Run coverage reports regularly to catch coverage regressions
2. **Focus on Critical Paths**: Prioritize coverage for user-facing features and business logic
3. **Review Uncovered Code**: Use the HTML report to identify and test uncovered code paths
4. **Set Realistic Thresholds**: Don't aim for 100% coverage - focus on meaningful coverage
5. **Clean Up**: Use `pnpm coverage:clean` to remove old coverage data when needed
## Common Issues
### "Cannot find module" errors
- Ensure the editor-ui is built with coverage before running tests
- Check that the build output includes instrumented files
### Empty coverage reports
- Verify that tests are actually running and interacting with the UI
- Check that the coverage instrumentation is working correctly
- Ensure tests are not running in headless mode without proper setup
### Performance impact
- Coverage instrumentation adds overhead - use only when needed
- Consider running coverage tests separately from regular test runs
- Use coverage data to guide test improvements, not as a strict requirement

View File

@ -0,0 +1,60 @@
#!/usr/bin/env node
/**
* Simple script to merge coverage reports and generate HTML output
*/
const { execSync } = require('child_process');
const path = require('path');
const fs = require('fs');
const NYC_OUTPUT_DIR = path.join(__dirname, '..', '.nyc_output');
const UI_DIR = path.join(NYC_OUTPUT_DIR, 'ui');
const COVERAGE_DIR = path.join(__dirname, '..', 'coverage');
const NYC_CONFIG = path.join(__dirname, '..', 'nyc.config.ts');
function main() {
console.log('🔍 Generating Coverage Report');
console.log('==============================\n');
// Check if ui directory exists and has JSON files
if (!fs.existsSync(UI_DIR)) {
console.error('❌ No coverage data found in .nyc_output/ui');
console.log('\nTo generate coverage data:');
console.log(
'1. Build editor-ui with coverage: COVERAGE_ENABLED=true pnpm --filter n8n-editor-ui build',
);
console.log('2. Run Playwright tests: COVERAGE_ENABLED=true pnpm test:local');
process.exit(1);
}
try {
// Merge coverage files from ui directory
console.log('Merging coverage files...');
const mergedFile = path.join(NYC_OUTPUT_DIR, 'out.json');
execSync(`npx nyc merge ${UI_DIR} ${mergedFile}`, { stdio: 'inherit' });
// Generate HTML report
console.log('Generating HTML report...');
execSync(
`npx nyc report --reporter=html --report-dir=${COVERAGE_DIR} --temp-dir=${NYC_OUTPUT_DIR} --config=${NYC_CONFIG} --exclude-after-remap=false`,
{ stdio: 'inherit' },
);
const htmlReportPath = path.join(COVERAGE_DIR, 'index.html');
if (fs.existsSync(htmlReportPath)) {
console.log(`\n✅ Coverage report generated successfully!`);
console.log(`📊 Report: ${htmlReportPath}`);
console.log(`🌐 Open: file://${htmlReportPath}`);
}
} catch (error) {
console.error('❌ Failed to generate coverage report:', error.message);
process.exit(1);
}
}
if (require.main === module) {
main();
}
module.exports = { main };

View File

@ -62,7 +62,7 @@ test.describe('Logs', () => {
await n8n.canvas.logsPanel.getClearExecutionButton().click();
await expect(n8n.canvas.logsPanel.getLogEntries()).toHaveCount(0);
await expect(n8n.canvas.getNodeIssuesByName(NODES.CODE1)).toBeHidden();
await expect(n8n.canvas.getNodeIssuesByName(NODES.CODE1)).not.toBeVisible();
});
test('should allow to trigger partial execution', async ({ n8n, setupRequirements }) => {

401
pnpm-lock.yaml generated
View File

@ -2292,7 +2292,7 @@ importers:
version: 0.19.0(@vue/compiler-sfc@3.5.13)
unplugin-vue-components:
specifier: catalog:frontend
version: 0.27.3(@babel/parser@7.27.5)(rollup@4.49.0)(vue@3.5.13(typescript@5.9.2))
version: 0.27.3(@babel/parser@7.28.4)(rollup@4.49.0)(vue@3.5.13(typescript@5.9.2))
vite:
specifier: 'catalog:'
version: 6.3.5(@types/node@20.19.11)(jiti@1.21.7)(sass@1.89.2)(terser@5.16.1)(tsx@4.19.3)
@ -2854,10 +2854,13 @@ importers:
version: 0.19.0(@vue/compiler-sfc@3.5.13)
unplugin-vue-components:
specifier: catalog:frontend
version: 0.27.3(@babel/parser@7.27.5)(rollup@4.49.0)(vue@3.5.13(typescript@5.9.2))
version: 0.27.3(@babel/parser@7.28.4)(rollup@4.49.0)(vue@3.5.13(typescript@5.9.2))
vite:
specifier: 'catalog:'
version: 6.3.5(@types/node@20.19.11)(jiti@1.21.7)(sass@1.89.2)(terser@5.16.1)(tsx@4.19.3)
vite-plugin-istanbul:
specifier: ^7.2.0
version: 7.2.0(vite@6.3.5(@types/node@20.19.11)(jiti@1.21.7)(sass@1.89.2)(terser@5.16.1)(tsx@4.19.3))
vite-plugin-node-polyfills:
specifier: ^0.24.0
version: 0.24.0(rollup@4.49.0)(vite@6.3.5(@types/node@20.19.11)(jiti@1.21.7)(sass@1.89.2)(terser@5.16.1)(tsx@4.19.3))
@ -3274,6 +3277,9 @@ importers:
nanoid:
specifier: 'catalog:'
version: 3.3.8
nyc:
specifier: ^17.1.0
version: 17.1.0
otplib:
specifier: ^12.0.1
version: 12.0.1
@ -3754,6 +3760,10 @@ packages:
resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==}
engines: {node: '>=6.9.0'}
'@babel/generator@7.28.3':
resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
engines: {node: '>=6.9.0'}
'@babel/helper-annotate-as-pure@7.25.9':
resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
engines: {node: '>=6.9.0'}
@ -3854,6 +3864,11 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/parser@7.28.4':
resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==}
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9':
resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==}
engines: {node: '>=6.9.0'}
@ -4308,6 +4323,10 @@ packages:
resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==}
engines: {node: '>=6.9.0'}
'@babel/types@7.28.4':
resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==}
engines: {node: '>=6.9.0'}
'@balena/dockerignore@1.0.2':
resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==}
@ -8440,6 +8459,10 @@ packages:
append-field@1.0.0:
resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==}
append-transform@2.0.0:
resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==}
engines: {node: '>=8'}
aproba@2.0.0:
resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
@ -8454,6 +8477,9 @@ packages:
resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==}
engines: {node: '>= 14'}
archy@1.0.0:
resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==}
are-we-there-yet@3.0.1:
resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@ -8973,6 +8999,10 @@ packages:
resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==}
engines: {node: '>=6'}
caching-transform@4.0.0:
resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==}
engines: {node: '>=8'}
call-bind-apply-helpers@1.0.2:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
@ -9194,6 +9224,9 @@ packages:
resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
engines: {node: '>= 10'}
cliui@6.0.0:
resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
cliui@7.0.4:
resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
@ -9841,6 +9874,10 @@ packages:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
engines: {node: '>=0.10.0'}
default-require-extensions@3.0.1:
resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==}
engines: {node: '>=8'}
defaults@1.0.4:
resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
@ -10244,6 +10281,9 @@ packages:
resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==}
engines: {node: '>=0.10'}
es6-error@4.1.1:
resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
es6-iterator@2.0.3:
resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
@ -10777,6 +10817,10 @@ packages:
resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
engines: {node: '>= 0.8'}
find-cache-dir@3.3.2:
resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
engines: {node: '>=8'}
find-package-json@1.2.0:
resolution: {integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==}
@ -10838,10 +10882,18 @@ packages:
foreach@2.0.6:
resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==}
foreground-child@2.0.0:
resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==}
engines: {node: '>=8.0.0'}
foreground-child@3.1.1:
resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
engines: {node: '>=14'}
foreground-child@3.3.1:
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
engines: {node: '>=14'}
forever-agent@0.6.1:
resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
@ -10889,6 +10941,9 @@ packages:
from@0.1.7:
resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==}
fromentries@1.3.2:
resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==}
fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
@ -11250,6 +11305,10 @@ packages:
hash.js@1.1.7:
resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
hasha@5.2.2:
resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==}
engines: {node: '>=8'}
hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
@ -11789,6 +11848,10 @@ packages:
resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
engines: {node: '>= 0.4'}
is-windows@1.0.2:
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
engines: {node: '>=0.10.0'}
is-wsl@2.2.0:
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
engines: {node: '>=8'}
@ -11828,10 +11891,22 @@ packages:
resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
engines: {node: '>=8'}
istanbul-lib-hook@3.0.0:
resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==}
engines: {node: '>=8'}
istanbul-lib-instrument@5.2.1:
resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
engines: {node: '>=8'}
istanbul-lib-instrument@6.0.3:
resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==}
engines: {node: '>=10'}
istanbul-lib-processinfo@2.0.3:
resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==}
engines: {node: '>=8'}
istanbul-lib-report@3.0.1:
resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
engines: {node: '>=10'}
@ -12523,6 +12598,9 @@ packages:
lodash.defaults@4.2.0:
resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
lodash.flattendeep@4.4.0:
resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==}
lodash.get@4.4.2:
resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
deprecated: This package is deprecated. Use the optional chaining (?.) operator instead.
@ -13367,6 +13445,10 @@ packages:
node-machine-id@1.1.12:
resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==}
node-preload@0.2.1:
resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==}
engines: {node: '>=8'}
node-readfiles@0.2.0:
resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==}
@ -13470,6 +13552,11 @@ packages:
nwsapi@2.2.7:
resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==}
nyc@17.1.0:
resolution: {integrity: sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==}
engines: {node: '>=18'}
hasBin: true
nypm@0.5.4:
resolution: {integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==}
engines: {node: ^14.16.0 || >=16.10.0}
@ -13687,6 +13774,10 @@ packages:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
p-map@3.0.0:
resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==}
engines: {node: '>=8'}
p-map@4.0.0:
resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
engines: {node: '>=10'}
@ -13707,6 +13798,10 @@ packages:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
package-hash@4.0.0:
resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==}
engines: {node: '>=8'}
package-json-from-dist@1.0.0:
resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
@ -14222,6 +14317,10 @@ packages:
process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
process-on-spawn@1.1.0:
resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==}
engines: {node: '>=8'}
process-warning@5.0.0:
resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==}
@ -14636,6 +14735,10 @@ packages:
resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
engines: {node: '>= 0.10'}
release-zalgo@1.0.0:
resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==}
engines: {node: '>=4'}
remove-trailing-slash@0.1.1:
resolution: {integrity: sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==}
@ -14662,6 +14765,9 @@ packages:
resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==}
engines: {node: '>=8.6.0'}
require-main-filename@2.0.0:
resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
requirejs-config-file@4.0.0:
resolution: {integrity: sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==}
engines: {node: '>=10.13.0'}
@ -15122,6 +15228,10 @@ packages:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
source-map@0.7.6:
resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
engines: {node: '>= 12'}
source-map@0.8.0-beta.0:
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
engines: {node: '>= 8'}
@ -15133,6 +15243,10 @@ packages:
spawn-command@0.0.2:
resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==}
spawn-wrap@2.0.0:
resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==}
engines: {node: '>=8'}
spdx-compare@1.0.0:
resolution: {integrity: sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==}
@ -15975,6 +16089,10 @@ packages:
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
type-fest@0.8.1:
resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
engines: {node: '>=8'}
type-fest@2.19.0:
resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
engines: {node: '>=12.20'}
@ -16330,6 +16448,11 @@ packages:
vite:
optional: true
vite-plugin-istanbul@7.2.0:
resolution: {integrity: sha512-bZGwPaFBRMSUAhBMlkezr+XRzPidqMhuL28svdVUzy6ltI8aQbkZfGKwHk7sJgVrQ1QCFdg6lFwFApK1SN1xUw==}
peerDependencies:
vite: '>=4 <=7'
vite-plugin-node-polyfills@0.24.0:
resolution: {integrity: sha512-GA9QKLH+vIM8NPaGA+o2t8PDfFUl32J8rUp1zQfMKVJQiNkOX4unE51tR6ppl6iKw5yOrDAdSH7r/UIFLCVhLw==}
peerDependencies:
@ -16717,6 +16840,9 @@ packages:
resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
engines: {node: '>= 0.4'}
which-module@2.0.1:
resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
which-typed-array@1.1.15:
resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
engines: {node: '>= 0.4'}
@ -16802,6 +16928,9 @@ packages:
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
write-file-atomic@3.0.3:
resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
write-file-atomic@4.0.2:
resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@ -16905,6 +17034,9 @@ packages:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
y18n@4.0.3:
resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@ -16935,6 +17067,10 @@ packages:
resolution: {integrity: sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==}
hasBin: true
yargs-parser@18.1.3:
resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
engines: {node: '>=6'}
yargs-parser@20.2.9:
resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
engines: {node: '>=10'}
@ -16947,6 +17083,10 @@ packages:
resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
engines: {node: '>=10'}
yargs@15.4.1:
resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
engines: {node: '>=8'}
yargs@16.2.0:
resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
engines: {node: '>=10'}
@ -18168,12 +18308,20 @@ snapshots:
'@babel/generator@7.26.10':
dependencies:
'@babel/parser': 7.27.5
'@babel/parser': 7.28.4
'@babel/types': 7.27.6
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.30
jsesc: 3.1.0
'@babel/generator@7.28.3':
dependencies:
'@babel/parser': 7.28.4
'@babel/types': 7.28.4
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.30
jsesc: 3.1.0
'@babel/helper-annotate-as-pure@7.25.9':
dependencies:
'@babel/types': 7.27.6
@ -18228,7 +18376,7 @@ snapshots:
'@babel/helper-member-expression-to-functions@7.25.9':
dependencies:
'@babel/traverse': 7.26.10
'@babel/types': 7.27.6
'@babel/types': 7.28.4
transitivePeerDependencies:
- supports-color
@ -18250,7 +18398,7 @@ snapshots:
'@babel/helper-optimise-call-expression@7.25.9':
dependencies:
'@babel/types': 7.27.6
'@babel/types': 7.28.4
'@babel/helper-plugin-utils@7.26.5': {}
@ -18306,6 +18454,10 @@ snapshots:
dependencies:
'@babel/types': 7.27.6
'@babel/parser@7.28.4':
dependencies:
'@babel/types': 7.28.4
'@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)':
dependencies:
'@babel/core': 7.26.10
@ -18846,7 +18998,7 @@ snapshots:
dependencies:
'@babel/code-frame': 7.27.1
'@babel/generator': 7.26.10
'@babel/parser': 7.27.5
'@babel/parser': 7.28.4
'@babel/template': 7.26.9
'@babel/types': 7.27.6
debug: 4.4.1(supports-color@8.1.1)
@ -18859,6 +19011,11 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.27.1
'@babel/types@7.28.4':
dependencies:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.27.1
'@balena/dockerignore@1.0.2': {}
'@bcoe/v8-coverage@0.2.3': {}
@ -22205,24 +22362,24 @@ snapshots:
'@types/babel__core@7.20.0':
dependencies:
'@babel/parser': 7.27.5
'@babel/types': 7.27.6
'@babel/parser': 7.28.4
'@babel/types': 7.28.4
'@types/babel__generator': 7.6.4
'@types/babel__template': 7.4.1
'@types/babel__traverse': 7.18.2
'@types/babel__generator@7.6.4':
dependencies:
'@babel/types': 7.27.6
'@babel/types': 7.28.4
'@types/babel__template@7.4.1':
dependencies:
'@babel/parser': 7.27.5
'@babel/types': 7.27.6
'@babel/parser': 7.28.4
'@babel/types': 7.28.4
'@types/babel__traverse@7.18.2':
dependencies:
'@babel/types': 7.27.6
'@babel/types': 7.28.4
'@types/basic-auth@1.1.3':
dependencies:
@ -23101,7 +23258,7 @@ snapshots:
'@vue/compiler-core@3.5.13':
dependencies:
'@babel/parser': 7.27.5
'@babel/parser': 7.28.4
'@vue/shared': 3.5.13
entities: 4.5.0
estree-walker: 2.0.2
@ -23114,7 +23271,7 @@ snapshots:
'@vue/compiler-sfc@3.5.13':
dependencies:
'@babel/parser': 7.27.5
'@babel/parser': 7.28.4
'@vue/compiler-core': 3.5.13
'@vue/compiler-dom': 3.5.13
'@vue/compiler-ssr': 3.5.13
@ -23478,6 +23635,10 @@ snapshots:
append-field@1.0.0: {}
append-transform@2.0.0:
dependencies:
default-require-extensions: 3.0.1
aproba@2.0.0:
optional: true
@ -23503,6 +23664,8 @@ snapshots:
tar-stream: 3.1.7
zip-stream: 6.0.1
archy@1.0.0: {}
are-we-there-yet@3.0.1:
dependencies:
delegates: 1.0.0
@ -23786,7 +23949,7 @@ snapshots:
babel-plugin-jest-hoist@29.5.0:
dependencies:
'@babel/template': 7.26.9
'@babel/types': 7.27.6
'@babel/types': 7.28.4
'@types/babel__core': 7.20.0
'@types/babel__traverse': 7.18.2
@ -23844,7 +24007,7 @@ snapshots:
babel-walk@3.0.0-canary-5:
dependencies:
'@babel/types': 7.27.6
'@babel/types': 7.28.4
balanced-match@1.0.2: {}
@ -24170,6 +24333,13 @@ snapshots:
cachedir@2.3.0: {}
caching-transform@4.0.0:
dependencies:
hasha: 5.2.2
make-dir: 3.1.0
package-hash: 4.0.0
write-file-atomic: 3.0.3
call-bind-apply-helpers@1.0.2:
dependencies:
es-errors: 1.3.0
@ -24420,6 +24590,12 @@ snapshots:
cli-width@3.0.0: {}
cliui@6.0.0:
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 6.2.0
cliui@7.0.4:
dependencies:
string-width: 4.2.3
@ -24628,7 +24804,7 @@ snapshots:
constantinople@4.0.1:
dependencies:
'@babel/parser': 7.27.5
'@babel/parser': 7.28.4
'@babel/types': 7.27.6
constants-browserify@1.0.0: {}
@ -25149,6 +25325,10 @@ snapshots:
deepmerge@4.3.1: {}
default-require-extensions@3.0.1:
dependencies:
strip-bom: 4.0.0
defaults@1.0.4:
dependencies:
clone: 1.0.4
@ -25708,6 +25888,8 @@ snapshots:
esniff: 2.0.1
next-tick: 1.1.0
es6-error@4.1.1: {}
es6-iterator@2.0.3:
dependencies:
d: 1.0.2
@ -26421,6 +26603,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
find-cache-dir@3.3.2:
dependencies:
commondir: 1.0.1
make-dir: 3.1.0
pkg-dir: 4.2.0
find-package-json@1.2.0: {}
find-test-names@1.29.7(@babel/core@7.26.10):
@ -26492,11 +26680,21 @@ snapshots:
foreach@2.0.6: {}
foreground-child@2.0.0:
dependencies:
cross-spawn: 7.0.6
signal-exit: 3.0.7
foreground-child@3.1.1:
dependencies:
cross-spawn: 7.0.6
signal-exit: 4.1.0
foreground-child@3.3.1:
dependencies:
cross-spawn: 7.0.6
signal-exit: 4.1.0
forever-agent@0.6.1: {}
form-data-encoder@1.7.2: {}
@ -26538,6 +26736,8 @@ snapshots:
from@0.1.7: {}
fromentries@1.3.2: {}
fs-constants@1.0.0: {}
fs-extra@11.3.0:
@ -26773,7 +26973,7 @@ snapshots:
glob@10.4.5:
dependencies:
foreground-child: 3.1.1
foreground-child: 3.3.1
jackspeak: 3.4.3
minimatch: 9.0.5
minipass: 7.1.2
@ -26782,7 +26982,7 @@ snapshots:
glob@11.0.1:
dependencies:
foreground-child: 3.1.1
foreground-child: 3.3.1
jackspeak: 4.1.0
minimatch: 10.0.3
minipass: 7.1.2
@ -27021,6 +27221,11 @@ snapshots:
inherits: 2.0.4
minimalistic-assert: 1.0.1
hasha@5.2.2:
dependencies:
is-stream: 2.0.1
type-fest: 0.8.1
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
@ -27612,6 +27817,8 @@ snapshots:
call-bound: 1.0.4
get-intrinsic: 1.3.0
is-windows@1.0.2: {}
is-wsl@2.2.0:
dependencies:
is-docker: 2.2.1
@ -27636,7 +27843,21 @@ snapshots:
istanbul-lib-coverage@3.2.2: {}
istanbul-lib-hook@3.0.0:
dependencies:
append-transform: 2.0.0
istanbul-lib-instrument@5.2.1:
dependencies:
'@babel/core': 7.26.10
'@babel/parser': 7.28.4
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
semver: 7.7.2
transitivePeerDependencies:
- supports-color
istanbul-lib-instrument@6.0.3:
dependencies:
'@babel/core': 7.26.10
'@babel/parser': 7.27.5
@ -27646,6 +27867,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
istanbul-lib-processinfo@2.0.3:
dependencies:
archy: 1.0.0
cross-spawn: 7.0.6
istanbul-lib-coverage: 3.2.2
p-map: 3.0.0
rimraf: 3.0.2
uuid: 8.3.2
istanbul-lib-report@3.0.1:
dependencies:
istanbul-lib-coverage: 3.2.2
@ -28082,7 +28312,7 @@ snapshots:
'@babel/generator': 7.26.10
'@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10)
'@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.26.10)
'@babel/types': 7.27.6
'@babel/types': 7.28.4
'@jest/expect-utils': 29.6.2
'@jest/transform': 29.6.2
'@jest/types': 29.6.1
@ -28680,6 +28910,8 @@ snapshots:
lodash.defaults@4.2.0: {}
lodash.flattendeep@4.4.0: {}
lodash.get@4.4.2: {}
lodash.includes@4.3.0: {}
@ -28818,8 +29050,8 @@ snapshots:
magicast@0.3.5:
dependencies:
'@babel/parser': 7.27.5
'@babel/types': 7.27.6
'@babel/parser': 7.28.4
'@babel/types': 7.28.4
source-map-js: 1.2.1
mailparser@3.6.7:
@ -29742,6 +29974,10 @@ snapshots:
node-machine-id@1.1.12: {}
node-preload@0.2.1:
dependencies:
process-on-spawn: 1.1.0
node-readfiles@0.2.0:
dependencies:
es6-promise: 3.3.1
@ -29754,7 +29990,7 @@ snapshots:
node-source-walk@7.0.1:
dependencies:
'@babel/parser': 7.27.5
'@babel/parser': 7.28.4
node-ssh@13.2.0:
dependencies:
@ -29892,6 +30128,38 @@ snapshots:
nwsapi@2.2.7: {}
nyc@17.1.0:
dependencies:
'@istanbuljs/load-nyc-config': 1.1.0
'@istanbuljs/schema': 0.1.3
caching-transform: 4.0.0
convert-source-map: 1.9.0
decamelize: 1.2.0
find-cache-dir: 3.3.2
find-up: 4.1.0
foreground-child: 3.3.1
get-package-type: 0.1.0
glob: 7.2.3
istanbul-lib-coverage: 3.2.2
istanbul-lib-hook: 3.0.0
istanbul-lib-instrument: 6.0.3
istanbul-lib-processinfo: 2.0.3
istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 4.0.1
istanbul-reports: 3.1.7
make-dir: 3.1.0
node-preload: 0.2.1
p-map: 3.0.0
process-on-spawn: 1.1.0
resolve-from: 5.0.0
rimraf: 3.0.2
signal-exit: 3.0.7
spawn-wrap: 2.0.0
test-exclude: 6.0.0
yargs: 15.4.1
transitivePeerDependencies:
- supports-color
nypm@0.5.4:
dependencies:
citty: 0.1.6
@ -30140,6 +30408,10 @@ snapshots:
dependencies:
p-limit: 3.1.0
p-map@3.0.0:
dependencies:
aggregate-error: 3.1.0
p-map@4.0.0:
dependencies:
aggregate-error: 3.1.0
@ -30160,6 +30432,13 @@ snapshots:
p-try@2.2.0: {}
package-hash@4.0.0:
dependencies:
graceful-fs: 4.2.11
hasha: 5.2.2
lodash.flattendeep: 4.4.0
release-zalgo: 1.0.0
package-json-from-dist@1.0.0: {}
pako@1.0.11: {}
@ -30659,6 +30938,10 @@ snapshots:
process-nextick-args@2.0.1: {}
process-on-spawn@1.1.0:
dependencies:
fromentries: 1.3.2
process-warning@5.0.0: {}
process@0.11.10: {}
@ -31214,6 +31497,10 @@ snapshots:
relateurl@0.2.7: {}
release-zalgo@1.0.0:
dependencies:
es6-error: 4.1.1
remove-trailing-slash@0.1.1: {}
replace-in-file@6.3.5:
@ -31244,6 +31531,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
require-main-filename@2.0.0: {}
requirejs-config-file@4.0.0:
dependencies:
esprima: 4.0.1
@ -31319,7 +31608,6 @@ snapshots:
rimraf@3.0.2:
dependencies:
glob: 7.2.3
optional: true
rimraf@5.0.1:
dependencies:
@ -31552,8 +31840,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
set-blocking@2.0.0:
optional: true
set-blocking@2.0.0: {}
set-function-length@1.2.2:
dependencies:
@ -31857,6 +32144,8 @@ snapshots:
source-map@0.6.1: {}
source-map@0.7.6: {}
source-map@0.8.0-beta.0:
dependencies:
whatwg-url: 7.1.0
@ -31867,6 +32156,15 @@ snapshots:
spawn-command@0.0.2: {}
spawn-wrap@2.0.0:
dependencies:
foreground-child: 2.0.0
is-windows: 1.0.2
make-dir: 3.1.0
rimraf: 3.0.2
signal-exit: 3.0.7
which: 2.0.2
spdx-compare@1.0.0:
dependencies:
array-find-index: 1.0.2
@ -32940,6 +33238,8 @@ snapshots:
type-fest@0.21.3: {}
type-fest@0.8.1: {}
type-fest@2.19.0: {}
type-fest@4.26.1: {}
@ -33127,7 +33427,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
unplugin-vue-components@0.27.3(@babel/parser@7.27.5)(rollup@4.49.0)(vue@3.5.13(typescript@5.9.2)):
unplugin-vue-components@0.27.3(@babel/parser@7.28.4)(rollup@4.49.0)(vue@3.5.13(typescript@5.9.2)):
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.4(rollup@4.49.0)
@ -33141,7 +33441,7 @@ snapshots:
unplugin: 1.11.0
vue: 3.5.13(typescript@5.9.2)
optionalDependencies:
'@babel/parser': 7.27.5
'@babel/parser': 7.28.4
transitivePeerDependencies:
- rollup
- supports-color
@ -33346,6 +33646,19 @@ snapshots:
- rollup
- supports-color
vite-plugin-istanbul@7.2.0(vite@6.3.5(@types/node@20.19.11)(jiti@1.21.7)(sass@1.89.2)(terser@5.16.1)(tsx@4.19.3)):
dependencies:
'@babel/generator': 7.28.3
'@istanbuljs/load-nyc-config': 1.1.0
espree: 10.4.0
istanbul-lib-instrument: 6.0.3
picocolors: 1.1.1
source-map: 0.7.6
test-exclude: 7.0.1
vite: 6.3.5(@types/node@20.19.11)(jiti@1.21.7)(sass@1.89.2)(terser@5.16.1)(tsx@4.19.3)
transitivePeerDependencies:
- supports-color
vite-plugin-node-polyfills@0.24.0(rollup@4.49.0)(vite@6.3.5(@types/node@20.19.11)(jiti@1.21.7)(sass@1.89.2)(terser@5.16.1)(tsx@4.19.3)):
dependencies:
'@rollup/plugin-inject': 5.0.5(rollup@4.49.0)
@ -33745,6 +34058,8 @@ snapshots:
is-weakmap: 2.0.2
is-weakset: 2.0.4
which-module@2.0.1: {}
which-typed-array@1.1.15:
dependencies:
available-typed-arrays: 1.0.7
@ -33823,7 +34138,7 @@ snapshots:
with@7.0.2:
dependencies:
'@babel/parser': 7.27.5
'@babel/parser': 7.28.4
'@babel/types': 7.27.6
assert-never: 1.2.1
babel-walk: 3.0.0-canary-5
@ -33873,6 +34188,13 @@ snapshots:
wrappy@1.0.2: {}
write-file-atomic@3.0.3:
dependencies:
imurmurhash: 0.1.4
is-typedarray: 1.0.0
signal-exit: 3.0.7
typedarray-to-buffer: 3.1.5
write-file-atomic@4.0.2:
dependencies:
imurmurhash: 0.1.4
@ -33942,6 +34264,8 @@ snapshots:
xtend@4.0.2: {}
y18n@4.0.3: {}
y18n@5.0.8: {}
yaeti@0.0.6: {}
@ -33961,6 +34285,11 @@ snapshots:
argparse: 1.0.10
glob: 7.2.3
yargs-parser@18.1.3:
dependencies:
camelcase: 5.3.1
decamelize: 1.2.0
yargs-parser@20.2.9: {}
yargs-parser@21.1.1: {}
@ -33972,6 +34301,20 @@ snapshots:
flat: 5.0.2
is-plain-obj: 2.1.0
yargs@15.4.1:
dependencies:
cliui: 6.0.0
decamelize: 1.2.0
find-up: 4.1.0
get-caller-file: 2.0.5
require-directory: 2.1.1
require-main-filename: 2.0.0
set-blocking: 2.0.0
string-width: 4.2.3
which-module: 2.0.1
y18n: 4.0.3
yargs-parser: 18.1.3
yargs@16.2.0:
dependencies:
cliui: 7.0.4