diff --git a/.github/PULL_REQUEST_TEMPLATE/coverage.md b/.github/PULL_REQUEST_TEMPLATE/coverage.md new file mode 100644 index 0000000000..3a782c15e8 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/coverage.md @@ -0,0 +1,33 @@ +--- +name: Coverage improvement +about: PR opened by the Copilot coverage agent +--- + +## Coverage improvement + +### What this PR covers + +| File | Before | After | Δ | +|------|--------|-------|---| +| | | | | + +### Closes + + +### Self-audit results + +- [ ] `yarn backendTests` passes +- [ ] Every file listed in the issue improved by ≥ 10 percentage points OR reached ≥ 60% line coverage +- [ ] No test uses `assert.ok(true)` or is an empty stub +- [ ] Test names describe behavior, not implementation +- [ ] No test depends on another test's side effects +- [ ] Presets-mode and kits/variants mode both exercised where relevant +- [ ] Single-config and multi-config generator paths both tested where relevant +- [ ] `yarn lint` passes +- [ ] `CHANGELOG.md` has an entry under `Improvements:` +- [ ] Tests are in `test/unit-tests/backend/` (runnable without VS Code host) + +### Coverage delta (paste `c8` text report here) +``` +(paste output of: npx c8 report --reporter=text) +``` diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index e7e427ec90..cd09e24b02 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -111,6 +111,10 @@ One entry under the current version in `CHANGELOG.md`, in the appropriate sectio - [ ] Behavior verified with **single-config** and **multi-config** generators - [ ] Windows/macOS/Linux differences considered (paths, env vars, MSVC toolchain, generator availability) +## Test coverage improvements + +When working on issues labeled `test-coverage`, read `.github/instructions/copilot-test-coverage.instructions.md` before starting — it contains the mandatory self-audit protocol, test quality rules, and scope constraints for coverage work. + ## Where to start - **Configure/build/test behavior** → `src/cmakeProject.ts` + `src/drivers/` diff --git a/.github/instructions/copilot-test-coverage.instructions.md b/.github/instructions/copilot-test-coverage.instructions.md new file mode 100644 index 0000000000..3adf22a116 --- /dev/null +++ b/.github/instructions/copilot-test-coverage.instructions.md @@ -0,0 +1,77 @@ +--- +description: "Instructions for the Copilot coding agent when working on test-coverage issues." +applyTo: "test/unit-tests/**/*.ts,src/**/*.ts" +--- + +# Test Coverage Agent — Self-Audit Protocol + +You are improving test coverage for `microsoft/vscode-cmake-tools`. +This file contains mandatory protocol. Read all of it before writing code. + +## Step 1 — Orient before writing + +- Read every source file you will test in full +- Read existing tests for that module (if any) in `test/unit-tests/backend/` +- Identify every exported function, class, and branch condition +- Do **not** write tests for private implementation details — test the public API +- If a source file deeply depends on `vscode` APIs, skip it — note in the PR that it needs integration-test coverage + +## Step 2 — Write real tests, not stubs + +Every test must: +- Have a descriptive name: `'expandString handles undefined variable in preset context'` +- Assert exactly one logical behavior per `test()` block +- Not depend on side effects from another test +- Use `assert.strictEqual` / `assert.deepStrictEqual` over loose equality +- For async code: `await` and assert the resolved value — never `.then()` + +## Step 3 — Run the full self-audit before opening the PR + +```bash +# 1. Type-check test files +npx tsc -p test.tsconfig.json --noEmit + +# 2. Lint +yarn lint + +# 3. Run backend tests (this is the primary validation step) +yarn backendTests + +# 4. Confirm coverage improved for the specific file +npx c8 --all --reporter=text --src=src \ + node ./node_modules/mocha/bin/_mocha \ + -u tdd --timeout 999999 --colors \ + -r ts-node/register \ + -r tsconfig-paths/register \ + "./test/unit-tests/backend/**/*.test.ts" +``` + +All steps must pass. If any fail, fix the failures before opening the PR. + +> **Note:** `yarn unitTests` requires a VS Code extension host and a display server. +> It cannot be run in headless agent environments. The CI workflow validates those +> separately — you only need to run `yarn backendTests` and `yarn lint` locally. + +## Step 4 — Coverage bar + +Do **not** open the PR unless every file listed in the issue has either: +- improved by ≥ 10 percentage points from the baseline in the issue, **OR** +- reached ≥ 60% line coverage + +## Test quality rules specific to this repo + +| Rule | Why | +|------|-----| +| Test both `useCMakePresets` branches where the source branches on it | Most bugs affect only one mode | +| Test both single-config and multi-config generator paths where relevant | `CMAKE_BUILD_TYPE` vs `--config` are frequent bug sources | +| For `src/expand.ts` changes: test every macro type | `copilot-instructions.md` explicitly mandates this | +| For `src/diagnostics/`: test each compiler family's parser | `diagnostics.test.ts` is the largest test file — keep it comprehensive | +| Use `@cmt/` path alias for imports from `src/` | Never use relative paths from outside `src/` | +| Never use `console.log` in test files | Use the module logger or plain `assert` | + +## PR requirements + +- Branch name: `coverage/-tests` +- Open as **ready for review** only after the self-audit checklist in the issue is fully checked +- **PR description must use the coverage template**: copy the contents of `.github/PULL_REQUEST_TEMPLATE/coverage.md` into the PR body (or append `?template=coverage.md` to the PR creation URL). Fill in the coverage-delta table and check every self-audit box. +- `CHANGELOG.md` must have one entry under `Improvements:` diff --git a/.github/scripts/check-coverage-and-open-issue.mjs b/.github/scripts/check-coverage-and-open-issue.mjs new file mode 100644 index 0000000000..c2ee43e9c2 --- /dev/null +++ b/.github/scripts/check-coverage-and-open-issue.mjs @@ -0,0 +1,217 @@ +#!/usr/bin/env node +// @ts-check +import { readFileSync, writeFileSync, unlinkSync } from 'fs'; +import { spawnSync } from 'child_process'; +import { relative, resolve, join } from 'path'; +import { tmpdir } from 'os'; + +const THRESHOLD = Number(process.env.THRESHOLD ?? 60); +const SUMMARY_PATH = 'coverage/coverage-summary.json'; +const REPO = process.env.GITHUB_REPOSITORY; // e.g. "microsoft/vscode-cmake-tools" + +if (!REPO) { + console.error('GITHUB_REPOSITORY is not set — are you running outside GitHub Actions?'); + process.exit(1); +} + +const RUN_URL = `https://github.com/${REPO}/actions/runs/${process.env.GITHUB_RUN_ID}`; + +// ── 1. Read Istanbul JSON summary ──────────────────────────────────────────── +let summary; +try { + summary = JSON.parse(readFileSync(SUMMARY_PATH, 'utf8')); +} catch { + console.log('No coverage summary found — skipping issue creation.'); + process.exit(0); +} + +// ── 2. Find files below threshold ──────────────────────────────────────────── +const belowThreshold = []; +const repoRoot = resolve('.'); + +for (const [file, metrics] of Object.entries(summary)) { + if (file === 'total') continue; + + // Normalize: c8/Istanbul may emit absolute paths or repo-relative paths + const relPath = file.startsWith('/') || /^[A-Za-z]:[/\\]/.test(file) + ? relative(repoRoot, file).replace(/\\/g, '/') + : file; + + if (!relPath.startsWith('src/')) continue; + + const linePct = metrics.lines.pct ?? 0; + const branchPct = metrics.branches.pct ?? 0; + const fnPct = metrics.functions.pct ?? 0; + + if (linePct < THRESHOLD || fnPct < THRESHOLD) { + belowThreshold.push({ file: relPath, linePct, branchPct, fnPct }); + } +} + +const total = summary.total ?? {}; +const totalLines = total.lines?.pct ?? 0; + +console.log(`\nTotal line coverage: ${totalLines}% (threshold: ${THRESHOLD}%)`); +console.log(`Files below threshold: ${belowThreshold.length}`); + +if (belowThreshold.length === 0 && totalLines >= THRESHOLD) { + console.log('✅ Coverage is above threshold — no issue needed.'); + process.exit(0); +} + +// ── 3. Check for existing open coverage issue (avoid duplicates) ───────────── +let existingIssueNumber = null; +try { + const result = spawnSync('gh', [ + 'issue', 'list', + '--repo', REPO, + '--label', 'test-coverage', + '--state', 'open', + '--json', 'number', + '--jq', '.[0].number' + ], { encoding: 'utf8' }); + if (result.status === 0 && result.stdout.trim()) { + existingIssueNumber = result.stdout.trim(); + } +} catch { + // gh CLI may fail if label doesn't exist yet — continue to create +} + +// ── 4. Build the issue body (this is the Copilot agent's instruction set) ──── +belowThreshold.sort((a, b) => a.linePct - b.linePct); // worst files first + +const tableRows = belowThreshold + .slice(0, 20) // cap at 20 files per issue to keep it focused + .map(f => `| \`${f.file}\` | ${f.linePct}% | ${f.branchPct}% | ${f.fnPct}% |`) + .join('\n'); + +const fileList = belowThreshold + .slice(0, 20) + .map(f => `- \`${f.file}\` — ${f.linePct}% line coverage`) + .join('\n'); + +const remainingCount = belowThreshold.length - Math.min(belowThreshold.length, 20); +const remainingNote = remainingCount > 0 + ? `\n\n> **${remainingCount} additional files** are also below threshold. They will appear here once the files above improve.` + : ''; + +const issueBody = `\ +## Coverage below ${THRESHOLD}% threshold + +> **This issue is the instruction set for the GitHub Copilot coding agent.** +> Copilot: read this entire body before writing a single line of code. + +**Coverage run:** ${RUN_URL} +**Total line coverage:** ${totalLines}% — threshold is ${THRESHOLD}% + +### Files requiring new tests + +| File | Lines | Branches | Functions | +|------|-------|----------|-----------| +${tableRows} + +--- + +### Agent instructions + +You are improving test coverage in \`microsoft/vscode-cmake-tools\`. +Read \`.github/instructions/copilot-test-coverage.instructions.md\` before starting — it contains the +mandatory self-audit protocol and test quality rules for this repo. + +**Files to cover (worst first):** +${fileList} + +For each file: +1. Read the source file fully before writing any test +2. Identify the module's exported API surface +3. Write tests in \`test/unit-tests/backend/\` that cover the uncovered branches +4. Run the self-audit steps from \`.github/instructions/copilot-test-coverage.instructions.md\` +5. Only open the PR after every self-audit step passes + +### Self-audit checklist (must be checked before opening PR) + +- [ ] \`yarn backendTests\` passes with no new failures +- [ ] Each file listed above improved by ≥ 10 percentage points OR reached ≥ ${THRESHOLD}% line coverage +- [ ] No test uses \`assert.ok(true)\` or is an empty stub +- [ ] Test names describe behavior: \`'expandString handles undefined variable'\` not \`'test 1'\` +- [ ] No test depends on another test's side effects +- [ ] Presets-mode and kits/variants mode both exercised where the source branches on \`useCMakePresets\` +- [ ] Single-config and multi-config generator paths both tested where relevant +- [ ] \`yarn lint\` passes +- [ ] \`CHANGELOG.md\` has an entry under \`Improvements:\` + +### Scope and testability + +Coverage is collected only from \`yarn backendTests\` (\`test/unit-tests/backend/\`). +New tests **must** go in \`test/unit-tests/backend/\` and run in plain Node.js (no VS Code host). + +- If a \`src/\` file can be imported directly (no \`vscode\` dependency at import time), write backend tests for it. +- If a file deeply depends on \`vscode\` APIs (e.g., \`extension.ts\`, \`projectController.ts\`, UI modules), **skip it** — add a comment in the PR noting it needs integration-test coverage instead. +- Pure logic modules (\`expand.ts\`, \`shlex.ts\`, \`cache.ts\`, \`diagnostics/\`, \`preset.ts\`) are ideal targets. +${remainingNote} + +### PR template + +When opening the pull request, **you must use the coverage PR template**. +Include \`?template=coverage.md\` in the PR creation URL, or copy the contents of +\`.github/PULL_REQUEST_TEMPLATE/coverage.md\` into the PR description and fill in +the coverage table and checklist. + +### Constraints + +- Tests go in \`test/unit-tests/backend/\` — use Mocha \`suite\`/\`test\` with \`assert\` +- Validate with \`yarn backendTests\`, not \`yarn unitTests\` (which requires a VS Code host) +- Import source under test via the \`@cmt/\` path alias +- Do **not** open the PR as a draft if the self-audit fails — fix it first +- Do **not** touch source files outside \`test/\` +`; + +// ── 5. Ensure the test-coverage label exists ───────────────────────────────── +{ + const result = spawnSync('gh', [ + 'label', 'create', 'test-coverage', + '--repo', REPO, + '--color', '0075ca', + '--description', 'Opened by the coverage agent', + '--force' + ], { stdio: 'inherit' }); + // Non-zero is acceptable here — label may already exist without --force support + if (result.error) { + console.warn('Warning: could not ensure test-coverage label exists:', result.error.message); + } +} + +// ── 6. Create or update the coverage issue ─────────────────────────────────── +const title = `Test coverage below ${THRESHOLD}% threshold — ${belowThreshold.length} files need tests (${new Date().toISOString().slice(0, 10)})`; + +// Write body to a temp file to avoid shell injection via file paths in the body +const bodyFile = join(tmpdir(), `coverage-issue-body-${Date.now()}.md`); +writeFileSync(bodyFile, issueBody, 'utf8'); + +try { + let result; + if (existingIssueNumber) { + console.log(`\nUpdating existing issue #${existingIssueNumber}`); + result = spawnSync('gh', [ + 'issue', 'edit', existingIssueNumber, + '--repo', REPO, + '--title', title, + '--body-file', bodyFile + ], { stdio: 'inherit' }); + } else { + console.log(`\nOpening issue: ${title}`); + result = spawnSync('gh', [ + 'issue', 'create', + '--repo', REPO, + '--title', title, + '--body-file', bodyFile, + '--label', 'test-coverage' + ], { stdio: 'inherit' }); + } + if (result.status !== 0) { + console.error(`gh command failed with exit code ${result.status}`); + process.exit(result.status ?? 1); + } +} finally { + try { unlinkSync(bodyFile); } catch { /* cleanup best-effort */ } +} diff --git a/.github/workflows/coverage-agent.yml b/.github/workflows/coverage-agent.yml new file mode 100644 index 0000000000..688e6c1c75 --- /dev/null +++ b/.github/workflows/coverage-agent.yml @@ -0,0 +1,76 @@ +name: Coverage Agent + +on: + schedule: + - cron: '0 3 * * 1' # weekly Monday 03:00 UTC + workflow_dispatch: + inputs: + threshold: + description: 'Line-coverage threshold (0-100)' + required: false + default: '60' + +env: + THRESHOLD: ${{ github.event.inputs.threshold || '60' }} + +jobs: + coverage: + runs-on: ubuntu-latest + permissions: + contents: read + issues: write + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install Yarn + run: npm install -g yarn + + - name: Install dependencies + run: yarn install + + - name: Build (test config) + run: yarn pretest # tsc -p test.tsconfig.json + + # ── Coverage: backend tests (c8 uses V8 native coverage) ─────────── + - name: Run backend tests with coverage + run: | + npx c8 \ + --all \ + --reporter=json-summary \ + --reporter=text \ + --src=src \ + --include='src/**/*.ts' \ + --exclude='src/**/*.d.ts' \ + -o coverage \ + node ./node_modules/mocha/bin/_mocha \ + -u tdd --timeout 999999 --colors \ + -r ts-node/register \ + -r tsconfig-paths/register \ + "./test/unit-tests/backend/**/*.test.ts" + + # ── Unit tests (extension host — coverage not collected here) ────── + # c8/nyc cannot instrument the VS Code extension-host child process. + # This step validates tests pass; coverage comes from backend tests. + - name: Run unit tests + uses: GabrielBB/xvfb-action@v1.6 + with: + run: node ./out/test/unit-tests/runTest.js + + - name: Upload coverage artifacts + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: coverage/ + retention-days: 14 + + # ── Evaluate coverage and open issue if below threshold ─────────────── + - name: Check coverage and open issue + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + THRESHOLD: ${{ env.THRESHOLD }} + run: node .github/scripts/check-coverage-and-open-issue.mjs diff --git a/.gitignore b/.gitignore index 501f85a22f..a6ca4b4cdf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ +.nyc_output/ .vscode-test/ build/ +coverage/ dist/ node_modules/ out/ diff --git a/package.json b/package.json index f5fef85269..3560405e8c 100644 --- a/package.json +++ b/package.json @@ -4452,6 +4452,7 @@ "chai": "^4.3.0", "chai-as-promised": "^7.1.1", "chai-string": "^1.5.0", + "c8": "^10.1.0", "eslint": "^8.42.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsdoc": "^48.2.8", diff --git a/yarn.lock b/yarn.lock index 61e41e3dcd..24edab5961 100644 --- a/yarn.lock +++ b/yarn.lock @@ -136,6 +136,11 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@bcoe/v8-coverage@^1.0.1": + version "1.0.2" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz#bbe12dca5b4ef983a0d0af4b07b9bc90ea0ababa" + integrity sha1-u+EtyltO+YOg0K9LB7m8kOoKuro= + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" @@ -249,6 +254,11 @@ resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@isaacs/cliui/-/cliui-9.0.0.tgz#4d0a3f127058043bf2e7ee169eaf30ed901302f3" integrity sha1-TQo/EnBYBDvy5+4Wnq8w7ZATAvM= +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg= + "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" @@ -286,6 +296,14 @@ resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha1-MYi8snOkFLDSFf0ipYVAuYm5QJo= +"@jridgewell/trace-mapping@^0.3.12": + version "0.3.31" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha1-2xXWeByTHzolGj2sOVAcmKYIL9A= + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" @@ -623,6 +641,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha1-dznCMqH+6bTTzomF8xTAxtM1Sdc= + "@types/js-yaml@^4.0.0": version "4.0.5" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@types/js-yaml/-/js-yaml-4.0.5.tgz" @@ -1659,6 +1682,13 @@ brace-expansion@^5.0.2: dependencies: balanced-match "^4.0.2" +brace-expansion@^5.0.5: + version "5.0.5" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" + integrity sha1-3MOjcRa3nz4bRtuZTO1dVw6TD9s= + dependencies: + balanced-match "^4.0.2" + braces@^2.3.1, braces@^2.3.2, braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -1723,6 +1753,23 @@ builtin-modules@^1.1.1: resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/builtin-modules/-/builtin-modules-1.1.1.tgz" integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== +c8@^10.1.0: + version "10.1.3" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/c8/-/c8-10.1.3.tgz#54afb25ebdcc7f3b00112482c6d90d7541ad2fcd" + integrity sha1-VK+yXr3MfzsAESSCxtkNdUGtL80= + dependencies: + "@bcoe/v8-coverage" "^1.0.1" + "@istanbuljs/schema" "^0.1.3" + find-up "^5.0.0" + foreground-child "^3.1.1" + istanbul-lib-coverage "^3.2.0" + istanbul-lib-report "^3.0.1" + istanbul-reports "^3.1.6" + test-exclude "^7.0.1" + v8-to-istanbul "^9.0.0" + yargs "^17.7.2" + yargs-parser "^21.1.1" + cache-base@^1.0.1: version "1.0.1" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/cache-base/-/cache-base-1.0.1.tgz" @@ -3432,7 +3479,7 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -foreground-child@^3.1.0, foreground-child@^3.3.1: +foreground-child@^3.1.0, foreground-child@^3.1.1, foreground-child@^3.3.1: version "3.3.1" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" integrity sha1-Mujp7Rtoo0l777msK2rfkqY4V28= @@ -3717,7 +3764,7 @@ glob-watcher@^5.0.3: normalize-path "^3.0.0" object.defaults "^1.1.0" -glob@^10.4.5: +glob@^10.4.1, glob@^10.4.5: version "10.5.0" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" integrity sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w= @@ -4098,6 +4145,11 @@ hosted-git-info@^2.1.4, hosted-git-info@^3.0.8, hosted-git-info@^4.0.2: dependencies: lru-cache "^6.0.0" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha1-39YAJ9o2o238viNiYsAKWCJoFFM= + htmlparser2@^6.1.0: version "6.1.0" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/htmlparser2/-/htmlparser2-6.1.0.tgz" @@ -4677,6 +4729,28 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/isobject/-/isobject-3.0.1.tgz" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha1-LRZsSwZE1Do58Ev2wu3R5YXzF1Y= + +istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: + version "3.0.1" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha1-kIMFusmlvRdaxqdEier9D8JEWn0= + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-reports@^3.1.6: + version "3.2.0" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93" + integrity sha1-y0U1FitXhKpiPO4hpyUs8sgHrJM= + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + jackspeak@^3.1.2: version "3.4.3" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" @@ -5076,6 +5150,13 @@ lru-queue@^0.1.0: dependencies: es5-ext "~0.10.2" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha1-w8IwencSd82WODBfkVwprnQbYU4= + dependencies: + semver "^7.5.3" + make-error@^1.1.1: version "1.3.6" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/make-error/-/make-error-1.3.6.tgz" @@ -5230,6 +5311,13 @@ minimatch@^10.1.1: dependencies: brace-expansion "^5.0.2" +minimatch@^10.2.2: + version "10.2.5" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" + integrity sha1-vUhoegvjjtKWE5kQVgD4MglYYdE= + dependencies: + brace-expansion "^5.0.5" + minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^3.1.5, minimatch@^5.1.6, minimatch@^9.0.5: version "3.1.5" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" @@ -6540,16 +6628,16 @@ semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2: dependencies: lru-cache "^6.0.0" +semver@^7.5.3, semver@^7.6.0: + version "7.7.4" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha1-KEZONgYOmR+noR0CedLT87V6foo= + semver@^7.5.4, semver@^7.6.3: version "7.6.3" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -semver@^7.6.0: - version "7.7.4" - resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" - integrity sha1-KEZONgYOmR+noR0CedLT87V6foo= - serialize-javascript@^6.0.2, serialize-javascript@^7.0.4: version "7.0.4" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/serialize-javascript/-/serialize-javascript-7.0.4.tgz#c517735bd5b7631dd1fc191ee19cbb713ff8e05c" @@ -7231,6 +7319,15 @@ terser@^5.31.1: commander "^2.20.0" source-map-support "~0.5.20" +test-exclude@^7.0.1: + version "7.0.2" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/test-exclude/-/test-exclude-7.0.2.tgz#482392077630bc57d5630c13abe908bb910dfc65" + integrity sha1-SCOSB3YwvFfVYwwTq+kIu5EN/GU= + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^10.4.1" + minimatch "^10.2.2" + text-decoder@^1.1.0: version "1.2.7" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/text-decoder/-/text-decoder-1.2.7.tgz#5d073a9a74b9c0a9d28dfadcab96b604af57d8ba" @@ -7720,6 +7817,15 @@ uuid@^8.3.0, uuid@~8.3.2: resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +v8-to-istanbul@^9.0.0: + version "9.3.0" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha1-uVcqv6Yr1VbBbXX968GkEdX/MXU= + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + v8flags@^3.2.0: version "3.2.0" resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/v8flags/-/v8flags-3.2.0.tgz"