diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml index c23d817117e..4fd255842e4 100644 --- a/.github/actionlint.yaml +++ b/.github/actionlint.yaml @@ -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 diff --git a/.github/workflows/playwright-test-coverage.yml b/.github/workflows/playwright-test-coverage.yml new file mode 100644 index 00000000000..24459ff3d01 --- /dev/null +++ b/.github/workflows/playwright-test-coverage.yml @@ -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 diff --git a/.gitignore b/.gitignore index a1de6c4efc2..54b0222a7e9 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,5 @@ packages/testing/**/.cursor/rules/ __pycache__ packages/cli/THIRD_PARTY_LICENSES.md .coverage +.nyc_output packages/cli/src/commands/export/outputs \ No newline at end of file diff --git a/packages/frontend/editor-ui/package.json b/packages/frontend/editor-ui/package.json index a31ed6d1180..1d94a78e800 100644 --- a/packages/frontend/editor-ui/package.json +++ b/packages/frontend/editor-ui/package.json @@ -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", diff --git a/packages/frontend/editor-ui/vite.config.mts b/packages/frontend/editor-ui/vite.config.mts index 6cd8383d519..e68889ab4e9 100644 --- a/packages/frontend/editor-ui/vite.config.mts +++ b/packages/frontend/editor-ui/vite.config.mts @@ -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: [ { diff --git a/packages/testing/playwright/currents.config.ts b/packages/testing/playwright/currents.config.ts index 8ce5c52fac1..866d3084494 100644 --- a/packages/testing/playwright/currents.config.ts +++ b/packages/testing/playwright/currents.config.ts @@ -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 diff --git a/packages/testing/playwright/eslint.config.mjs b/packages/testing/playwright/eslint.config.mjs index 216f083aede..3f7354db2a4 100644 --- a/packages/testing/playwright/eslint.config.mjs +++ b/packages/testing/playwright/eslint.config.mjs @@ -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: { diff --git a/packages/testing/playwright/fixtures/base.ts b/packages/testing/playwright/fixtures/base.ts index b82dd8b082e..d6894521050 100644 --- a/packages/testing/playwright/fixtures/base.ts +++ b/packages/testing/playwright/fixtures/base.ts @@ -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({ +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({ 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); diff --git a/packages/testing/playwright/nyc.config.ts b/packages/testing/playwright/nyc.config.ts new file mode 100644 index 00000000000..51738b881ab --- /dev/null +++ b/packages/testing/playwright/nyc.config.ts @@ -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; diff --git a/packages/testing/playwright/package.json b/packages/testing/playwright/package.json index 667662ba9a8..456edc1f692 100644 --- a/packages/testing/playwright/package.json +++ b/packages/testing/playwright/package.json @@ -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:" } } diff --git a/packages/testing/playwright/playwright.config.ts b/packages/testing/playwright/playwright.config.ts index 1a8e8ab7f32..49b68aa9387 100644 --- a/packages/testing/playwright/playwright.config.ts +++ b/packages/testing/playwright/playwright.config.ts @@ -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({ 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 diff --git a/packages/testing/playwright/scripts/coverage-workflow.md b/packages/testing/playwright/scripts/coverage-workflow.md new file mode 100644 index 00000000000..2fb3851baba --- /dev/null +++ b/packages/testing/playwright/scripts/coverage-workflow.md @@ -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 diff --git a/packages/testing/playwright/scripts/generate-coverage-report.js b/packages/testing/playwright/scripts/generate-coverage-report.js new file mode 100755 index 00000000000..d1d58c49807 --- /dev/null +++ b/packages/testing/playwright/scripts/generate-coverage-report.js @@ -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 }; diff --git a/packages/testing/playwright/tests/ui/50-logs.spec.ts b/packages/testing/playwright/tests/ui/50-logs.spec.ts index dada10b3912..4fcc2d65f69 100644 --- a/packages/testing/playwright/tests/ui/50-logs.spec.ts +++ b/packages/testing/playwright/tests/ui/50-logs.spec.ts @@ -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 }) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1be933ff2e..e936ee3a293 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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