@cldmv/vitest-runner 1.4.4 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -68,6 +68,7 @@ vitest-runner [OPTIONS] [PATTERNS...]
68
68
  | `--file-pattern <regex>` | Override the file discovery regex (default: `\.test\.vitest\.(?:js\|mjs\|cjs)$`) |
69
69
  | `--workers <n>` | Number of parallel workers (default: `4` or `VITEST_WORKERS`) |
70
70
  | `--solo-pattern <pat>` | Run files matching this path substring solo (one at a time) before the worker pool; repeatable |
71
+ | `--exclude <glob>` | Directory / file glob, relative to `cwd`, that discovery never enters (e.g. `tmp/**`); repeatable |
71
72
  | `--no-error-details` | Hide inline error blocks — show only counts in the summary |
72
73
  | `--coverage-quiet` | Implies `--coverage`; suppress per-file output and show only a live progress bar and final summaries |
73
74
  | `--log-file <path>` | Write a clean (ANSI-stripped) copy of all output to this file. Defaults to `coverage/coverage-run.log` when `--coverage-quiet` is active |
@@ -148,6 +149,9 @@ vitest-runner --file-pattern '\.spec\.ts$'
148
149
  # Run 2 workers, with certain files running solo first
149
150
  vitest-runner --workers 2 --solo-pattern heavy/ --solo-pattern listener-cleanup/
150
151
 
152
+ # Skip scratch worktrees / build output when discovery walks the repo root
153
+ vitest-runner --exclude 'tmp/**' --exclude 'dist/**'
154
+
151
155
  # Custom heap and worker count
152
156
  VITEST_HEAP_MB=8192 vitest-runner --workers 2 src/tests/heavy
153
157
 
@@ -196,6 +200,7 @@ process.exit(code);
196
200
  | `testPatterns` | `string[]` | `[]` | File / folder patterns to filter — empty means all files in `testDir` |
197
201
  | `testListFile` | `string` | `undefined` | Path to a JSON array of test file paths; when set, scanning is skipped entirely |
198
202
  | `testFilePattern` | `RegExp` | `DEFAULT_TEST_FILE_PATTERN` | Regex matched against file names during discovery (`*.test.vitest.{js,mjs,cjs}` by default) |
203
+ | `exclude` | `string[]` | `[]` | Directory / file globs, relative to `cwd`, that discovery never enters (e.g. `['tmp/**']`). Applies to both the default scan and partial-path pattern resolution |
199
204
  | `vitestArgs` | `string[]` | `[]` | Extra CLI args forwarded verbatim to every vitest invocation |
200
205
  | `showErrorDetails` | `boolean` | `true` | Print inline error blocks under each failed file in the summary |
201
206
  | `coverageQuiet` | `boolean` | `false` | Suppress per-file output; show only the progress bar and final summaries |
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{createWriteStream as Wt,mkdirSync as Ut}from"fs";import be from"path";var Mt=new Set(["--test-list","--no-error-details","--coverage-quiet","--log-file","--suppress-file-output","--suppress-passing-files","--no-top-summary","--json","--blobs-dir","--no-merge-reports","--workers","--solo-pattern","--file-pattern","--keep-tmp","--scratch-dir","--help","-h"]);function st(e){let s=[],t=[],n=[],o,r=!0,l=!1,c,g=!1,a=!1,u=!0,f=!1,S,v=!0,h,y=!1,b,d=!1,x;for(let w=0;w<e.length;w++){let p=e[w];p==="--test-list"?o=e[++w]:p.startsWith("--test-list=")?o=p.slice(12):p==="--no-error-details"?r=!1:p==="--coverage-quiet"?l=!0:p==="--log-file"?c=e[++w]:p.startsWith("--log-file=")?c=p.slice(11):p==="--suppress-file-output"?g=!0:p==="--suppress-passing-files"?a=!0:p==="--no-top-summary"?u=!1:p==="--json"?f=!0:p==="--blobs-dir"?S=e[++w]:p.startsWith("--blobs-dir=")?S=p.slice(12):p==="--no-merge-reports"?v=!1:p==="--workers"?h=parseInt(e[++w],10):p.startsWith("--workers=")?h=parseInt(p.slice(10),10):p==="--solo-pattern"?n.push(e[++w]):p.startsWith("--solo-pattern=")?n.push(p.slice(15)):p==="--file-pattern"?b=new RegExp(e[++w],"i"):p.startsWith("--file-pattern=")?b=new RegExp(p.slice(15),"i"):p==="--keep-tmp"?d=!0:p==="--scratch-dir"?x=e[++w]:p.startsWith("--scratch-dir=")?x=p.slice(14):p==="--help"||p==="-h"?y=!0:(p.startsWith("--")||p.startsWith("-"))&&!Mt.has(p)?(s.push(p),w+1<e.length&&!e[w+1].startsWith("-")&&s.push(e[++w])):t.push(p)}return{testListFile:o,showErrorDetails:r,coverageQuiet:l,logFile:c,suppressFileOutput:g,suppressPassingFiles:a,topSummary:u,json:f,blobsDir:S,mergeReports:v,help:y,workers:h,soloPatterns:n,testFilePattern:b,vitestPassthroughArgs:s,testPatterns:t,keepTmp:d,scratchDir:x}}import Z from"chalk";function ot(){console.log(`
2
+ import{createWriteStream as zt,mkdirSync as qt}from"fs";import be from"path";var Ot=new Set(["--test-list","--no-error-details","--coverage-quiet","--log-file","--suppress-file-output","--suppress-passing-files","--no-top-summary","--json","--blobs-dir","--no-merge-reports","--workers","--solo-pattern","--exclude","--file-pattern","--keep-tmp","--scratch-dir","--help","-h"]);function rt(e){let t=[],s=[],r=[],o=[],n,l=!0,u=!1,c,a=!1,p=!1,f=!0,h=!1,b,v=!0,y,S=!1,d,T=!1,P;for(let w=0;w<e.length;w++){let g=e[w];g==="--test-list"?n=e[++w]:g.startsWith("--test-list=")?n=g.slice(12):g==="--no-error-details"?l=!1:g==="--coverage-quiet"?u=!0:g==="--log-file"?c=e[++w]:g.startsWith("--log-file=")?c=g.slice(11):g==="--suppress-file-output"?a=!0:g==="--suppress-passing-files"?p=!0:g==="--no-top-summary"?f=!1:g==="--json"?h=!0:g==="--blobs-dir"?b=e[++w]:g.startsWith("--blobs-dir=")?b=g.slice(12):g==="--no-merge-reports"?v=!1:g==="--workers"?y=parseInt(e[++w],10):g.startsWith("--workers=")?y=parseInt(g.slice(10),10):g==="--solo-pattern"?r.push(e[++w]):g.startsWith("--solo-pattern=")?r.push(g.slice(15)):g==="--exclude"?o.push(e[++w]):g.startsWith("--exclude=")?o.push(g.slice(10)):g==="--file-pattern"?d=new RegExp(e[++w],"i"):g.startsWith("--file-pattern=")?d=new RegExp(g.slice(15),"i"):g==="--keep-tmp"?T=!0:g==="--scratch-dir"?P=e[++w]:g.startsWith("--scratch-dir=")?P=g.slice(14):g==="--help"||g==="-h"?S=!0:(g.startsWith("--")||g.startsWith("-"))&&!Ot.has(g)?(t.push(g),w+1<e.length&&!e[w+1].startsWith("-")&&t.push(e[++w])):s.push(g)}return{testListFile:n,showErrorDetails:l,coverageQuiet:u,logFile:c,suppressFileOutput:a,suppressPassingFiles:p,topSummary:f,json:h,blobsDir:b,mergeReports:v,help:S,workers:y,soloPatterns:r,exclude:o,testFilePattern:d,vitestPassthroughArgs:t,testPatterns:s,keepTmp:T,scratchDir:P}}import Z from"chalk";function nt(){console.log(`
3
3
  ${Z.bold("Vitest Sequential Runner")}
4
4
  Runs each test file in its own Vitest process to avoid OOM issues.
5
5
 
@@ -11,6 +11,7 @@ ${Z.bold("SPECIAL FLAGS:")}
11
11
  --file-pattern <regex> Override the file discovery regex (default: \\.test\\.vitest\\.(?:js|mjs|cjs)$)
12
12
  --workers <n> Number of parallel workers (default: 4 or VITEST_WORKERS)
13
13
  --solo-pattern <pat> Run files matching this path substring solo first (repeatable)
14
+ --exclude <glob> Directory / file glob discovery never enters, relative to cwd (repeatable)
14
15
  --no-error-details Hide detailed error output (show only counts)
15
16
  --coverage-quiet Implies --coverage; show progress bar + final summaries only
16
17
  --log-file <path> Path for mirrored runner output (default: coverage/coverage-run.log with --coverage-quiet)
@@ -66,6 +67,9 @@ ${Z.bold("ENVIRONMENT VARIABLES:")}
66
67
  # Run files matching a pattern solo first, then the rest in parallel
67
68
  vitest-runner --solo-pattern listener-cleanup/ --solo-pattern heavy/
68
69
 
70
+ # Skip scratch worktrees when discovery walks the repo root
71
+ vitest-runner --exclude 'tmp/**' --exclude 'dist/**'
72
+
69
73
  # Hide detailed errors
70
74
  vitest-runner --no-error-details
71
75
 
@@ -74,50 +78,50 @@ ${Z.bold("ENVIRONMENT VARIABLES:")}
74
78
 
75
79
  # Custom heap and workers
76
80
  VITEST_HEAP_MB=8192 vitest-runner --workers 2 src/tests/heavy
77
- `)}import G from"fs/promises";import ve from"path";import $ from"chalk";import{createRequire as Ot}from"module";import X from"path";import Rt from"fs/promises";import{pathToFileURL as kt}from"url";function ke(e,s,t=s){let n=Ot(kt(X.join(e,"package.json"))),o=n.resolve(`${s}/package.json`),r=n(o),l=r.bin?.[t]??r.bin;if(!l)throw new Error(`No bin "${t}" found in ${s}/package.json`);return X.join(X.dirname(o),l)}var Dt=Object.freeze(["vitest.config.ts","vitest.config.mts","vitest.config.cts","vitest.config.mjs","vitest.config.js","vitest.config.cjs","vite.config.ts","vite.config.mts","vite.config.mjs","vite.config.js"]);async function De(e,s){if(s)return X.isAbsolute(s)?s:X.resolve(e,s);for(let t of Dt){let n=X.join(e,t);try{return await Rt.access(n),n}catch{}}}import Ae from"fs/promises";import C from"path";var rt=/\.test\.vitest\.(?:js|mjs|cjs)$/i;async function de(e,s,t=rt){let n=[e],o=[];for(;n.length;){let r=n.pop(),l;try{l=await Ae.readdir(r,{withFileTypes:!0})}catch{continue}for(let c of l){if(c.isDirectory()){if(c.name==="node_modules"||c.name.startsWith("."))continue;n.push(C.join(r,c.name));continue}c.isFile()&&t.test(c.name)&&o.push(C.relative(s,C.join(r,c.name)))}}return o}function ge(e,s=[]){let t=[],n=[];for(let o of e){let r=o.replace(/\\/g,"/"),l=s.findIndex(c=>r.includes(c));l!==-1?t.push({file:o,priorityIndex:l}):n.push(o)}return t.sort((o,r)=>o.priorityIndex-r.priorityIndex||o.file.localeCompare(r.file)),n.sort((o,r)=>o.localeCompare(r)),[...t.map(o=>o.file),...n]}function Ie(e){let s=e.map(n=>n.replace(/\\/g,"/")),t=new Map;for(let n=0;n<e.length;n++){let o=[];for(let r=0;r<e.length;r++)n!==r&&s[r].includes(s[n])&&o.push(e[r]);t.set(e[n],o)}return t}async function me(e){let{cwd:s,testDir:t,testPatterns:n=[],testListFile:o,testFilePattern:r=rt,earlyRunPatterns:l=[]}=e,c=t?C.isAbsolute(t)?t:C.resolve(s,t):s;if(o){let a=C.isAbsolute(o)?o:C.resolve(s,o),u;try{let f=await Ae.readFile(a,"utf8");u=JSON.parse(f)}catch(f){throw new Error(`Failed to read test list file "${a}": ${f.message}`,{cause:f})}if(!Array.isArray(u))throw new Error(`Test list file "${a}" must contain a JSON array of test file paths`);return console.log(`\u{1F4CB} Loading test list from: ${C.relative(s,a)}`),ge(u,l)}if(n.length===0){let a=await de(c,s,r);return ge(a,l)}let g=[];for(let a of n){let u=C.isAbsolute(a)?a:C.resolve(s,a),f=null;try{f=await Ae.stat(u)}catch{}if(f?.isFile())r.test(u)&&g.push(C.relative(s,u));else if(f?.isDirectory())g.push(...await de(u,s,r));else{let v=(await de(c,s,r)).filter(h=>h.replace(/\\/g,"/").includes(a.replace(/\\/g,"/")));v.length>0?g.push(...v):console.warn(`\u26A0\uFE0F No matches found for: ${a}`)}}return ge([...new Set(g)],l)}import{spawn as nt}from"child_process";function N(e){return e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"")}function ee(e){return typeof e=="number"&&Number.isFinite(e)}function te(e,s){return ee(e)?e.toFixed(s):"Unknown"}function z(e,s){if(!ee(s))return e.dim(te(s,2).padStart(6));let t=s.toFixed(2).padStart(6);return s>=80?e.green(t):s>=50?e.yellow(t):e.red(t)}function je(e){let s=N(e),t={testFilesPass:0,testFilesFail:0,testsPass:0,testsFail:0,testsSkip:0,duration:0,heapMb:null,errors:[]},n=s.match(/Test Files\s+(.+)/);if(n){let g=n[1],a=g.match(/(\d+)\s+passed/),u=g.match(/(\d+)\s+failed/);a&&(t.testFilesPass=parseInt(a[1],10)),u&&(t.testFilesFail=parseInt(u[1],10))}let o=s.match(/^\s*Tests\s+(.+)$/m);if(o){let g=o[1],a=g.match(/(\d+)\s+passed/),u=g.match(/(\d+)\s+failed/),f=g.match(/(\d+)\s+skipped/);a&&(t.testsPass=parseInt(a[1],10)),u&&(t.testsFail=parseInt(u[1],10)),f&&(t.testsSkip=parseInt(f[1],10))}let r=s.match(/Duration\s+([\d.]+)s/);r&&(t.duration=parseFloat(r[1])*1e3);let l=s.match(/(\d+)\s*MB\s+heap\s+used/i);l&&(t.heapMb=parseInt(l[1],10));let c=e.indexOf("Failed Tests");if(c!==-1){let g=e.indexOf(`
78
- Test Files`,c),a=g!==-1?e.substring(c,g):e.substring(c),u=/FAIL\s*(?:\x1B\[[0-9;]*[a-zA-Z]|\s)*tests\//g,f=[...a.matchAll(u)];for(let S=0;S<f.length;S++){let v=f[S].index,h=a.lastIndexOf(`
79
- `,v),y=h===-1?0:h,b=S<f.length-1?f[S+1].index:a.length,d=a.lastIndexOf(`
80
- `,b),x=d===-1?b:d,w=a.substring(y,x).trim();w&&t.errors.push(w)}}return t}function Ce(e){let t=e.join(`
81
+ `)}import G from"fs/promises";import ve from"path";import $ from"chalk";import{createRequire as kt}from"module";import X from"path";import Dt from"fs/promises";import{pathToFileURL as At}from"url";function ke(e,t,s=t){let r=kt(At(X.join(e,"package.json"))),o=r.resolve(`${t}/package.json`),n=r(o),l=n.bin?.[s]??n.bin;if(!l)throw new Error(`No bin "${s}" found in ${t}/package.json`);return X.join(X.dirname(o),l)}var It=Object.freeze(["vitest.config.ts","vitest.config.mts","vitest.config.cts","vitest.config.mjs","vitest.config.js","vitest.config.cjs","vite.config.ts","vite.config.mts","vite.config.mjs","vite.config.js"]);async function De(e,t){if(t)return X.isAbsolute(t)?t:X.resolve(e,t);for(let s of It){let r=X.join(e,s);try{return await Dt.access(r),r}catch{}}}import Ie from"fs/promises";import j from"path";var it=/\.test\.vitest\.(?:js|mjs|cjs)$/i;function jt(e){let t=e.replace(/\\/g,"/"),s="";for(let r=0;r<t.length;r++){let o=t[r];o==="*"&&t[r+1]==="*"?(s+=".*",r++):o==="*"?s+="[^/]*":o==="?"?s+="[^/]":s+=o.replace(/[.+^${}()|[\]\\]/g,"\\$&")}return new RegExp(`^${s}$`)}function Ae(e,t){return!t||t.length===0?!1:t.some(s=>jt(s).test(e))}async function de(e,t,s=it,r=[]){let o=[e],n=[];for(;o.length;){let l=o.pop(),u;try{u=await Ie.readdir(l,{withFileTypes:!0})}catch{continue}for(let c of u){let a=j.relative(t,j.join(l,c.name)).replace(/\\/g,"/");if(c.isDirectory()){if(c.name==="node_modules"||c.name.startsWith(".")||Ae(a,r)||Ae(`${a}/`,r))continue;o.push(j.join(l,c.name));continue}if(c.isFile()&&s.test(c.name)){if(Ae(a,r))continue;n.push(j.relative(t,j.join(l,c.name)))}}}return n}function ge(e,t=[]){let s=[],r=[];for(let o of e){let n=o.replace(/\\/g,"/"),l=t.findIndex(u=>n.includes(u));l!==-1?s.push({file:o,priorityIndex:l}):r.push(o)}return s.sort((o,n)=>o.priorityIndex-n.priorityIndex||o.file.localeCompare(n.file)),r.sort((o,n)=>o.localeCompare(n)),[...s.map(o=>o.file),...r]}function je(e){let t=e.map(r=>r.replace(/\\/g,"/")),s=new Map;for(let r=0;r<e.length;r++){let o=[];for(let n=0;n<e.length;n++)r!==n&&t[n].includes(t[r])&&o.push(e[n]);s.set(e[r],o)}return s}async function me(e){let{cwd:t,testDir:s,testPatterns:r=[],testListFile:o,testFilePattern:n=it,earlyRunPatterns:l=[],exclude:u=[]}=e,c=s?j.isAbsolute(s)?s:j.resolve(t,s):t;if(o){let p=j.isAbsolute(o)?o:j.resolve(t,o),f;try{let h=await Ie.readFile(p,"utf8");f=JSON.parse(h)}catch(h){throw new Error(`Failed to read test list file "${p}": ${h.message}`,{cause:h})}if(!Array.isArray(f))throw new Error(`Test list file "${p}" must contain a JSON array of test file paths`);return console.log(`\u{1F4CB} Loading test list from: ${j.relative(t,p)}`),ge(f,l)}if(r.length===0){let p=await de(c,t,n,u);return ge(p,l)}let a=[];for(let p of r){let f=j.isAbsolute(p)?p:j.resolve(t,p),h=null;try{h=await Ie.stat(f)}catch{}if(h?.isFile())n.test(f)&&a.push(j.relative(t,f));else if(h?.isDirectory())a.push(...await de(f,t,n,u));else{let v=(await de(c,t,n,u)).filter(y=>y.replace(/\\/g,"/").includes(p.replace(/\\/g,"/")));v.length>0?a.push(...v):console.warn(`\u26A0\uFE0F No matches found for: ${p}`)}}return ge([...new Set(a)],l)}import{spawn as lt}from"child_process";function L(e){return e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"")}function ee(e){return typeof e=="number"&&Number.isFinite(e)}function te(e,t){return ee(e)?e.toFixed(t):"Unknown"}function z(e,t){if(!ee(t))return e.dim(te(t,2).padStart(6));let s=t.toFixed(2).padStart(6);return t>=80?e.green(s):t>=50?e.yellow(s):e.red(s)}function Ce(e){let t=L(e),s={testFilesPass:0,testFilesFail:0,testsPass:0,testsFail:0,testsSkip:0,duration:0,heapMb:null,errors:[]},r=t.match(/Test Files\s+(.+)/);if(r){let c=r[1],a=c.match(/(\d+)\s+passed/),p=c.match(/(\d+)\s+failed/);a&&(s.testFilesPass=parseInt(a[1],10)),p&&(s.testFilesFail=parseInt(p[1],10))}let o=t.match(/^\s*Tests\s+(.+)$/m);if(o){let c=o[1],a=c.match(/(\d+)\s+passed/),p=c.match(/(\d+)\s+failed/),f=c.match(/(\d+)\s+skipped/);a&&(s.testsPass=parseInt(a[1],10)),p&&(s.testsFail=parseInt(p[1],10)),f&&(s.testsSkip=parseInt(f[1],10))}let n=t.match(/Duration\s+([\d.]+)s/);n&&(s.duration=parseFloat(n[1])*1e3);let l=t.match(/(\d+)\s*MB\s+heap\s+used/i);l&&(s.heapMb=parseInt(l[1],10));let u=e.indexOf("Failed Tests");if(u!==-1){let c=e.indexOf(`
82
+ Test Files`,u),a=c!==-1?e.substring(u,c):e.substring(u),p=/FAIL\s*(?:\x1B\[[0-9;]*[a-zA-Z]|\s)*tests\//g,f=[...a.matchAll(p)];for(let h=0;h<f.length;h++){let b=f[h].index,v=a.lastIndexOf(`
83
+ `,b),y=v===-1?0:v,S=h<f.length-1?f[h+1].index:a.length,d=a.lastIndexOf(`
84
+ `,S),T=d===-1?S:d,P=a.substring(y,T).trim();P&&s.errors.push(P)}}return s}function Ne(e){let s=e.join(`
81
85
  `).split(`
82
- `),n=new Map,o=new Map;t.forEach((l,c)=>{if(l.includes("FAIL")&&l.includes("Config:")){o.set(l,c);let a=N(l).match(/^(.+Config:\s+)'*([^'>]+)'*(.+)$/);if(a){let[,u,f,S]=a,v=`${u.trim()}|||${S.trim()}`;n.has(v)||n.set(v,{lines:[],configs:[]}),n.get(v).lines.push(l),n.get(v).configs.push(f.replace(/'/g,""))}}});let r=new Set;for(let[,l]of n.entries())if(l.configs.length>1){for(let f=1;f<l.lines.length;f++){let S=o.get(l.lines[f]);r.add(S)}let c=l.lines[0],g=`[${l.configs.map(f=>`'${f}'`).join(",")}]`,a=N(c).replace(/(Config:\s+)'*[^'>]+'*/,`$1${g}`),u=o.get(c);t[u]=a}return t.filter((l,c)=>!r.has(c)).join(`
83
- `)}function Ne({maxOldSpaceMb:e,conditions:s=[],base:t=process.env.NODE_OPTIONS??""}){let n=t;for(let o of s){let r=`--conditions=${o}`;n.includes(r)||(n=n?`${n} ${r}`:r)}if(e&&!n.includes("--max-old-space-size")){let o=`--max-old-space-size=${e}`;n=n?`${n} ${o}`:o}return n.trim()}function it({maxOldSpaceMb:e,conditions:s=[],nodeEnv:t="development",extraEnv:n={}}){let o={...process.env};o.NODE_ENV||(o.NODE_ENV=t);let r=Ne({maxOldSpaceMb:e,conditions:s,base:o.NODE_OPTIONS??""});return r&&(o.NODE_OPTIONS=r),Object.assign(o,n),o}function At(e,s){return[e,...s?["--config",s]:[],"run"]}function he(e,s){let{cwd:t,vitestBin:n,vitestConfig:o,maxOldSpaceMb:r,conditions:l=[],nodeEnv:c="development",vitestArgs:g=[],streamOutput:a=!0,excludePaths:u=[],extraEnv:f={}}=s;return new Promise(S=>{let v=Date.now(),h=u.flatMap(p=>["--exclude",p]),y=[...At(n,o),...g,...h,e],b=it({maxOldSpaceMb:r,conditions:l,nodeEnv:c,extraEnv:f}),d=nt(process.execPath,y,{cwd:t,stdio:["ignore","pipe","pipe"],env:b}),x="",w="";d.stdout?.on("data",p=>{x+=p.toString(),a&&process.stdout.write(p)}),d.stderr?.on("data",p=>{w+=p.toString(),a&&process.stderr.write(p)}),d.on("close",p=>{let V=Date.now()-v,_=`${x}
84
- ${w}`,P=je(_);S({file:e,code:p??1,duration:P.duration>0?P.duration:V,testFilesPass:P.testFilesPass,testFilesFail:P.testFilesFail,testsPass:P.testsPass,testsFail:P.testsFail,testsSkip:P.testsSkip,heapMb:P.heapMb,errors:P.errors,rawOutput:_})}),d.on("error",p=>{S({file:e,code:1,duration:Date.now()-v,testFilesPass:0,testFilesFail:1,testsPass:0,testsFail:0,testsSkip:0,heapMb:null,errors:[p.message],rawOutput:p.toString()})})})}function Le(e,s){let{cwd:t,vitestBin:n,vitestConfig:o,maxOldSpaceMb:r,conditions:l=[],nodeEnv:c="development",extraCoverageArgs:g=[],quietOutput:a=!1}=s;return new Promise(u=>{let f=o?["--config",o]:[],S=a?["--color"]:[],v=[n,...f,"--mergeReports",e,"--run","--coverage",...S,...g],h=it({maxOldSpaceMb:r,conditions:l,nodeEnv:c}),y=nt(process.execPath,v,{cwd:t,stdio:a?["ignore","pipe","pipe"]:"inherit",env:h}),b="",d="";a&&(y.stdout?.on("data",x=>b+=x.toString()),y.stderr?.on("data",x=>d+=x.toString())),y.on("close",x=>u({exitCode:x??1,output:`${b}
85
- ${d}`})),y.on("error",()=>u({exitCode:1,output:""}))})}import q from"chalk";function se(e){let s=Math.max(0,Math.floor(e/1e3)),t=Math.floor(s/3600),n=Math.floor(s%3600/60),o=s%60;return t>0?`${t}:${n.toString().padStart(2,"0")}:${o.toString().padStart(2,"0")}`:`${n}:${o.toString().padStart(2,"0")}`}function _e(e){let s=!!process.stdout.isTTY,t=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],n=26,o=Date.now(),r=0,l=0,c=0,g=0,a=0,u=0,f=null;function S(){let b=e===0?100:r/e*100,d=Date.now()-o,w=(r>0?d/r:0)*Math.max(e-r,0),p=Math.round(b/100*n),V=t[g%t.length],_=`[${"=".repeat(p)}${"-".repeat(Math.max(0,n-p))}]`,P=b.toFixed(1).padStart(5);return b<30?P=q.red(P+"%"):b<70?P=q.rgb(255,136,0)(P+"%"):b>99?P=q.green(P+"%"):P=q.yellow(P+"%"),s?`${q.green(V)} ${q.green(_)} ${q.bold(P)} ${r}/${e} | active ${l} | failed ${c} | ETA ${se(w)} | elapsed ${se(d)}`:`progress ${b.toFixed(1)}% ${r}/${e} | active ${l} | failed ${c} | eta ${se(w)} | elapsed ${se(d)}`}function v(b=!1){let d=S();if(g++,s){let w=d.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"").length;a=Math.max(a,w),process.stdout.write(`\r${d.padEnd(a," ")}`);return}let x=Date.now();(b||x-u>=2e3)&&(console.log(d),u=x)}function h(){!s||f||(f=setInterval(()=>{r>=e&&l===0||v()},120),f.unref?.())}function y(){f&&(clearInterval(f),f=null)}return v(!0),h(),{onStart(){l++,v()},onComplete(b){l=Math.max(0,l-1),r++,b&&c++,v(!0)},finish(){y(),v(!0),s&&process.stdout.write(`
86
- `)}}}var Ve={onStart(){},onComplete(e){},finish(){}};import lt from"fs/promises";import oe from"path";import O from"chalk";function Be(e){if(e.length!==0){console.log(`
87
- ${"=".repeat(80)}`),console.log(O.bold.red("\u2716 FAILED TEST FILES (VERBOSE OUTPUT)")),console.log("=".repeat(80));for(let s of e)console.log(`
88
- ${O.red("\u2716")} ${O.red(s.file)} ${O.dim(`(exit ${s.code})`)}`),s.rawOutput?.trim()?console.log(s.rawOutput.trimEnd()):console.log(O.dim("(no child output captured)"));console.log(`
89
- ${"=".repeat(80)}`)}}function We(e,s){if(e===0){let t="% Coverage report from v8",n=s.split(`
90
- `),o=n.findIndex(r=>N(r).includes(t));if(o>=0){let r=n.length;for(let c=o+1;c<n.length;c++){let g=N(n[c]).trimStart();if(g.startsWith("stderr |")||g.startsWith("stdout |")){r=c;break}}if(n.slice(o+1,r).join(`
91
- `).trimEnd()){let c=n.slice(o,r).join(`
86
+ `),r=new Map,o=new Map;s.forEach((l,u)=>{if(l.includes("FAIL")&&l.includes("Config:")){o.set(l,u);let a=L(l).match(/^(.+Config:\s+)'*([^'>]+)'*(.+)$/);if(a){let[,p,f,h]=a,b=`${p.trim()}|||${h.trim()}`;r.has(b)||r.set(b,{lines:[],configs:[]}),r.get(b).lines.push(l),r.get(b).configs.push(f.replace(/'/g,""))}}});let n=new Set;for(let[,l]of r.entries())if(l.configs.length>1){for(let f=1;f<l.lines.length;f++){let h=o.get(l.lines[f]);n.add(h)}let u=l.lines[0],c=`[${l.configs.map(f=>`'${f}'`).join(",")}]`,a=L(u).replace(/(Config:\s+)'*[^'>]+'*/,`$1${c}`),p=o.get(u);s[p]=a}return s.filter((l,u)=>!n.has(u)).join(`
87
+ `)}function Le({maxOldSpaceMb:e,conditions:t=[],base:s=process.env.NODE_OPTIONS??""}){let r=s;for(let o of t){let n=`--conditions=${o}`;r.includes(n)||(r=r?`${r} ${n}`:n)}if(e&&!r.includes("--max-old-space-size")){let o=`--max-old-space-size=${e}`;r=r?`${r} ${o}`:o}return r.trim()}function at({maxOldSpaceMb:e,conditions:t=[],nodeEnv:s="development",extraEnv:r={}}){let o={...process.env};o.NODE_ENV||(o.NODE_ENV=s);let n=Le({maxOldSpaceMb:e,conditions:t,base:o.NODE_OPTIONS??""});return n&&(o.NODE_OPTIONS=n),Object.assign(o,r),o}function Ct(e,t){return[e,...t?["--config",t]:[],"run"]}function he(e,t){let{cwd:s,vitestBin:r,vitestConfig:o,maxOldSpaceMb:n,conditions:l=[],nodeEnv:u="development",vitestArgs:c=[],streamOutput:a=!0,excludePaths:p=[],extraEnv:f={}}=t;return new Promise(h=>{let b=Date.now(),v=p.flatMap(w=>["--exclude",w]),y=[...Ct(r,o),...c,...v,e],S=at({maxOldSpaceMb:n,conditions:l,nodeEnv:u,extraEnv:f}),d=lt(process.execPath,y,{cwd:s,stdio:["ignore","pipe","pipe"],env:S}),T="",P="";d.stdout?.on("data",w=>{T+=w.toString(),a&&process.stdout.write(w)}),d.stderr?.on("data",w=>{P+=w.toString(),a&&process.stderr.write(w)}),d.on("close",w=>{let g=Date.now()-b,V=`${T}
88
+ ${P}`,M=Ce(V);h({file:e,code:w??1,duration:M.duration>0?M.duration:g,testFilesPass:M.testFilesPass,testFilesFail:M.testFilesFail,testsPass:M.testsPass,testsFail:M.testsFail,testsSkip:M.testsSkip,heapMb:M.heapMb,errors:M.errors,rawOutput:V})}),d.on("error",w=>{h({file:e,code:1,duration:Date.now()-b,testFilesPass:0,testFilesFail:1,testsPass:0,testsFail:0,testsSkip:0,heapMb:null,errors:[w.message],rawOutput:w.toString()})})})}function _e(e,t){let{cwd:s,vitestBin:r,vitestConfig:o,maxOldSpaceMb:n,conditions:l=[],nodeEnv:u="development",extraCoverageArgs:c=[],quietOutput:a=!1}=t;return new Promise(p=>{let f=o?["--config",o]:[],h=a?["--color"]:[],b=[r,...f,"--mergeReports",e,"--run","--coverage",...h,...c],v=at({maxOldSpaceMb:n,conditions:l,nodeEnv:u}),y=lt(process.execPath,b,{cwd:s,stdio:a?["ignore","pipe","pipe"]:"inherit",env:v}),S="",d="";a&&(y.stdout?.on("data",T=>S+=T.toString()),y.stderr?.on("data",T=>d+=T.toString())),y.on("close",T=>p({exitCode:T??1,output:`${S}
89
+ ${d}`})),y.on("error",()=>p({exitCode:1,output:""}))})}import q from"chalk";function se(e){let t=Math.max(0,Math.floor(e/1e3)),s=Math.floor(t/3600),r=Math.floor(t%3600/60),o=t%60;return s>0?`${s}:${r.toString().padStart(2,"0")}:${o.toString().padStart(2,"0")}`:`${r}:${o.toString().padStart(2,"0")}`}function Ve(e){let t=!!process.stdout.isTTY,s=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r=26,o=Date.now(),n=0,l=0,u=0,c=0,a=0,p=0,f=null;function h(){let S=e===0?100:n/e*100,d=Date.now()-o,P=(n>0?d/n:0)*Math.max(e-n,0),w=Math.round(S/100*r),g=s[c%s.length],V=`[${"=".repeat(w)}${"-".repeat(Math.max(0,r-w))}]`,M=S.toFixed(1).padStart(5);return S<30?M=q.red(M+"%"):S<70?M=q.rgb(255,136,0)(M+"%"):S>99?M=q.green(M+"%"):M=q.yellow(M+"%"),t?`${q.green(g)} ${q.green(V)} ${q.bold(M)} ${n}/${e} | active ${l} | failed ${u} | ETA ${se(P)} | elapsed ${se(d)}`:`progress ${S.toFixed(1)}% ${n}/${e} | active ${l} | failed ${u} | eta ${se(P)} | elapsed ${se(d)}`}function b(S=!1){let d=h();if(c++,t){let P=d.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"").length;a=Math.max(a,P),process.stdout.write(`\r${d.padEnd(a," ")}`);return}let T=Date.now();(S||T-p>=2e3)&&(console.log(d),p=T)}function v(){!t||f||(f=setInterval(()=>{n>=e&&l===0||b()},120),f.unref?.())}function y(){f&&(clearInterval(f),f=null)}return b(!0),v(),{onStart(){l++,b()},onComplete(S){l=Math.max(0,l-1),n++,S&&u++,b(!0)},finish(){y(),b(!0),t&&process.stdout.write(`
90
+ `)}}}var Be={onStart(){},onComplete(e){},finish(){}};import ct from"fs/promises";import oe from"path";import O from"chalk";function We(e){if(e.length!==0){console.log(`
91
+ ${"=".repeat(80)}`),console.log(O.bold.red("\u2716 FAILED TEST FILES (VERBOSE OUTPUT)")),console.log("=".repeat(80));for(let t of e)console.log(`
92
+ ${O.red("\u2716")} ${O.red(t.file)} ${O.dim(`(exit ${t.code})`)}`),t.rawOutput?.trim()?console.log(t.rawOutput.trimEnd()):console.log(O.dim("(no child output captured)"));console.log(`
93
+ ${"=".repeat(80)}`)}}function Ue(e,t){if(e===0){let s="% Coverage report from v8",r=t.split(`
94
+ `),o=r.findIndex(n=>L(n).includes(s));if(o>=0){let n=r.length;for(let u=o+1;u<r.length;u++){let c=L(r[u]).trimStart();if(c.startsWith("stderr |")||c.startsWith("stdout |")){n=u;break}}if(r.slice(o+1,n).join(`
95
+ `).trimEnd()){let u=r.slice(o,n).join(`
92
96
  `).trimEnd();console.log(`
93
- ${c}
94
- `)}}}else{let t=s.trimEnd();t&&console.error(t)}}function It(e){let s=(o,r)=>r===0?100:parseFloat((o/r*100).toFixed(2)),t={total:{statements:{total:0,covered:0,pct:0},branches:{total:0,covered:0,pct:0},functions:{total:0,covered:0,pct:0},lines:{total:0,covered:0,pct:0}}};for(let[o,r]of Object.entries(e)){let l=Object.keys(r.s??{}),c=l.length,g=l.filter(d=>r.s[d]>0).length,a=Object.keys(r.f??{}),u=a.length,f=a.filter(d=>r.f[d]>0).length,S=0,v=0;for(let d of Object.values(r.b??{}))S+=d.length,v+=d.filter(x=>x>0).length;let h=new Set,y=new Set;for(let[d,x]of Object.entries(r.statementMap??{})){let w=x?.start?.line;w!=null&&(y.add(w),(r.s??{})[d]>0&&h.add(w))}let b={statements:{total:c,covered:g,pct:s(g,c)},branches:{total:S,covered:v,pct:s(v,S)},functions:{total:u,covered:f,pct:s(f,u)},lines:{total:y.size,covered:h.size,pct:s(h.size,y.size)}};t[o]=b;for(let d of["statements","branches","functions","lines"])t.total[d].total+=b[d].total,t.total[d].covered+=b[d].covered}let n=Object.keys(e).length>0;for(let o of["statements","branches","functions","lines"]){let{total:r,covered:l}=t.total[o];t.total[o].pct=n?s(l,r):"Unknown"}return t}function jt({lines:e,stmts:s,fns:t,branches:n}){let o=[e,s,t,n].filter(ee);return o.length>0?Math.min(...o):null}function at(e){return e??Number.MAX_VALUE}function Ct({lines:e,stmts:s,fns:t,branches:n}){return![e,s,t,n].every(ee)}function Nt({lines:e,stmts:s,fns:t,branches:n}){console.log(`
95
- ${O.bold("Coverage")} ${z(O,e)}% lines ${O.dim("|")} ${z(O,s)}% statements ${O.dim("|")} ${z(O,t)}% functions ${O.dim("|")} ${z(O,n)}% branches`)}async function Ue(e,s,t=10,n={}){let{silent:o=!1}=n,r=oe.resolve(e,"coverage"),l=s.find(h=>h.startsWith("--coverage.reportsDirectory="));if(l){let h=l.split("=").slice(1).join("=");r=oe.isAbsolute(h)?h:oe.resolve(e,h)}let c;try{let h=await lt.readFile(oe.join(r,"coverage-summary.json"),"utf8");c=JSON.parse(h)}catch{try{let h=await lt.readFile(oe.join(r,"coverage-final.json"),"utf8");c=It(JSON.parse(h))}catch{return o||console.log(O.dim(" (no coverage JSON found \u2014 skipping summary)")),null}}let{total:g,...a}=c,u={lines:g.lines?.pct??0,stmts:g.statements?.pct??0,fns:g.functions?.pct??0,branches:g.branches?.pct??0},f=Object.keys(a).length===0&&!Object.values(u).some(ee),S=[],v=0;if(t>0){let h=Object.entries(a).map(([b,d])=>({file:oe.relative(e,b),lines:d.lines?.pct??0,stmts:d.statements?.pct??0,fns:d.functions?.pct??0,branches:d.branches?.pct??0})).map(b=>({row:b,worst:jt(b)})).filter(({row:b,worst:d})=>Ct(b)||d<100).sort((b,d)=>at(b.worst)-at(d.worst)),y=h.slice(0,t);o||(console.log(`
96
- `+O.bold("\u{1F4C9} WORST COVERAGE FILES (lowest metric)")),console.log("-".repeat(80)),y.forEach(({row:{file:b,lines:d,stmts:x,fns:w,branches:p},worst:V})=>{let _=O.dim(`lines ${te(d,0)}% | stmts ${te(x,0)}% | fns ${te(w,0)}% | branches ${te(p,0)}%`);console.log(` ${z(O,V)}% ${O.dim(b)} ${_}`)}),h.length>t&&console.log(O.dim(` ... and ${h.length-t} more files`))),S=y.map(({row:b})=>b),v=h.length}return o||(Nt(u),f&&console.log(O.dim(" No files were measured (the coverage include matched nothing), so every percentage is Unknown and coverage thresholds are skipped."))),{coverageDir:r,total:g,noFilesMeasured:f,worstFiles:S,worstFilesShown:S.length,worstFilesTotal:v,summary:c}}import ce from"fs/promises";import Lt from"fs";import pe from"path";var ct="tmp/vitest-runner",_t=/^(\d+)-\d+$/;function Vt(e){try{return process.kill(e,0),!0}catch(s){return s.code!=="ESRCH"}}async function pt(e,s){let t=pe.resolve(e,s),n;try{n=await ce.readdir(t,{withFileTypes:!0})}catch{return}for(let o of n){if(!o.isDirectory())continue;let r=o.name.match(_t);if(!r)continue;let l=parseInt(r[1],10);Vt(l)||await ce.rm(pe.join(t,o.name),{recursive:!0,force:!0}).catch(()=>{})}}async function ut(e,s){let t=pe.resolve(e,s),n=pe.join(t,`${process.pid}-${Date.now()}`);return await ce.mkdir(n,{recursive:!0}),n}async function He(e,s){let t=pe.join(e,`worker-${s}`);return await ce.mkdir(t,{recursive:!0}),t}async function ft(e){await ce.rm(e,{recursive:!0,force:!0}).catch(()=>{})}function dt(e){try{Lt.rmSync(e,{recursive:!0,force:!0})}catch{}}function gt(e,s,t){let n=e.replace(/\\/g,"/"),o;for(let{pattern:r,heapMb:l}of t)if(n.includes(r)){o=l;break}if(!(o===void 0&&s===void 0))return o===void 0?s:s===void 0?o:Math.max(o,s)}async function mt(e){let s=e.cwd??process.cwd(),t=e.scratchDir??ct,n=e.keepTmp??!1;await pt(s,t);let o=await ut(s,t),r=()=>{dt(o),process.exitCode=130,process.exit()};n||(process.once("SIGINT",r),process.once("SIGTERM",r));try{return await Bt(e,o)}finally{process.removeListener("SIGINT",r),process.removeListener("SIGTERM",r),n||await ft(o)}}async function Bt(e,s){let{cwd:t=process.cwd(),testDir:n,testPatterns:o=[],testListFile:r,testFilePattern:l,vitestArgs:c=[],showErrorDetails:g=!0,coverageQuiet:a=!1,suppressFileOutput:u=!1,suppressPassingFiles:f=!1,topSummary:S=!0,json:v=!1,workers:h=parseInt(process.env.VITEST_WORKERS??"4",10),worstCoverageCount:y=10,blobsDir:b,mergeReports:d=!0,earlyRunPatterns:x=[],perFileHeapOverrides:w=[],conditions:p=[],nodeEnv:V="development",_testResultsOverride:_=null}=e,P=0,B=e.maxOldSpaceMb??(process.env.VITEST_HEAP_MB?parseInt(process.env.VITEST_HEAP_MB,10):void 0),R=!v,ht=ke(t,"vitest","vitest"),vt=await De(t,e.vitestConfig),Se={cwd:t,vitestBin:ht,vitestConfig:vt,conditions:p,nodeEnv:V},A=[...c];if(a&&!A.some(i=>i==="--coverage"||i.startsWith("--coverage."))&&A.unshift("--coverage"),A.some(i=>i==="--coverage"||i.startsWith("--coverage."))){let i=ve.resolve(t,b??".vitest-coverage-blobs"),m=ve.resolve(t,".vitest-coverage-tmp");await Promise.all([G.rm(i,{recursive:!0,force:!0}),G.rm(m,{recursive:!0,force:!0})]),await Promise.all([G.mkdir(i,{recursive:!0}),G.mkdir(m,{recursive:!0})]);let T=await me({cwd:t,testDir:n,testPatterns:o,testListFile:r,testFilePattern:l,earlyRunPatterns:x}),k=Ie(T);if(T.length===0){let F=o.length>0?`\u274C No Vitest test files found matching: ${o.join(", ")}`:"\u274C No Vitest test files found";return R&&console.log(F),v?{exitCode:1,mode:"coverage",message:F,options:{cwd:t,testDir:n,testPatterns:o,testListFile:r,workers:h,coverageQuiet:a,suppressFileOutput:u,suppressPassingFiles:f,topSummary:S,vitestArgs:A}}:1}let j=A.filter(F=>F!=="--coverage"&&F.startsWith("--coverage.")),xe=A.filter(F=>F!=="--coverage"&&!F.startsWith("--coverage.")),le=T.filter(F=>x.some(M=>F.replace(/\\/g,"/").includes(M))),Te=T.filter(F=>!x.some(M=>F.replace(/\\/g,"/").includes(M))),Ee=a||u||v,Tt=a&&!v;!a&&!u&&R&&(console.log(`
97
- \u{1F9EA} Running ${T.length} test files for coverage (blob + merge mode)`),console.log(`\u2699\uFE0F Workers: ${h} (${le.length} solo first, then parallel)`),B&&console.log(`\u{1F9E0} Heap limit: ${B} MB`),console.log(""));let ye=Tt?_e(T.length):Ve,L=[],Pe=0,Ze=async F=>{let M=ve.join(i,`run-${Pe}.blob`);Pe++,!Ee&&R&&(console.log(`
98
- ${"=".repeat(80)}`),console.log(`\u25B6\uFE0F ${F}`),console.log("=".repeat(80))),ye.onStart();let U=ve.join(m,`run-${Pe}`),Et=[...xe,"--coverage",`--coverage.reportsDirectory=${U}`,"--reporter=default","--reporter=blob",`--outputFile=${M}`],yt=await He(s,P++),H=await he(F,{...Se,maxOldSpaceMb:gt(F,B,w),vitestArgs:Et,streamOutput:!Ee,excludePaths:k.get(F),extraEnv:{VITEST_RUNNER_TMP:yt}});if(L.push(H),ye.onComplete(H.code!==0),!Ee&&R){let tt=(H.duration/1e3).toFixed(2);if(H.code===0){let Pt=H.heapMb?` | ${H.heapMb} MB heap`:"";console.log(`
99
- \u2705 PASSED (${tt}s${Pt})
97
+ ${u}
98
+ `)}}}else{let s=t.trimEnd();s&&console.error(s)}}function Nt(e){let t=(o,n)=>n===0?100:parseFloat((o/n*100).toFixed(2)),s={total:{statements:{total:0,covered:0,pct:0},branches:{total:0,covered:0,pct:0},functions:{total:0,covered:0,pct:0},lines:{total:0,covered:0,pct:0}}};for(let[o,n]of Object.entries(e)){let l=Object.keys(n.s??{}),u=l.length,c=l.filter(d=>n.s[d]>0).length,a=Object.keys(n.f??{}),p=a.length,f=a.filter(d=>n.f[d]>0).length,h=0,b=0;for(let d of Object.values(n.b??{}))h+=d.length,b+=d.filter(T=>T>0).length;let v=new Set,y=new Set;for(let[d,T]of Object.entries(n.statementMap??{})){let P=T?.start?.line;P!=null&&(y.add(P),(n.s??{})[d]>0&&v.add(P))}let S={statements:{total:u,covered:c,pct:t(c,u)},branches:{total:h,covered:b,pct:t(b,h)},functions:{total:p,covered:f,pct:t(f,p)},lines:{total:y.size,covered:v.size,pct:t(v.size,y.size)}};s[o]=S;for(let d of["statements","branches","functions","lines"])s.total[d].total+=S[d].total,s.total[d].covered+=S[d].covered}let r=Object.keys(e).length>0;for(let o of["statements","branches","functions","lines"]){let{total:n,covered:l}=s.total[o];s.total[o].pct=r?t(l,n):"Unknown"}return s}function Lt({lines:e,stmts:t,fns:s,branches:r}){let o=[e,t,s,r].filter(ee);return o.length>0?Math.min(...o):null}function pt(e){return e??Number.MAX_VALUE}function _t({lines:e,stmts:t,fns:s,branches:r}){return![e,t,s,r].every(ee)}function Vt({lines:e,stmts:t,fns:s,branches:r}){console.log(`
99
+ ${O.bold("Coverage")} ${z(O,e)}% lines ${O.dim("|")} ${z(O,t)}% statements ${O.dim("|")} ${z(O,s)}% functions ${O.dim("|")} ${z(O,r)}% branches`)}async function He(e,t,s=10,r={}){let{silent:o=!1}=r,n=oe.resolve(e,"coverage"),l=t.find(v=>v.startsWith("--coverage.reportsDirectory="));if(l){let v=l.split("=").slice(1).join("=");n=oe.isAbsolute(v)?v:oe.resolve(e,v)}let u;try{let v=await ct.readFile(oe.join(n,"coverage-summary.json"),"utf8");u=JSON.parse(v)}catch{try{let v=await ct.readFile(oe.join(n,"coverage-final.json"),"utf8");u=Nt(JSON.parse(v))}catch{return o||console.log(O.dim(" (no coverage JSON found \u2014 skipping summary)")),null}}let{total:c,...a}=u,p={lines:c.lines?.pct??0,stmts:c.statements?.pct??0,fns:c.functions?.pct??0,branches:c.branches?.pct??0},f=Object.keys(a).length===0&&!Object.values(p).some(ee),h=[],b=0;if(s>0){let v=Object.entries(a).map(([S,d])=>({file:oe.relative(e,S),lines:d.lines?.pct??0,stmts:d.statements?.pct??0,fns:d.functions?.pct??0,branches:d.branches?.pct??0})).map(S=>({row:S,worst:Lt(S)})).filter(({row:S,worst:d})=>_t(S)||d<100).sort((S,d)=>pt(S.worst)-pt(d.worst)),y=v.slice(0,s);o||(console.log(`
100
+ `+O.bold("\u{1F4C9} WORST COVERAGE FILES (lowest metric)")),console.log("-".repeat(80)),y.forEach(({row:{file:S,lines:d,stmts:T,fns:P,branches:w},worst:g})=>{let V=O.dim(`lines ${te(d,0)}% | stmts ${te(T,0)}% | fns ${te(P,0)}% | branches ${te(w,0)}%`);console.log(` ${z(O,g)}% ${O.dim(S)} ${V}`)}),v.length>s&&console.log(O.dim(` ... and ${v.length-s} more files`))),h=y.map(({row:S})=>S),b=v.length}return o||(Vt(p),f&&console.log(O.dim(" No files were measured (the coverage include matched nothing), so every percentage is Unknown and coverage thresholds are skipped."))),{coverageDir:n,total:c,noFilesMeasured:f,worstFiles:h,worstFilesShown:h.length,worstFilesTotal:b,summary:u}}import ce from"fs/promises";import Bt from"fs";import pe from"path";var ut="tmp/vitest-runner",Wt=/^(\d+)-\d+$/;function Ut(e){try{return process.kill(e,0),!0}catch(t){return t.code!=="ESRCH"}}async function ft(e,t){let s=pe.resolve(e,t),r;try{r=await ce.readdir(s,{withFileTypes:!0})}catch{return}for(let o of r){if(!o.isDirectory())continue;let n=o.name.match(Wt);if(!n)continue;let l=parseInt(n[1],10);Ut(l)||await ce.rm(pe.join(s,o.name),{recursive:!0,force:!0}).catch(()=>{})}}async function dt(e,t){let s=pe.resolve(e,t),r=pe.join(s,`${process.pid}-${Date.now()}`);return await ce.mkdir(r,{recursive:!0}),r}async function ze(e,t){let s=pe.join(e,`worker-${t}`);return await ce.mkdir(s,{recursive:!0}),s}async function gt(e){await ce.rm(e,{recursive:!0,force:!0}).catch(()=>{})}function mt(e){try{Bt.rmSync(e,{recursive:!0,force:!0})}catch{}}function ht(e,t,s){let r=e.replace(/\\/g,"/"),o;for(let{pattern:n,heapMb:l}of s)if(r.includes(n)){o=l;break}if(!(o===void 0&&t===void 0))return o===void 0?t:t===void 0?o:Math.max(o,t)}async function vt(e){let t=e.cwd??process.cwd(),s=e.scratchDir??ut,r=e.keepTmp??!1;await ft(t,s);let o=await dt(t,s),n=()=>{mt(o),process.exitCode=130,process.exit()};r||(process.once("SIGINT",n),process.once("SIGTERM",n));try{return await Ht(e,o)}finally{process.removeListener("SIGINT",n),process.removeListener("SIGTERM",n),r||await gt(o)}}async function Ht(e,t){let{cwd:s=process.cwd(),testDir:r,testPatterns:o=[],testListFile:n,testFilePattern:l,vitestArgs:u=[],showErrorDetails:c=!0,coverageQuiet:a=!1,suppressFileOutput:p=!1,suppressPassingFiles:f=!1,topSummary:h=!0,json:b=!1,workers:v=parseInt(process.env.VITEST_WORKERS??"4",10),worstCoverageCount:y=10,blobsDir:S,mergeReports:d=!0,earlyRunPatterns:T=[],exclude:P=[],perFileHeapOverrides:w=[],conditions:g=[],nodeEnv:V="development",_testResultsOverride:M=null}=e,Ge=0,B=e.maxOldSpaceMb??(process.env.VITEST_HEAP_MB?parseInt(process.env.VITEST_HEAP_MB,10):void 0),k=!b,bt=ke(s,"vitest","vitest"),St=await De(s,e.vitestConfig),Se={cwd:s,vitestBin:bt,vitestConfig:St,conditions:g,nodeEnv:V},I=[...u];if(a&&!I.some(i=>i==="--coverage"||i.startsWith("--coverage."))&&I.unshift("--coverage"),I.some(i=>i==="--coverage"||i.startsWith("--coverage."))){let i=ve.resolve(s,S??".vitest-coverage-blobs"),m=ve.resolve(s,".vitest-coverage-tmp");await Promise.all([G.rm(i,{recursive:!0,force:!0}),G.rm(m,{recursive:!0,force:!0})]),await Promise.all([G.mkdir(i,{recursive:!0}),G.mkdir(m,{recursive:!0})]);let E=await me({cwd:s,testDir:r,testPatterns:o,testListFile:n,testFilePattern:l,earlyRunPatterns:T,exclude:P}),D=je(E);if(E.length===0){let F=o.length>0?`\u274C No Vitest test files found matching: ${o.join(", ")}`:"\u274C No Vitest test files found";return k&&console.log(F),b?{exitCode:1,mode:"coverage",message:F,options:{cwd:s,testDir:r,testPatterns:o,testListFile:n,workers:v,coverageQuiet:a,suppressFileOutput:p,suppressPassingFiles:f,topSummary:h,vitestArgs:I}}:1}let N=I.filter(F=>F!=="--coverage"&&F.startsWith("--coverage.")),xe=I.filter(F=>F!=="--coverage"&&!F.startsWith("--coverage.")),le=E.filter(F=>T.some(R=>F.replace(/\\/g,"/").includes(R))),Te=E.filter(F=>!T.some(R=>F.replace(/\\/g,"/").includes(R))),Ee=a||p||b,yt=a&&!b;!a&&!p&&k&&(console.log(`
101
+ \u{1F9EA} Running ${E.length} test files for coverage (blob + merge mode)`),console.log(`\u2699\uFE0F Workers: ${v} (${le.length} solo first, then parallel)`),B&&console.log(`\u{1F9E0} Heap limit: ${B} MB`),console.log(""));let ye=yt?Ve(E.length):Be,_=[],Pe=0,et=async F=>{let R=ve.join(i,`run-${Pe}.blob`);Pe++,!Ee&&k&&(console.log(`
102
+ ${"=".repeat(80)}`),console.log(`\u25B6\uFE0F ${F}`),console.log("=".repeat(80))),ye.onStart();let U=ve.join(m,`run-${Pe}`),Pt=[...xe,"--coverage",`--coverage.reportsDirectory=${U}`,"--reporter=default","--reporter=blob",`--outputFile=${R}`],Mt=await ze(t,Ge++),H=await he(F,{...Se,maxOldSpaceMb:ht(F,B,w),vitestArgs:Pt,streamOutput:!Ee,excludePaths:D.get(F),extraEnv:{VITEST_RUNNER_TMP:Mt}});if(_.push(H),ye.onComplete(H.code!==0),!Ee&&k){let ot=(H.duration/1e3).toFixed(2);if(H.code===0){let Rt=H.heapMb?` | ${H.heapMb} MB heap`:"";console.log(`
103
+ \u2705 PASSED (${ot}s${Rt})
100
104
  `)}else console.log(`
101
- \u274C FAILED (exit code ${H.code}, ${tt}s)
102
- `)}};for(let F of le)await Ze(F).catch(M=>{R&&console.error(`Error running ${F}:`,M)});let Me=0,Y=new Set;for(;Me<Te.length||Y.size>0;){for(;Me<Te.length&&Y.size<h;){let F=Te[Me++],M=Ze(F).catch(U=>{R&&console.error(`Error running ${F}:`,U)}).finally(()=>Y.delete(M));Y.add(M)}Y.size>0&&await Promise.race(Y)}ye.finish();let Oe=(await G.readdir(i).catch(()=>[])).filter(F=>F.endsWith(".blob"));if(Oe.length===0){let F="\u274C No coverage blobs were generated \u2014 coverage report cannot be produced";return R&&console.error(F),v?{exitCode:1,mode:"coverage",message:F,options:{cwd:t,testDir:n,testPatterns:o,testListFile:r,workers:h,coverageQuiet:a,suppressFileOutput:u,suppressPassingFiles:f,topSummary:S,showErrorDetails:g,worstCoverageCount:y,vitestArgs:A},totals:{testFiles:T.length,failedFiles:L.filter(M=>M.code!==0).length,passedFiles:L.filter(M=>M.code===0).length},results:{all:L,failed:L.filter(M=>M.code!==0)},merge:{blobFiles:0,exitCode:1,output:""},coverageSummary:null}:1}let fe=0,Re="",Xe=null;d&&(!a&&!u&&R&&(console.log(`
103
- ${"=".repeat(80)}`),console.log(`\u{1F4CA} Merging ${Oe.length} coverage blobs into final report...`),console.log("=".repeat(80))),{exitCode:fe,output:Re}=await Le(i,{...Se,maxOldSpaceMb:B,extraCoverageArgs:j,quietOutput:a||v}),a&&R&&We(fe,Re),Xe=await Ue(t,j,y,{silent:v})),await Promise.all([...d?[G.rm(i,{recursive:!0,force:!0}).catch(()=>{})]:[],G.rm(m,{recursive:!0,force:!0}).catch(()=>{})]);let ae=L.filter(F=>F.code!==0);a&&R&&Be(ae);let et=ae.length>0?1:fe;if(v){let F=L.filter(M=>M.heapMb!==null);return{exitCode:et,mode:"coverage",options:{cwd:t,testDir:n,testPatterns:o,testListFile:r,workers:h,coverageQuiet:a,suppressFileOutput:u,suppressPassingFiles:f,topSummary:S,showErrorDetails:g,worstCoverageCount:y,vitestArgs:A},totals:{testFiles:T.length,failedFiles:ae.length,passedFiles:L.length-ae.length},results:{all:L,failed:ae},merge:{blobFiles:Oe.length,exitCode:fe,output:Re},coverageSummary:Xe,...S?{topMemoryUsers:[...F].sort((M,U)=>U.heapMb-M.heapMb).slice(0,10),topDuration:[...L].sort((M,U)=>U.duration-M.duration).slice(0,10)}:{}}}return et}let J=await me({cwd:t,testDir:n,testPatterns:o,testListFile:r,testFilePattern:l,earlyRunPatterns:x}),bt=Ie(J);if(J.length===0){let i=o.length>0?`\u274C No Vitest test files found matching: ${o.join(", ")}`:"\u274C No Vitest test files found";return R&&console.log(i),v?{exitCode:1,mode:"standard",message:i,options:{cwd:t,testDir:n,testPatterns:o,testListFile:r,workers:h,coverageQuiet:a,suppressFileOutput:u,suppressPassingFiles:f,topSummary:S,vitestArgs:A}}:1}let qe=J.filter(i=>x.some(m=>i.replace(/\\/g,"/").includes(m))),$e=J.filter(i=>!x.some(m=>i.replace(/\\/g,"/").includes(m))),St=Date.now(),Ge=new Date().toLocaleTimeString("en-US",{hour12:!1});R&&!u&&o.length>0?console.log(`
104
- \u{1F9EA} Running ${J.length} test files matching: ${o.join(", ")}`):R&&!u&&console.log(`
105
- \u{1F9EA} Running ${J.length} test files (${qe.length} solo first, then parallel)`),R&&!u&&(console.log(`\u2699\uFE0F Workers: ${h}`),B&&console.log(`\u{1F9E0} Heap limit: ${B} MB`),A.length>0&&console.log(`\u{1F527} Vitest args: ${A.join(" ")}`),console.log(""));let D=[..._??[]],Je=async i=>{!u&&R&&(console.log(`
106
- ${"=".repeat(80)}`),console.log(`\u25B6\uFE0F ${i}`),console.log("=".repeat(80)));let m=await He(s,P++),T=await he(i,{...Se,maxOldSpaceMb:gt(i,B,w),vitestArgs:A,streamOutput:!u&&!v,excludePaths:bt.get(i),extraEnv:{VITEST_RUNNER_TMP:m}});if(!u&&R){let k=(T.duration/1e3).toFixed(2);if(T.code===0){let j=T.heapMb?` | ${T.heapMb} MB heap`:"";console.log(`
107
- \u2705 PASSED (${k}s${j})
105
+ \u274C FAILED (exit code ${H.code}, ${ot}s)
106
+ `)}};for(let F of le)await et(F).catch(R=>{k&&console.error(`Error running ${F}:`,R)});let Me=0,Y=new Set;for(;Me<Te.length||Y.size>0;){for(;Me<Te.length&&Y.size<v;){let F=Te[Me++],R=et(F).catch(U=>{k&&console.error(`Error running ${F}:`,U)}).finally(()=>Y.delete(R));Y.add(R)}Y.size>0&&await Promise.race(Y)}ye.finish();let Re=(await G.readdir(i).catch(()=>[])).filter(F=>F.endsWith(".blob"));if(Re.length===0){let F="\u274C No coverage blobs were generated \u2014 coverage report cannot be produced";return k&&console.error(F),b?{exitCode:1,mode:"coverage",message:F,options:{cwd:s,testDir:r,testPatterns:o,testListFile:n,workers:v,coverageQuiet:a,suppressFileOutput:p,suppressPassingFiles:f,topSummary:h,showErrorDetails:c,worstCoverageCount:y,vitestArgs:I},totals:{testFiles:E.length,failedFiles:_.filter(R=>R.code!==0).length,passedFiles:_.filter(R=>R.code===0).length},results:{all:_,failed:_.filter(R=>R.code!==0)},merge:{blobFiles:0,exitCode:1,output:""},coverageSummary:null}:1}let fe=0,Oe="",tt=null;d&&(!a&&!p&&k&&(console.log(`
107
+ ${"=".repeat(80)}`),console.log(`\u{1F4CA} Merging ${Re.length} coverage blobs into final report...`),console.log("=".repeat(80))),{exitCode:fe,output:Oe}=await _e(i,{...Se,maxOldSpaceMb:B,extraCoverageArgs:N,quietOutput:a||b}),a&&k&&Ue(fe,Oe),tt=await He(s,N,y,{silent:b})),await Promise.all([...d?[G.rm(i,{recursive:!0,force:!0}).catch(()=>{})]:[],G.rm(m,{recursive:!0,force:!0}).catch(()=>{})]);let ae=_.filter(F=>F.code!==0);a&&k&&We(ae);let st=ae.length>0?1:fe;if(b){let F=_.filter(R=>R.heapMb!==null);return{exitCode:st,mode:"coverage",options:{cwd:s,testDir:r,testPatterns:o,testListFile:n,workers:v,coverageQuiet:a,suppressFileOutput:p,suppressPassingFiles:f,topSummary:h,showErrorDetails:c,worstCoverageCount:y,vitestArgs:I},totals:{testFiles:E.length,failedFiles:ae.length,passedFiles:_.length-ae.length},results:{all:_,failed:ae},merge:{blobFiles:Re.length,exitCode:fe,output:Oe},coverageSummary:tt,...h?{topMemoryUsers:[...F].sort((R,U)=>U.heapMb-R.heapMb).slice(0,10),topDuration:[..._].sort((R,U)=>U.duration-R.duration).slice(0,10)}:{}}}return st}let J=await me({cwd:s,testDir:r,testPatterns:o,testListFile:n,testFilePattern:l,earlyRunPatterns:T,exclude:P}),$t=je(J);if(J.length===0){let i=o.length>0?`\u274C No Vitest test files found matching: ${o.join(", ")}`:"\u274C No Vitest test files found";return k&&console.log(i),b?{exitCode:1,mode:"standard",message:i,options:{cwd:s,testDir:r,testPatterns:o,testListFile:n,workers:v,coverageQuiet:a,suppressFileOutput:p,suppressPassingFiles:f,topSummary:h,vitestArgs:I}}:1}let Je=J.filter(i=>T.some(m=>i.replace(/\\/g,"/").includes(m))),$e=J.filter(i=>!T.some(m=>i.replace(/\\/g,"/").includes(m))),wt=Date.now(),Ke=new Date().toLocaleTimeString("en-US",{hour12:!1});k&&!p&&o.length>0?console.log(`
108
+ \u{1F9EA} Running ${J.length} test files matching: ${o.join(", ")}`):k&&!p&&console.log(`
109
+ \u{1F9EA} Running ${J.length} test files (${Je.length} solo first, then parallel)`),k&&!p&&(console.log(`\u2699\uFE0F Workers: ${v}`),B&&console.log(`\u{1F9E0} Heap limit: ${B} MB`),I.length>0&&console.log(`\u{1F527} Vitest args: ${I.join(" ")}`),console.log(""));let A=[...M??[]],Qe=async i=>{!p&&k&&(console.log(`
110
+ ${"=".repeat(80)}`),console.log(`\u25B6\uFE0F ${i}`),console.log("=".repeat(80)));let m=await ze(t,Ge++),E=await he(i,{...Se,maxOldSpaceMb:ht(i,B,w),vitestArgs:I,streamOutput:!p&&!b,excludePaths:$t.get(i),extraEnv:{VITEST_RUNNER_TMP:m}});if(!p&&k){let D=(E.duration/1e3).toFixed(2);if(E.code===0){let N=E.heapMb?` | ${E.heapMb} MB heap`:"";console.log(`
111
+ \u2705 PASSED (${D}s${N})
108
112
  `)}else console.log(`
109
- \u274C FAILED (exit code ${T.code}, ${k}s)
110
- `)}return T};if(!_){for(let T of qe){let k=await Je(T).catch(j=>(R&&console.error(`Error running ${T}:`,j),null));k&&D.push(k)}let i=0,m=new Set;for(;i<$e.length||m.size>0;){for(;i<$e.length&&m.size<h;){let T=$e[i++],k=Je(T).then(j=>D.push(j)).catch(j=>{R&&console.error(`Error running ${T}:`,j)}).finally(()=>m.delete(k));m.add(k)}m.size>0&&await Promise.race(m)}}let K=D.reduce((i,m)=>i+m.testFilesPass,0),W=D.reduce((i,m)=>i+m.testFilesFail,0),re=D.reduce((i,m)=>i+m.testsPass,0),ne=D.reduce((i,m)=>i+m.testsFail,0),ie=D.reduce((i,m)=>i+(m.testsSkip||0),0),$t=D.reduce((i,m)=>i+m.duration,0),Q=D.filter(i=>i.code!==0),ue=D.filter(i=>i.code===0),wt=Q.length>0?1:0,Ke=process.memoryUsage(),we=Math.round(Ke.heapUsed/1024/1024),Fe=Math.round(Ke.rss/1024/1024),I=D.filter(i=>i.heapMb!==null),Qe=((Date.now()-St)/1e3).toFixed(2),Ye=($t/1e3).toFixed(2);if(v)return{exitCode:wt,mode:"standard",options:{cwd:t,testDir:n,testPatterns:o,testListFile:r,workers:h,coverageQuiet:a,suppressFileOutput:u,suppressPassingFiles:f,topSummary:S,showErrorDetails:g,worstCoverageCount:y,vitestArgs:A},totals:{testFilesPass:K,testFilesFail:W,testsPass:re,testsFail:ne,testsSkip:ie,totalTests:re+ne+ie},timing:{startAt:Ge,wallClockSeconds:Number(Qe),testsSeconds:Number(Ye)},heap:{scriptHeapMb:we,scriptRssMb:Fe,maxHeapMb:I.length>0?Math.max(...I.map(i=>i.heapMb)):null,avgHeapMb:I.length>0?Number((I.reduce((i,m)=>i+m.heapMb,0)/I.length).toFixed(0)):null},results:{all:D,passed:ue,failed:Q},...S?{topMemoryUsers:[...I].sort((i,m)=>m.heapMb-i.heapMb).slice(0,10),topDuration:[...D].sort((i,m)=>m.duration-i.duration).slice(0,10)}:{}};console.log(`
111
- `+"=".repeat(80)),S&&I.length>0&&(console.log(`
112
- `+$.bold("\u{1F9E0} TOP MEMORY USERS")),console.log("-".repeat(80)),[...I].sort((i,m)=>m.heapMb-i.heapMb).slice(0,10).forEach(i=>{console.log(` ${String(i.heapMb).padStart(4)} MB ${$.dim(i.file)}`)})),S&&D.length>0&&(console.log(`
113
- `+$.bold("\u23F1\uFE0F TOP DURATION")),console.log("-".repeat(80)),[...D].sort((i,m)=>m.duration-i.duration).slice(0,10).forEach(i=>{let m=(i.duration/1e3).toFixed(2);console.log(` ${(m+"s").padStart(8)} ${$.dim(i.file)}`)})),ue.length>0&&!f&&(console.log(`
114
- `+"=".repeat(80)),console.log($.bold.green("\u2713 PASSED TEST FILES")),console.log("=".repeat(80)),ue.forEach(i=>{let m=(i.duration/1e3).toFixed(2),T=[...i.heapMb?[`${i.heapMb} MB`]:[],`${m}s`],k=i.testsPass>0?` - ${i.testsPass} tests`:"";console.log($.green(`\u2713 ${i.file}${k}`)+$.dim(` (${T.join(", ")})`))})),console.log(`
113
+ \u274C FAILED (exit code ${E.code}, ${D}s)
114
+ `)}return E};if(!M){for(let E of Je){let D=await Qe(E).catch(N=>(k&&console.error(`Error running ${E}:`,N),null));D&&A.push(D)}let i=0,m=new Set;for(;i<$e.length||m.size>0;){for(;i<$e.length&&m.size<v;){let E=$e[i++],D=Qe(E).then(N=>A.push(N)).catch(N=>{k&&console.error(`Error running ${E}:`,N)}).finally(()=>m.delete(D));m.add(D)}m.size>0&&await Promise.race(m)}}let K=A.reduce((i,m)=>i+m.testFilesPass,0),W=A.reduce((i,m)=>i+m.testFilesFail,0),re=A.reduce((i,m)=>i+m.testsPass,0),ne=A.reduce((i,m)=>i+m.testsFail,0),ie=A.reduce((i,m)=>i+(m.testsSkip||0),0),Ft=A.reduce((i,m)=>i+m.duration,0),Q=A.filter(i=>i.code!==0),ue=A.filter(i=>i.code===0),xt=Q.length>0?1:0,Ye=process.memoryUsage(),we=Math.round(Ye.heapUsed/1024/1024),Fe=Math.round(Ye.rss/1024/1024),C=A.filter(i=>i.heapMb!==null),Ze=((Date.now()-wt)/1e3).toFixed(2),Xe=(Ft/1e3).toFixed(2);if(b)return{exitCode:xt,mode:"standard",options:{cwd:s,testDir:r,testPatterns:o,testListFile:n,workers:v,coverageQuiet:a,suppressFileOutput:p,suppressPassingFiles:f,topSummary:h,showErrorDetails:c,worstCoverageCount:y,vitestArgs:I},totals:{testFilesPass:K,testFilesFail:W,testsPass:re,testsFail:ne,testsSkip:ie,totalTests:re+ne+ie},timing:{startAt:Ke,wallClockSeconds:Number(Ze),testsSeconds:Number(Xe)},heap:{scriptHeapMb:we,scriptRssMb:Fe,maxHeapMb:C.length>0?Math.max(...C.map(i=>i.heapMb)):null,avgHeapMb:C.length>0?Number((C.reduce((i,m)=>i+m.heapMb,0)/C.length).toFixed(0)):null},results:{all:A,passed:ue,failed:Q},...h?{topMemoryUsers:[...C].sort((i,m)=>m.heapMb-i.heapMb).slice(0,10),topDuration:[...A].sort((i,m)=>m.duration-i.duration).slice(0,10)}:{}};console.log(`
115
+ `+"=".repeat(80)),h&&C.length>0&&(console.log(`
116
+ `+$.bold("\u{1F9E0} TOP MEMORY USERS")),console.log("-".repeat(80)),[...C].sort((i,m)=>m.heapMb-i.heapMb).slice(0,10).forEach(i=>{console.log(` ${String(i.heapMb).padStart(4)} MB ${$.dim(i.file)}`)})),h&&A.length>0&&(console.log(`
117
+ `+$.bold("\u23F1\uFE0F TOP DURATION")),console.log("-".repeat(80)),[...A].sort((i,m)=>m.duration-i.duration).slice(0,10).forEach(i=>{let m=(i.duration/1e3).toFixed(2);console.log(` ${(m+"s").padStart(8)} ${$.dim(i.file)}`)})),ue.length>0&&!f&&(console.log(`
118
+ `+"=".repeat(80)),console.log($.bold.green("\u2713 PASSED TEST FILES")),console.log("=".repeat(80)),ue.forEach(i=>{let m=(i.duration/1e3).toFixed(2),E=[...i.heapMb?[`${i.heapMb} MB`]:[],`${m}s`],D=i.testsPass>0?` - ${i.testsPass} tests`:"";console.log($.green(`\u2713 ${i.file}${D}`)+$.dim(` (${E.join(", ")})`))})),console.log(`
115
119
  `+$.bold("=".repeat(80))),Q.length>0&&(console.log(`
116
120
  \u274C ${Q.length} test file(s) failed`),console.log($.bold.red(`
117
- Failed Test Files:`)),Q.forEach(i=>{let m=(i.duration/1e3).toFixed(2),T=[...i.testsFail>0?[$.red(`${i.testsFail} failed`)]:[],...i.testsPass>0?[$.green(`${i.testsPass} passed`)]:[],...i.testsSkip>0?[$.yellow(`${i.testsSkip} skipped`)]:[]],k=[...i.heapMb?[`${i.heapMb} MB`]:[],`${m}s`],j=T.length>0?` (${T.join(", ")})`:"";if(console.log(` ${$.red("\u2716")} ${i.file}${j}`+$.dim(` [${k.join(", ")}]`)),g&&i.errors.length>0){let xe=Ce(i.errors).split(`
121
+ Failed Test Files:`)),Q.forEach(i=>{let m=(i.duration/1e3).toFixed(2),E=[...i.testsFail>0?[$.red(`${i.testsFail} failed`)]:[],...i.testsPass>0?[$.green(`${i.testsPass} passed`)]:[],...i.testsSkip>0?[$.yellow(`${i.testsSkip} skipped`)]:[]],D=[...i.heapMb?[`${i.heapMb} MB`]:[],`${m}s`],N=E.length>0?` (${E.join(", ")})`:"";if(console.log(` ${$.red("\u2716")} ${i.file}${N}`+$.dim(` [${D.join(", ")}]`)),c&&i.errors.length>0){let xe=Ne(i.errors).split(`
118
122
  `).map(le=>le.trim()?` ${le}`:"").join(`
119
- `);console.log(xe),console.log("")}}),console.log("")),console.log($.bold("=".repeat(80))),W>0&&K>0?console.log(` ${$.bold("Test Files")} ${$.red(`${W} failed`)} ${$.dim("|")} ${$.green(`${K} passed`)} ${$.dim(`(${K+W})`)}`):W>0?console.log(` ${$.bold("Test Files")} ${$.red(`${W} failed`)} ${$.dim(`(${W})`)}`):console.log(` ${$.bold("Test Files")} ${$.green(`${K} passed`)} ${$.dim(`(${K})`)}`);let Ft=re+ne+ie,xt=[...ne>0?[$.red(`${ne} failed`)]:[],...re>0?[$.green(`${re} passed`)]:[],...ie>0?[$.yellow(`${ie} skipped`)]:[]];if(console.log(` ${$.bold("Tests")} ${xt.join(` ${$.dim("|")} `)} ${$.dim(`(${Ft})`)}`),console.log(` ${$.bold("Start at")} ${Ge}`),console.log(` ${$.bold("Duration")} ${Qe}s ${$.dim(`(tests ${Ye}s)`)}`),I.length>0){let i=Math.max(...I.map(T=>T.heapMb)),m=(I.reduce((T,k)=>T+k.heapMb,0)/I.length).toFixed(0);console.log(` ${$.bold("Heap")} max ${i} MB | avg ${m} MB | script ${we} MB (RSS ${Fe} MB)`)}else console.log(` ${$.bold("Heap")} script ${we} MB (RSS ${Fe} MB)`);return Q.length>0?1:(console.log(`
123
+ `);console.log(xe),console.log("")}}),console.log("")),console.log($.bold("=".repeat(80))),W>0&&K>0?console.log(` ${$.bold("Test Files")} ${$.red(`${W} failed`)} ${$.dim("|")} ${$.green(`${K} passed`)} ${$.dim(`(${K+W})`)}`):W>0?console.log(` ${$.bold("Test Files")} ${$.red(`${W} failed`)} ${$.dim(`(${W})`)}`):console.log(` ${$.bold("Test Files")} ${$.green(`${K} passed`)} ${$.dim(`(${K})`)}`);let Tt=re+ne+ie,Et=[...ne>0?[$.red(`${ne} failed`)]:[],...re>0?[$.green(`${re} passed`)]:[],...ie>0?[$.yellow(`${ie} skipped`)]:[]];if(console.log(` ${$.bold("Tests")} ${Et.join(` ${$.dim("|")} `)} ${$.dim(`(${Tt})`)}`),console.log(` ${$.bold("Start at")} ${Ke}`),console.log(` ${$.bold("Duration")} ${Ze}s ${$.dim(`(tests ${Xe}s)`)}`),C.length>0){let i=Math.max(...C.map(E=>E.heapMb)),m=(C.reduce((E,D)=>E+D.heapMb,0)/C.length).toFixed(0);console.log(` ${$.bold("Heap")} max ${i} MB | avg ${m} MB | script ${we} MB (RSS ${Fe} MB)`)}else console.log(` ${$.bold("Heap")} script ${we} MB (RSS ${Fe} MB)`);return Q.length>0?1:(console.log(`
120
124
  \u2705 All ${ue.length} test files passed
121
- `),0)}var E=st(process.argv.slice(2));E.help&&(ot(),process.exit(0));if((E.coverageQuiet||E.logFile)&&!E.json){let r=function(l){let c=l.toString();return c.startsWith("\r")||/^progress \d+\.\d+%/.test(c)},e=process.cwd(),s=E.logFile?be.isAbsolute(E.logFile)?E.logFile:be.resolve(e,E.logFile):be.join(e,"coverage","coverage-run.log");Ut(be.dirname(s),{recursive:!0});let t=Wt(s,{flags:"a"}),n=process.stdout.write.bind(process.stdout),o=process.stderr.write.bind(process.stderr);process.stdout.write=(l,c,g)=>(r(l)||t.write(N(l.toString())),n(l,c,g)),process.stderr.write=(l,c,g)=>(r(l)||t.write(N(l.toString())),o(l,c,g)),process.on("exit",()=>t.end())}var Ht=process.cwd(),ze=[...E.vitestPassthroughArgs];E.coverageQuiet&&!ze.some(e=>e==="--coverage"||e.startsWith("--coverage."))&&ze.unshift("--coverage");try{let e=await mt({cwd:Ht,testPatterns:E.testPatterns,testListFile:E.testListFile,testFilePattern:E.testFilePattern,vitestArgs:ze,showErrorDetails:E.showErrorDetails,coverageQuiet:E.coverageQuiet,suppressFileOutput:E.suppressFileOutput,suppressPassingFiles:E.suppressPassingFiles,topSummary:E.topSummary,json:E.json,mergeReports:E.mergeReports,keepTmp:E.keepTmp,...E.blobsDir!==void 0&&{blobsDir:E.blobsDir},...E.workers!==void 0&&{workers:E.workers},...E.soloPatterns.length>0&&{earlyRunPatterns:E.soloPatterns},...E.scratchDir!==void 0&&{scratchDir:E.scratchDir}});E.json&&(process.stdout.write(`${JSON.stringify(e,null,2)}
125
+ `),0)}var x=rt(process.argv.slice(2));x.help&&(nt(),process.exit(0));if((x.coverageQuiet||x.logFile)&&!x.json){let n=function(l){let u=l.toString();return u.startsWith("\r")||/^progress \d+\.\d+%/.test(u)},e=process.cwd(),t=x.logFile?be.isAbsolute(x.logFile)?x.logFile:be.resolve(e,x.logFile):be.join(e,"coverage","coverage-run.log");qt(be.dirname(t),{recursive:!0});let s=zt(t,{flags:"a"}),r=process.stdout.write.bind(process.stdout),o=process.stderr.write.bind(process.stderr);process.stdout.write=(l,u,c)=>(n(l)||s.write(L(l.toString())),r(l,u,c)),process.stderr.write=(l,u,c)=>(n(l)||s.write(L(l.toString())),o(l,u,c)),process.on("exit",()=>s.end())}var Gt=process.cwd(),qe=[...x.vitestPassthroughArgs];x.coverageQuiet&&!qe.some(e=>e==="--coverage"||e.startsWith("--coverage."))&&qe.unshift("--coverage");try{let e=await vt({cwd:Gt,testPatterns:x.testPatterns,testListFile:x.testListFile,testFilePattern:x.testFilePattern,vitestArgs:qe,showErrorDetails:x.showErrorDetails,coverageQuiet:x.coverageQuiet,suppressFileOutput:x.suppressFileOutput,suppressPassingFiles:x.suppressPassingFiles,topSummary:x.topSummary,json:x.json,mergeReports:x.mergeReports,keepTmp:x.keepTmp,...x.blobsDir!==void 0&&{blobsDir:x.blobsDir},...x.workers!==void 0&&{workers:x.workers},...x.soloPatterns.length>0&&{earlyRunPatterns:x.soloPatterns},...x.exclude.length>0&&{exclude:x.exclude},...x.scratchDir!==void 0&&{scratchDir:x.scratchDir}});x.json&&(process.stdout.write(`${JSON.stringify(e,null,2)}
122
126
  `),process.exit(typeof e=="object"&&e!==null&&"exitCode"in e?e.exitCode:1)),process.exit(typeof e=="number"?e:1)}catch(e){console.error("Fatal error:",e),process.exit(1)}
123
127
  //# sourceMappingURL=vitest-runner.mjs.map
package/dist/index.mjs CHANGED
@@ -1,46 +1,46 @@
1
- import K from"fs/promises";import me from"path";import S from"chalk";import{createRequire as wt}from"module";import Z from"path";import Tt from"fs/promises";import{pathToFileURL as Mt}from"url";function Pe(e,t,o=t){let r=wt(Mt(Z.join(e,"package.json"))),s=r.resolve(`${t}/package.json`),n=r(s),a=n.bin?.[o]??n.bin;if(!a)throw new Error(`No bin "${o}" found in ${t}/package.json`);return Z.join(Z.dirname(s),a)}var Et=Object.freeze(["vitest.config.ts","vitest.config.mts","vitest.config.cts","vitest.config.mjs","vitest.config.js","vitest.config.cjs","vite.config.ts","vite.config.mts","vite.config.mjs","vite.config.js"]);async function Oe(e,t){if(t)return Z.isAbsolute(t)?t:Z.resolve(e,t);for(let o of Et){let r=Z.join(e,o);try{return await Tt.access(r),r}catch{}}}import De from"fs/promises";import R from"path";var et=/\.test\.vitest\.(?:js|mjs|cjs)$/i;async function fe(e,t,o=et){let r=[e],s=[];for(;r.length;){let n=r.pop(),a;try{a=await De.readdir(n,{withFileTypes:!0})}catch{continue}for(let l of a){if(l.isDirectory()){if(l.name==="node_modules"||l.name.startsWith("."))continue;r.push(R.join(n,l.name));continue}l.isFile()&&o.test(l.name)&&s.push(R.relative(t,R.join(n,l.name)))}}return s}function ue(e,t=[]){let o=[],r=[];for(let s of e){let n=s.replace(/\\/g,"/"),a=t.findIndex(l=>n.includes(l));a!==-1?o.push({file:s,priorityIndex:a}):r.push(s)}return o.sort((s,n)=>s.priorityIndex-n.priorityIndex||s.file.localeCompare(n.file)),r.sort((s,n)=>s.localeCompare(n)),[...o.map(s=>s.file),...r]}function Ie(e){let t=e.map(r=>r.replace(/\\/g,"/")),o=new Map;for(let r=0;r<e.length;r++){let s=[];for(let n=0;n<e.length;n++)r!==n&&t[n].includes(t[r])&&s.push(e[n]);o.set(e[r],s)}return o}async function de(e){let{cwd:t,testDir:o,testPatterns:r=[],testListFile:s,testFilePattern:n=et,earlyRunPatterns:a=[]}=e,l=o?R.isAbsolute(o)?o:R.resolve(t,o):t;if(s){let c=R.isAbsolute(s)?s:R.resolve(t,s),p;try{let f=await De.readFile(c,"utf8");p=JSON.parse(f)}catch(f){throw new Error(`Failed to read test list file "${c}": ${f.message}`,{cause:f})}if(!Array.isArray(p))throw new Error(`Test list file "${c}" must contain a JSON array of test file paths`);return console.log(`\u{1F4CB} Loading test list from: ${R.relative(t,c)}`),ue(p,a)}if(r.length===0){let c=await fe(l,t,n);return ue(c,a)}let g=[];for(let c of r){let p=R.isAbsolute(c)?c:R.resolve(t,c),f=null;try{f=await De.stat(p)}catch{}if(f?.isFile())n.test(p)&&g.push(R.relative(t,p));else if(f?.isDirectory())g.push(...await fe(p,t,n));else{let m=(await fe(l,t,n)).filter(h=>h.replace(/\\/g,"/").includes(c.replace(/\\/g,"/")));m.length>0?g.push(...m):console.warn(`\u26A0\uFE0F No matches found for: ${c}`)}}return ue([...new Set(g)],a)}import{spawn as Re}from"child_process";function L(e){return e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"")}function Y(e){return typeof e=="number"&&Number.isFinite(e)}function X(e,t){return Y(e)?e.toFixed(t):"Unknown"}function H(e,t){if(!Y(t))return e.dim(X(t,2).padStart(6));let o=t.toFixed(2).padStart(6);return t>=80?e.green(o):t>=50?e.yellow(o):e.red(o)}function Ae(e){let t=L(e),o={testFilesPass:0,testFilesFail:0,testsPass:0,testsFail:0,testsSkip:0,duration:0,heapMb:null,errors:[]},r=t.match(/Test Files\s+(.+)/);if(r){let g=r[1],c=g.match(/(\d+)\s+passed/),p=g.match(/(\d+)\s+failed/);c&&(o.testFilesPass=parseInt(c[1],10)),p&&(o.testFilesFail=parseInt(p[1],10))}let s=t.match(/^\s*Tests\s+(.+)$/m);if(s){let g=s[1],c=g.match(/(\d+)\s+passed/),p=g.match(/(\d+)\s+failed/),f=g.match(/(\d+)\s+skipped/);c&&(o.testsPass=parseInt(c[1],10)),p&&(o.testsFail=parseInt(p[1],10)),f&&(o.testsSkip=parseInt(f[1],10))}let n=t.match(/Duration\s+([\d.]+)s/);n&&(o.duration=parseFloat(n[1])*1e3);let a=t.match(/(\d+)\s*MB\s+heap\s+used/i);a&&(o.heapMb=parseInt(a[1],10));let l=e.indexOf("Failed Tests");if(l!==-1){let g=e.indexOf(`
2
- Test Files`,l),c=g!==-1?e.substring(l,g):e.substring(l),p=/FAIL\s*(?:\x1B\[[0-9;]*[a-zA-Z]|\s)*tests\//g,f=[...c.matchAll(p)];for(let v=0;v<f.length;v++){let m=f[v].index,h=c.lastIndexOf(`
3
- `,m),w=h===-1?0:h,$=v<f.length-1?f[v+1].index:c.length,d=c.lastIndexOf(`
4
- `,$),x=d===-1?$:d,y=c.substring(w,x).trim();y&&o.errors.push(y)}}return o}function Ce(e){let o=e.join(`
1
+ import K from"fs/promises";import me from"path";import S from"chalk";import{createRequire as Mt}from"module";import Z from"path";import Et from"fs/promises";import{pathToFileURL as yt}from"url";function Pe(t,e,o=e){let n=Mt(yt(Z.join(t,"package.json"))),s=n.resolve(`${e}/package.json`),r=n(s),c=r.bin?.[o]??r.bin;if(!c)throw new Error(`No bin "${o}" found in ${e}/package.json`);return Z.join(Z.dirname(s),c)}var Pt=Object.freeze(["vitest.config.ts","vitest.config.mts","vitest.config.cts","vitest.config.mjs","vitest.config.js","vitest.config.cjs","vite.config.ts","vite.config.mts","vite.config.mjs","vite.config.js"]);async function Oe(t,e){if(e)return Z.isAbsolute(e)?e:Z.resolve(t,e);for(let o of Pt){let n=Z.join(t,o);try{return await Et.access(n),n}catch{}}}import Ie from"fs/promises";import C from"path";var ot=/\.test\.vitest\.(?:js|mjs|cjs)$/i;function Ot(t){let e=t.replace(/\\/g,"/"),o="";for(let n=0;n<e.length;n++){let s=e[n];s==="*"&&e[n+1]==="*"?(o+=".*",n++):s==="*"?o+="[^/]*":s==="?"?o+="[^/]":o+=s.replace(/[.+^${}()|[\]\\]/g,"\\$&")}return new RegExp(`^${o}$`)}function De(t,e){return!e||e.length===0?!1:e.some(o=>Ot(o).test(t))}async function pe(t,e,o=ot,n=[]){let s=[t],r=[];for(;s.length;){let c=s.pop(),u;try{u=await Ie.readdir(c,{withFileTypes:!0})}catch{continue}for(let f of u){let a=C.relative(e,C.join(c,f.name)).replace(/\\/g,"/");if(f.isDirectory()){if(f.name==="node_modules"||f.name.startsWith(".")||De(a,n)||De(`${a}/`,n))continue;s.push(C.join(c,f.name));continue}if(f.isFile()&&o.test(f.name)){if(De(a,n))continue;r.push(C.relative(e,C.join(c,f.name)))}}}return r}function ue(t,e=[]){let o=[],n=[];for(let s of t){let r=s.replace(/\\/g,"/"),c=e.findIndex(u=>r.includes(u));c!==-1?o.push({file:s,priorityIndex:c}):n.push(s)}return o.sort((s,r)=>s.priorityIndex-r.priorityIndex||s.file.localeCompare(r.file)),n.sort((s,r)=>s.localeCompare(r)),[...o.map(s=>s.file),...n]}function Ae(t){let e=t.map(n=>n.replace(/\\/g,"/")),o=new Map;for(let n=0;n<t.length;n++){let s=[];for(let r=0;r<t.length;r++)n!==r&&e[r].includes(e[n])&&s.push(t[r]);o.set(t[n],s)}return o}async function de(t){let{cwd:e,testDir:o,testPatterns:n=[],testListFile:s,testFilePattern:r=ot,earlyRunPatterns:c=[],exclude:u=[]}=t,f=o?C.isAbsolute(o)?o:C.resolve(e,o):e;if(s){let l=C.isAbsolute(s)?s:C.resolve(e,s),p;try{let m=await Ie.readFile(l,"utf8");p=JSON.parse(m)}catch(m){throw new Error(`Failed to read test list file "${l}": ${m.message}`,{cause:m})}if(!Array.isArray(p))throw new Error(`Test list file "${l}" must contain a JSON array of test file paths`);return console.log(`\u{1F4CB} Loading test list from: ${C.relative(e,l)}`),ue(p,c)}if(n.length===0){let l=await pe(f,e,r,u);return ue(l,c)}let a=[];for(let l of n){let p=C.isAbsolute(l)?l:C.resolve(e,l),m=null;try{m=await Ie.stat(p)}catch{}if(m?.isFile())r.test(p)&&a.push(C.relative(e,p));else if(m?.isDirectory())a.push(...await pe(p,e,r,u));else{let h=(await pe(f,e,r,u)).filter(w=>w.replace(/\\/g,"/").includes(l.replace(/\\/g,"/")));h.length>0?a.push(...h):console.warn(`\u26A0\uFE0F No matches found for: ${l}`)}}return ue([...new Set(a)],c)}import{spawn as je}from"child_process";function L(t){return t.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"")}function Y(t){return typeof t=="number"&&Number.isFinite(t)}function X(t,e){return Y(t)?t.toFixed(e):"Unknown"}function H(t,e){if(!Y(e))return t.dim(X(e,2).padStart(6));let o=e.toFixed(2).padStart(6);return e>=80?t.green(o):e>=50?t.yellow(o):t.red(o)}function Ce(t){let e=L(t),o={testFilesPass:0,testFilesFail:0,testsPass:0,testsFail:0,testsSkip:0,duration:0,heapMb:null,errors:[]},n=e.match(/Test Files\s+(.+)/);if(n){let f=n[1],a=f.match(/(\d+)\s+passed/),l=f.match(/(\d+)\s+failed/);a&&(o.testFilesPass=parseInt(a[1],10)),l&&(o.testFilesFail=parseInt(l[1],10))}let s=e.match(/^\s*Tests\s+(.+)$/m);if(s){let f=s[1],a=f.match(/(\d+)\s+passed/),l=f.match(/(\d+)\s+failed/),p=f.match(/(\d+)\s+skipped/);a&&(o.testsPass=parseInt(a[1],10)),l&&(o.testsFail=parseInt(l[1],10)),p&&(o.testsSkip=parseInt(p[1],10))}let r=e.match(/Duration\s+([\d.]+)s/);r&&(o.duration=parseFloat(r[1])*1e3);let c=e.match(/(\d+)\s*MB\s+heap\s+used/i);c&&(o.heapMb=parseInt(c[1],10));let u=t.indexOf("Failed Tests");if(u!==-1){let f=t.indexOf(`
2
+ Test Files`,u),a=f!==-1?t.substring(u,f):t.substring(u),l=/FAIL\s*(?:\x1B\[[0-9;]*[a-zA-Z]|\s)*tests\//g,p=[...a.matchAll(l)];for(let m=0;m<p.length;m++){let v=p[m].index,h=a.lastIndexOf(`
3
+ `,v),w=h===-1?0:h,$=m<p.length-1?p[m+1].index:a.length,g=a.lastIndexOf(`
4
+ `,$),x=g===-1?$:g,P=a.substring(w,x).trim();P&&o.errors.push(P)}}return o}function Re(t){let o=t.join(`
5
5
  `).split(`
6
- `),r=new Map,s=new Map;o.forEach((a,l)=>{if(a.includes("FAIL")&&a.includes("Config:")){s.set(a,l);let c=L(a).match(/^(.+Config:\s+)'*([^'>]+)'*(.+)$/);if(c){let[,p,f,v]=c,m=`${p.trim()}|||${v.trim()}`;r.has(m)||r.set(m,{lines:[],configs:[]}),r.get(m).lines.push(a),r.get(m).configs.push(f.replace(/'/g,""))}}});let n=new Set;for(let[,a]of r.entries())if(a.configs.length>1){for(let f=1;f<a.lines.length;f++){let v=s.get(a.lines[f]);n.add(v)}let l=a.lines[0],g=`[${a.configs.map(f=>`'${f}'`).join(",")}]`,c=L(l).replace(/(Config:\s+)'*[^'>]+'*/,`$1${g}`),p=s.get(l);o[p]=c}return o.filter((a,l)=>!n.has(l)).join(`
7
- `)}function ke({maxOldSpaceMb:e,conditions:t=[],base:o=process.env.NODE_OPTIONS??""}){let r=o;for(let s of t){let n=`--conditions=${s}`;r.includes(n)||(r=r?`${r} ${n}`:n)}if(e&&!r.includes("--max-old-space-size")){let s=`--max-old-space-size=${e}`;r=r?`${r} ${s}`:s}return r.trim()}function je({maxOldSpaceMb:e,conditions:t=[],nodeEnv:o="development",extraEnv:r={}}){let s={...process.env};s.NODE_ENV||(s.NODE_ENV=o);let n=ke({maxOldSpaceMb:e,conditions:t,base:s.NODE_OPTIONS??""});return n&&(s.NODE_OPTIONS=n),Object.assign(s,r),s}function tt(e,t){return[e,...t?["--config",t]:[],"run"]}function ge(e,t){let{cwd:o,vitestBin:r,vitestConfig:s,maxOldSpaceMb:n,conditions:a=[],nodeEnv:l="development",vitestArgs:g=[],streamOutput:c=!0,excludePaths:p=[],extraEnv:f={}}=t;return new Promise(v=>{let m=Date.now(),h=p.flatMap(P=>["--exclude",P]),w=[...tt(r,s),...g,...h,e],$=je({maxOldSpaceMb:n,conditions:a,nodeEnv:l,extraEnv:f}),d=Re(process.execPath,w,{cwd:o,stdio:["ignore","pipe","pipe"],env:$}),x="",y="";d.stdout?.on("data",P=>{x+=P.toString(),c&&process.stdout.write(P)}),d.stderr?.on("data",P=>{y+=P.toString(),c&&process.stderr.write(P)}),d.on("close",P=>{let _=Date.now()-m,N=`${x}
8
- ${y}`,T=Ae(N);v({file:e,code:P??1,duration:T.duration>0?T.duration:_,testFilesPass:T.testFilesPass,testFilesFail:T.testFilesFail,testsPass:T.testsPass,testsFail:T.testsFail,testsSkip:T.testsSkip,heapMb:T.heapMb,errors:T.errors,rawOutput:N})}),d.on("error",P=>{v({file:e,code:1,duration:Date.now()-m,testFilesPass:0,testFilesFail:1,testsPass:0,testsFail:0,testsSkip:0,heapMb:null,errors:[P.message],rawOutput:P.toString()})})})}function yt(e){let{cwd:t,vitestBin:o,vitestConfig:r,maxOldSpaceMb:s,conditions:n=[],nodeEnv:a="development",vitestArgs:l=[]}=e;return new Promise(g=>{let c=[...tt(o,r),...l],p=je({maxOldSpaceMb:s,conditions:n,nodeEnv:a}),f=Re(process.execPath,c,{cwd:t,stdio:"inherit",env:p});f.on("close",v=>g(v??1)),f.on("error",()=>g(1))})}function Ne(e,t){let{cwd:o,vitestBin:r,vitestConfig:s,maxOldSpaceMb:n,conditions:a=[],nodeEnv:l="development",extraCoverageArgs:g=[],quietOutput:c=!1}=t;return new Promise(p=>{let f=s?["--config",s]:[],v=c?["--color"]:[],m=[r,...f,"--mergeReports",e,"--run","--coverage",...v,...g],h=je({maxOldSpaceMb:n,conditions:a,nodeEnv:l}),w=Re(process.execPath,m,{cwd:o,stdio:c?["ignore","pipe","pipe"]:"inherit",env:h}),$="",d="";c&&(w.stdout?.on("data",x=>$+=x.toString()),w.stderr?.on("data",x=>d+=x.toString())),w.on("close",x=>p({exitCode:x??1,output:`${$}
9
- ${d}`})),w.on("error",()=>p({exitCode:1,output:""}))})}import W from"chalk";function ee(e){let t=Math.max(0,Math.floor(e/1e3)),o=Math.floor(t/3600),r=Math.floor(t%3600/60),s=t%60;return o>0?`${o}:${r.toString().padStart(2,"0")}:${s.toString().padStart(2,"0")}`:`${r}:${s.toString().padStart(2,"0")}`}function Le(e){let t=!!process.stdout.isTTY,o=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r=26,s=Date.now(),n=0,a=0,l=0,g=0,c=0,p=0,f=null;function v(){let $=e===0?100:n/e*100,d=Date.now()-s,y=(n>0?d/n:0)*Math.max(e-n,0),P=Math.round($/100*r),_=o[g%o.length],N=`[${"=".repeat(P)}${"-".repeat(Math.max(0,r-P))}]`,T=$.toFixed(1).padStart(5);return $<30?T=W.red(T+"%"):$<70?T=W.rgb(255,136,0)(T+"%"):$>99?T=W.green(T+"%"):T=W.yellow(T+"%"),t?`${W.green(_)} ${W.green(N)} ${W.bold(T)} ${n}/${e} | active ${a} | failed ${l} | ETA ${ee(y)} | elapsed ${ee(d)}`:`progress ${$.toFixed(1)}% ${n}/${e} | active ${a} | failed ${l} | eta ${ee(y)} | elapsed ${ee(d)}`}function m($=!1){let d=v();if(g++,t){let y=d.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"").length;c=Math.max(c,y),process.stdout.write(`\r${d.padEnd(c," ")}`);return}let x=Date.now();($||x-p>=2e3)&&(console.log(d),p=x)}function h(){!t||f||(f=setInterval(()=>{n>=e&&a===0||m()},120),f.unref?.())}function w(){f&&(clearInterval(f),f=null)}return m(!0),h(),{onStart(){a++,m()},onComplete($){a=Math.max(0,a-1),n++,$&&l++,m(!0)},finish(){w(),m(!0),t&&process.stdout.write(`
10
- `)}}}var _e={onStart(){},onComplete(e){},finish(){}};import ot from"fs/promises";import te from"path";import E from"chalk";function Be(e){if(e.length!==0){console.log(`
11
- ${"=".repeat(80)}`),console.log(E.bold.red("\u2716 FAILED TEST FILES (VERBOSE OUTPUT)")),console.log("=".repeat(80));for(let t of e)console.log(`
12
- ${E.red("\u2716")} ${E.red(t.file)} ${E.dim(`(exit ${t.code})`)}`),t.rawOutput?.trim()?console.log(t.rawOutput.trimEnd()):console.log(E.dim("(no child output captured)"));console.log(`
13
- ${"=".repeat(80)}`)}}function Ve(e,t){if(e===0){let o="% Coverage report from v8",r=t.split(`
14
- `),s=r.findIndex(n=>L(n).includes(o));if(s>=0){let n=r.length;for(let l=s+1;l<r.length;l++){let g=L(r[l]).trimStart();if(g.startsWith("stderr |")||g.startsWith("stdout |")){n=l;break}}if(r.slice(s+1,n).join(`
15
- `).trimEnd()){let l=r.slice(s,n).join(`
6
+ `),n=new Map,s=new Map;o.forEach((c,u)=>{if(c.includes("FAIL")&&c.includes("Config:")){s.set(c,u);let a=L(c).match(/^(.+Config:\s+)'*([^'>]+)'*(.+)$/);if(a){let[,l,p,m]=a,v=`${l.trim()}|||${m.trim()}`;n.has(v)||n.set(v,{lines:[],configs:[]}),n.get(v).lines.push(c),n.get(v).configs.push(p.replace(/'/g,""))}}});let r=new Set;for(let[,c]of n.entries())if(c.configs.length>1){for(let p=1;p<c.lines.length;p++){let m=s.get(c.lines[p]);r.add(m)}let u=c.lines[0],f=`[${c.configs.map(p=>`'${p}'`).join(",")}]`,a=L(u).replace(/(Config:\s+)'*[^'>]+'*/,`$1${f}`),l=s.get(u);o[l]=a}return o.filter((c,u)=>!r.has(u)).join(`
7
+ `)}function ke({maxOldSpaceMb:t,conditions:e=[],base:o=process.env.NODE_OPTIONS??""}){let n=o;for(let s of e){let r=`--conditions=${s}`;n.includes(r)||(n=n?`${n} ${r}`:r)}if(t&&!n.includes("--max-old-space-size")){let s=`--max-old-space-size=${t}`;n=n?`${n} ${s}`:s}return n.trim()}function Ne({maxOldSpaceMb:t,conditions:e=[],nodeEnv:o="development",extraEnv:n={}}){let s={...process.env};s.NODE_ENV||(s.NODE_ENV=o);let r=ke({maxOldSpaceMb:t,conditions:e,base:s.NODE_OPTIONS??""});return r&&(s.NODE_OPTIONS=r),Object.assign(s,n),s}function st(t,e){return[t,...e?["--config",e]:[],"run"]}function ge(t,e){let{cwd:o,vitestBin:n,vitestConfig:s,maxOldSpaceMb:r,conditions:c=[],nodeEnv:u="development",vitestArgs:f=[],streamOutput:a=!0,excludePaths:l=[],extraEnv:p={}}=e;return new Promise(m=>{let v=Date.now(),h=l.flatMap(E=>["--exclude",E]),w=[...st(n,s),...f,...h,t],$=Ne({maxOldSpaceMb:r,conditions:c,nodeEnv:u,extraEnv:p}),g=je(process.execPath,w,{cwd:o,stdio:["ignore","pipe","pipe"],env:$}),x="",P="";g.stdout?.on("data",E=>{x+=E.toString(),a&&process.stdout.write(E)}),g.stderr?.on("data",E=>{P+=E.toString(),a&&process.stderr.write(E)}),g.on("close",E=>{let _=Date.now()-v,N=`${x}
8
+ ${P}`,T=Ce(N);m({file:t,code:E??1,duration:T.duration>0?T.duration:_,testFilesPass:T.testFilesPass,testFilesFail:T.testFilesFail,testsPass:T.testsPass,testsFail:T.testsFail,testsSkip:T.testsSkip,heapMb:T.heapMb,errors:T.errors,rawOutput:N})}),g.on("error",E=>{m({file:t,code:1,duration:Date.now()-v,testFilesPass:0,testFilesFail:1,testsPass:0,testsFail:0,testsSkip:0,heapMb:null,errors:[E.message],rawOutput:E.toString()})})})}function Dt(t){let{cwd:e,vitestBin:o,vitestConfig:n,maxOldSpaceMb:s,conditions:r=[],nodeEnv:c="development",vitestArgs:u=[]}=t;return new Promise(f=>{let a=[...st(o,n),...u],l=Ne({maxOldSpaceMb:s,conditions:r,nodeEnv:c}),p=je(process.execPath,a,{cwd:e,stdio:"inherit",env:l});p.on("close",m=>f(m??1)),p.on("error",()=>f(1))})}function Le(t,e){let{cwd:o,vitestBin:n,vitestConfig:s,maxOldSpaceMb:r,conditions:c=[],nodeEnv:u="development",extraCoverageArgs:f=[],quietOutput:a=!1}=e;return new Promise(l=>{let p=s?["--config",s]:[],m=a?["--color"]:[],v=[n,...p,"--mergeReports",t,"--run","--coverage",...m,...f],h=Ne({maxOldSpaceMb:r,conditions:c,nodeEnv:u}),w=je(process.execPath,v,{cwd:o,stdio:a?["ignore","pipe","pipe"]:"inherit",env:h}),$="",g="";a&&(w.stdout?.on("data",x=>$+=x.toString()),w.stderr?.on("data",x=>g+=x.toString())),w.on("close",x=>l({exitCode:x??1,output:`${$}
9
+ ${g}`})),w.on("error",()=>l({exitCode:1,output:""}))})}import W from"chalk";function ee(t){let e=Math.max(0,Math.floor(t/1e3)),o=Math.floor(e/3600),n=Math.floor(e%3600/60),s=e%60;return o>0?`${o}:${n.toString().padStart(2,"0")}:${s.toString().padStart(2,"0")}`:`${n}:${s.toString().padStart(2,"0")}`}function _e(t){let e=!!process.stdout.isTTY,o=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],n=26,s=Date.now(),r=0,c=0,u=0,f=0,a=0,l=0,p=null;function m(){let $=t===0?100:r/t*100,g=Date.now()-s,P=(r>0?g/r:0)*Math.max(t-r,0),E=Math.round($/100*n),_=o[f%o.length],N=`[${"=".repeat(E)}${"-".repeat(Math.max(0,n-E))}]`,T=$.toFixed(1).padStart(5);return $<30?T=W.red(T+"%"):$<70?T=W.rgb(255,136,0)(T+"%"):$>99?T=W.green(T+"%"):T=W.yellow(T+"%"),e?`${W.green(_)} ${W.green(N)} ${W.bold(T)} ${r}/${t} | active ${c} | failed ${u} | ETA ${ee(P)} | elapsed ${ee(g)}`:`progress ${$.toFixed(1)}% ${r}/${t} | active ${c} | failed ${u} | eta ${ee(P)} | elapsed ${ee(g)}`}function v($=!1){let g=m();if(f++,e){let P=g.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"").length;a=Math.max(a,P),process.stdout.write(`\r${g.padEnd(a," ")}`);return}let x=Date.now();($||x-l>=2e3)&&(console.log(g),l=x)}function h(){!e||p||(p=setInterval(()=>{r>=t&&c===0||v()},120),p.unref?.())}function w(){p&&(clearInterval(p),p=null)}return v(!0),h(),{onStart(){c++,v()},onComplete($){c=Math.max(0,c-1),r++,$&&u++,v(!0)},finish(){w(),v(!0),e&&process.stdout.write(`
10
+ `)}}}var Be={onStart(){},onComplete(t){},finish(){}};import nt from"fs/promises";import te from"path";import y from"chalk";function Ve(t){if(t.length!==0){console.log(`
11
+ ${"=".repeat(80)}`),console.log(y.bold.red("\u2716 FAILED TEST FILES (VERBOSE OUTPUT)")),console.log("=".repeat(80));for(let e of t)console.log(`
12
+ ${y.red("\u2716")} ${y.red(e.file)} ${y.dim(`(exit ${e.code})`)}`),e.rawOutput?.trim()?console.log(e.rawOutput.trimEnd()):console.log(y.dim("(no child output captured)"));console.log(`
13
+ ${"=".repeat(80)}`)}}function Ue(t,e){if(t===0){let o="% Coverage report from v8",n=e.split(`
14
+ `),s=n.findIndex(r=>L(r).includes(o));if(s>=0){let r=n.length;for(let u=s+1;u<n.length;u++){let f=L(n[u]).trimStart();if(f.startsWith("stderr |")||f.startsWith("stdout |")){r=u;break}}if(n.slice(s+1,r).join(`
15
+ `).trimEnd()){let u=n.slice(s,r).join(`
16
16
  `).trimEnd();console.log(`
17
- ${l}
18
- `)}}}else{let o=t.trimEnd();o&&console.error(o)}}function Pt(e){let t=(s,n)=>n===0?100:parseFloat((s/n*100).toFixed(2)),o={total:{statements:{total:0,covered:0,pct:0},branches:{total:0,covered:0,pct:0},functions:{total:0,covered:0,pct:0},lines:{total:0,covered:0,pct:0}}};for(let[s,n]of Object.entries(e)){let a=Object.keys(n.s??{}),l=a.length,g=a.filter(d=>n.s[d]>0).length,c=Object.keys(n.f??{}),p=c.length,f=c.filter(d=>n.f[d]>0).length,v=0,m=0;for(let d of Object.values(n.b??{}))v+=d.length,m+=d.filter(x=>x>0).length;let h=new Set,w=new Set;for(let[d,x]of Object.entries(n.statementMap??{})){let y=x?.start?.line;y!=null&&(w.add(y),(n.s??{})[d]>0&&h.add(y))}let $={statements:{total:l,covered:g,pct:t(g,l)},branches:{total:v,covered:m,pct:t(m,v)},functions:{total:p,covered:f,pct:t(f,p)},lines:{total:w.size,covered:h.size,pct:t(h.size,w.size)}};o[s]=$;for(let d of["statements","branches","functions","lines"])o.total[d].total+=$[d].total,o.total[d].covered+=$[d].covered}let r=Object.keys(e).length>0;for(let s of["statements","branches","functions","lines"]){let{total:n,covered:a}=o.total[s];o.total[s].pct=r?t(a,n):"Unknown"}return o}function Ot({lines:e,stmts:t,fns:o,branches:r}){let s=[e,t,o,r].filter(Y);return s.length>0?Math.min(...s):null}function st(e){return e??Number.MAX_VALUE}function Dt({lines:e,stmts:t,fns:o,branches:r}){return![e,t,o,r].every(Y)}function It({lines:e,stmts:t,fns:o,branches:r}){console.log(`
19
- ${E.bold("Coverage")} ${H(E,e)}% lines ${E.dim("|")} ${H(E,t)}% statements ${E.dim("|")} ${H(E,o)}% functions ${E.dim("|")} ${H(E,r)}% branches`)}async function Ue(e,t,o=10,r={}){let{silent:s=!1}=r,n=te.resolve(e,"coverage"),a=t.find(h=>h.startsWith("--coverage.reportsDirectory="));if(a){let h=a.split("=").slice(1).join("=");n=te.isAbsolute(h)?h:te.resolve(e,h)}let l;try{let h=await ot.readFile(te.join(n,"coverage-summary.json"),"utf8");l=JSON.parse(h)}catch{try{let h=await ot.readFile(te.join(n,"coverage-final.json"),"utf8");l=Pt(JSON.parse(h))}catch{return s||console.log(E.dim(" (no coverage JSON found \u2014 skipping summary)")),null}}let{total:g,...c}=l,p={lines:g.lines?.pct??0,stmts:g.statements?.pct??0,fns:g.functions?.pct??0,branches:g.branches?.pct??0},f=Object.keys(c).length===0&&!Object.values(p).some(Y),v=[],m=0;if(o>0){let h=Object.entries(c).map(([$,d])=>({file:te.relative(e,$),lines:d.lines?.pct??0,stmts:d.statements?.pct??0,fns:d.functions?.pct??0,branches:d.branches?.pct??0})).map($=>({row:$,worst:Ot($)})).filter(({row:$,worst:d})=>Dt($)||d<100).sort(($,d)=>st($.worst)-st(d.worst)),w=h.slice(0,o);s||(console.log(`
20
- `+E.bold("\u{1F4C9} WORST COVERAGE FILES (lowest metric)")),console.log("-".repeat(80)),w.forEach(({row:{file:$,lines:d,stmts:x,fns:y,branches:P},worst:_})=>{let N=E.dim(`lines ${X(d,0)}% | stmts ${X(x,0)}% | fns ${X(y,0)}% | branches ${X(P,0)}%`);console.log(` ${H(E,_)}% ${E.dim($)} ${N}`)}),h.length>o&&console.log(E.dim(` ... and ${h.length-o} more files`))),v=w.map(({row:$})=>$),m=h.length}return s||(It(p),f&&console.log(E.dim(" No files were measured (the coverage include matched nothing), so every percentage is Unknown and coverage thresholds are skipped."))),{coverageDir:n,total:g,noFilesMeasured:f,worstFiles:v,worstFilesShown:v.length,worstFilesTotal:m,summary:l}}import ae from"fs/promises";import nt from"fs";import oe from"path";var rt="tmp/vitest-runner",At=/^(\d+)-\d+$/;function Ct(e){try{return process.kill(e,0),!0}catch(t){return t.code!=="ESRCH"}}function kt(e){return String(e).replace(/[^a-zA-Z0-9_-]+/g,"-").slice(0,80)||"scratch"}async function it(e,t){let o=oe.resolve(e,t),r;try{r=await ae.readdir(o,{withFileTypes:!0})}catch{return}for(let s of r){if(!s.isDirectory())continue;let n=s.name.match(At);if(!n)continue;let a=parseInt(n[1],10);Ct(a)||await ae.rm(oe.join(o,s.name),{recursive:!0,force:!0}).catch(()=>{})}}async function ct(e,t){let o=oe.resolve(e,t),r=oe.join(o,`${process.pid}-${Date.now()}`);return await ae.mkdir(r,{recursive:!0}),r}async function ze(e,t){let o=oe.join(e,`worker-${t}`);return await ae.mkdir(o,{recursive:!0}),o}async function at(e){await ae.rm(e,{recursive:!0,force:!0}).catch(()=>{})}function lt(e){try{nt.rmSync(e,{recursive:!0,force:!0})}catch{}}function Rt(e){let t=process.env.VITEST_RUNNER_TMP;if(!t)throw new Error("makeRunTmpDir() requires VITEST_RUNNER_TMP to be set \u2014 call it from a test file run by vitest-runner.");return nt.mkdtempSync(oe.join(t,`${kt(e)}-`))}function pt(e,t,o){let r=e.replace(/\\/g,"/"),s;for(let{pattern:n,heapMb:a}of o)if(r.includes(n)){s=a;break}if(!(s===void 0&&t===void 0))return s===void 0?t:t===void 0?s:Math.max(s,t)}async function To(e){let t=e.cwd??process.cwd(),o=e.scratchDir??rt,r=e.keepTmp??!1;await it(t,o);let s=await ct(t,o),n=()=>{lt(s),process.exitCode=130,process.exit()};r||(process.once("SIGINT",n),process.once("SIGTERM",n));try{return await jt(e,s)}finally{process.removeListener("SIGINT",n),process.removeListener("SIGTERM",n),r||await at(s)}}async function jt(e,t){let{cwd:o=process.cwd(),testDir:r,testPatterns:s=[],testListFile:n,testFilePattern:a,vitestArgs:l=[],showErrorDetails:g=!0,coverageQuiet:c=!1,suppressFileOutput:p=!1,suppressPassingFiles:f=!1,topSummary:v=!0,json:m=!1,workers:h=parseInt(process.env.VITEST_WORKERS??"4",10),worstCoverageCount:w=10,blobsDir:$,mergeReports:d=!0,earlyRunPatterns:x=[],perFileHeapOverrides:y=[],conditions:P=[],nodeEnv:_="development",_testResultsOverride:N=null}=e,T=0,B=e.maxOldSpaceMb??(process.env.VITEST_HEAP_MB?parseInt(process.env.VITEST_HEAP_MB,10):void 0),O=!m,ft=Pe(o,"vitest","vitest"),ut=await Oe(o,e.vitestConfig),he={cwd:o,vitestBin:ft,vitestConfig:ut,conditions:P,nodeEnv:_},A=[...l];if(c&&!A.some(i=>i==="--coverage"||i.startsWith("--coverage."))&&A.unshift("--coverage"),A.some(i=>i==="--coverage"||i.startsWith("--coverage."))){let i=me.resolve(o,$??".vitest-coverage-blobs"),u=me.resolve(o,".vitest-coverage-tmp");await Promise.all([K.rm(i,{recursive:!0,force:!0}),K.rm(u,{recursive:!0,force:!0})]),await Promise.all([K.mkdir(i,{recursive:!0}),K.mkdir(u,{recursive:!0})]);let b=await de({cwd:o,testDir:r,testPatterns:s,testListFile:n,testFilePattern:a,earlyRunPatterns:x}),D=Ie(b);if(b.length===0){let F=s.length>0?`\u274C No Vitest test files found matching: ${s.join(", ")}`:"\u274C No Vitest test files found";return O&&console.log(F),m?{exitCode:1,mode:"coverage",message:F,options:{cwd:o,testDir:r,testPatterns:s,testListFile:n,workers:h,coverageQuiet:c,suppressFileOutput:p,suppressPassingFiles:f,topSummary:v,vitestArgs:A}}:1}let k=A.filter(F=>F!=="--coverage"&&F.startsWith("--coverage.")),Fe=A.filter(F=>F!=="--coverage"&&!F.startsWith("--coverage.")),ie=b.filter(F=>x.some(M=>F.replace(/\\/g,"/").includes(M))),be=b.filter(F=>!x.some(M=>F.replace(/\\/g,"/").includes(M))),xe=c||p||m,St=c&&!m;!c&&!p&&O&&(console.log(`
21
- \u{1F9EA} Running ${b.length} test files for coverage (blob + merge mode)`),console.log(`\u2699\uFE0F Workers: ${h} (${ie.length} solo first, then parallel)`),B&&console.log(`\u{1F9E0} Heap limit: ${B} MB`),console.log(""));let we=St?Le(b.length):_e,j=[],Te=0,Qe=async F=>{let M=me.join(i,`run-${Te}.blob`);Te++,!xe&&O&&(console.log(`
22
- ${"=".repeat(80)}`),console.log(`\u25B6\uFE0F ${F}`),console.log("=".repeat(80))),we.onStart();let U=me.join(u,`run-${Te}`),Ft=[...Fe,"--coverage",`--coverage.reportsDirectory=${U}`,"--reporter=default","--reporter=blob",`--outputFile=${M}`],bt=await ze(t,T++),z=await ge(F,{...he,maxOldSpaceMb:pt(F,B,y),vitestArgs:Ft,streamOutput:!xe,excludePaths:D.get(F),extraEnv:{VITEST_RUNNER_TMP:bt}});if(j.push(z),we.onComplete(z.code!==0),!xe&&O){let Xe=(z.duration/1e3).toFixed(2);if(z.code===0){let xt=z.heapMb?` | ${z.heapMb} MB heap`:"";console.log(`
23
- \u2705 PASSED (${Xe}s${xt})
17
+ ${u}
18
+ `)}}}else{let o=e.trimEnd();o&&console.error(o)}}function It(t){let e=(s,r)=>r===0?100:parseFloat((s/r*100).toFixed(2)),o={total:{statements:{total:0,covered:0,pct:0},branches:{total:0,covered:0,pct:0},functions:{total:0,covered:0,pct:0},lines:{total:0,covered:0,pct:0}}};for(let[s,r]of Object.entries(t)){let c=Object.keys(r.s??{}),u=c.length,f=c.filter(g=>r.s[g]>0).length,a=Object.keys(r.f??{}),l=a.length,p=a.filter(g=>r.f[g]>0).length,m=0,v=0;for(let g of Object.values(r.b??{}))m+=g.length,v+=g.filter(x=>x>0).length;let h=new Set,w=new Set;for(let[g,x]of Object.entries(r.statementMap??{})){let P=x?.start?.line;P!=null&&(w.add(P),(r.s??{})[g]>0&&h.add(P))}let $={statements:{total:u,covered:f,pct:e(f,u)},branches:{total:m,covered:v,pct:e(v,m)},functions:{total:l,covered:p,pct:e(p,l)},lines:{total:w.size,covered:h.size,pct:e(h.size,w.size)}};o[s]=$;for(let g of["statements","branches","functions","lines"])o.total[g].total+=$[g].total,o.total[g].covered+=$[g].covered}let n=Object.keys(t).length>0;for(let s of["statements","branches","functions","lines"]){let{total:r,covered:c}=o.total[s];o.total[s].pct=n?e(c,r):"Unknown"}return o}function At({lines:t,stmts:e,fns:o,branches:n}){let s=[t,e,o,n].filter(Y);return s.length>0?Math.min(...s):null}function rt(t){return t??Number.MAX_VALUE}function Ct({lines:t,stmts:e,fns:o,branches:n}){return![t,e,o,n].every(Y)}function Rt({lines:t,stmts:e,fns:o,branches:n}){console.log(`
19
+ ${y.bold("Coverage")} ${H(y,t)}% lines ${y.dim("|")} ${H(y,e)}% statements ${y.dim("|")} ${H(y,o)}% functions ${y.dim("|")} ${H(y,n)}% branches`)}async function ze(t,e,o=10,n={}){let{silent:s=!1}=n,r=te.resolve(t,"coverage"),c=e.find(h=>h.startsWith("--coverage.reportsDirectory="));if(c){let h=c.split("=").slice(1).join("=");r=te.isAbsolute(h)?h:te.resolve(t,h)}let u;try{let h=await nt.readFile(te.join(r,"coverage-summary.json"),"utf8");u=JSON.parse(h)}catch{try{let h=await nt.readFile(te.join(r,"coverage-final.json"),"utf8");u=It(JSON.parse(h))}catch{return s||console.log(y.dim(" (no coverage JSON found \u2014 skipping summary)")),null}}let{total:f,...a}=u,l={lines:f.lines?.pct??0,stmts:f.statements?.pct??0,fns:f.functions?.pct??0,branches:f.branches?.pct??0},p=Object.keys(a).length===0&&!Object.values(l).some(Y),m=[],v=0;if(o>0){let h=Object.entries(a).map(([$,g])=>({file:te.relative(t,$),lines:g.lines?.pct??0,stmts:g.statements?.pct??0,fns:g.functions?.pct??0,branches:g.branches?.pct??0})).map($=>({row:$,worst:At($)})).filter(({row:$,worst:g})=>Ct($)||g<100).sort(($,g)=>rt($.worst)-rt(g.worst)),w=h.slice(0,o);s||(console.log(`
20
+ `+y.bold("\u{1F4C9} WORST COVERAGE FILES (lowest metric)")),console.log("-".repeat(80)),w.forEach(({row:{file:$,lines:g,stmts:x,fns:P,branches:E},worst:_})=>{let N=y.dim(`lines ${X(g,0)}% | stmts ${X(x,0)}% | fns ${X(P,0)}% | branches ${X(E,0)}%`);console.log(` ${H(y,_)}% ${y.dim($)} ${N}`)}),h.length>o&&console.log(y.dim(` ... and ${h.length-o} more files`))),m=w.map(({row:$})=>$),v=h.length}return s||(Rt(l),p&&console.log(y.dim(" No files were measured (the coverage include matched nothing), so every percentage is Unknown and coverage thresholds are skipped."))),{coverageDir:r,total:f,noFilesMeasured:p,worstFiles:m,worstFilesShown:m.length,worstFilesTotal:v,summary:u}}import ae from"fs/promises";import it from"fs";import oe from"path";var ct="tmp/vitest-runner",kt=/^(\d+)-\d+$/;function jt(t){try{return process.kill(t,0),!0}catch(e){return e.code!=="ESRCH"}}function Nt(t){return String(t).replace(/[^a-zA-Z0-9_-]+/g,"-").slice(0,80)||"scratch"}async function at(t,e){let o=oe.resolve(t,e),n;try{n=await ae.readdir(o,{withFileTypes:!0})}catch{return}for(let s of n){if(!s.isDirectory())continue;let r=s.name.match(kt);if(!r)continue;let c=parseInt(r[1],10);jt(c)||await ae.rm(oe.join(o,s.name),{recursive:!0,force:!0}).catch(()=>{})}}async function lt(t,e){let o=oe.resolve(t,e),n=oe.join(o,`${process.pid}-${Date.now()}`);return await ae.mkdir(n,{recursive:!0}),n}async function He(t,e){let o=oe.join(t,`worker-${e}`);return await ae.mkdir(o,{recursive:!0}),o}async function ft(t){await ae.rm(t,{recursive:!0,force:!0}).catch(()=>{})}function pt(t){try{it.rmSync(t,{recursive:!0,force:!0})}catch{}}function Lt(t){let e=process.env.VITEST_RUNNER_TMP;if(!e)throw new Error("makeRunTmpDir() requires VITEST_RUNNER_TMP to be set \u2014 call it from a test file run by vitest-runner.");return it.mkdtempSync(oe.join(e,`${Nt(t)}-`))}function ut(t,e,o){let n=t.replace(/\\/g,"/"),s;for(let{pattern:r,heapMb:c}of o)if(n.includes(r)){s=c;break}if(!(s===void 0&&e===void 0))return s===void 0?e:e===void 0?s:Math.max(s,e)}async function yo(t){let e=t.cwd??process.cwd(),o=t.scratchDir??ct,n=t.keepTmp??!1;await at(e,o);let s=await lt(e,o),r=()=>{pt(s),process.exitCode=130,process.exit()};n||(process.once("SIGINT",r),process.once("SIGTERM",r));try{return await _t(t,s)}finally{process.removeListener("SIGINT",r),process.removeListener("SIGTERM",r),n||await ft(s)}}async function _t(t,e){let{cwd:o=process.cwd(),testDir:n,testPatterns:s=[],testListFile:r,testFilePattern:c,vitestArgs:u=[],showErrorDetails:f=!0,coverageQuiet:a=!1,suppressFileOutput:l=!1,suppressPassingFiles:p=!1,topSummary:m=!0,json:v=!1,workers:h=parseInt(process.env.VITEST_WORKERS??"4",10),worstCoverageCount:w=10,blobsDir:$,mergeReports:g=!0,earlyRunPatterns:x=[],exclude:P=[],perFileHeapOverrides:E=[],conditions:_=[],nodeEnv:N="development",_testResultsOverride:T=null}=t,We=0,B=t.maxOldSpaceMb??(process.env.VITEST_HEAP_MB?parseInt(process.env.VITEST_HEAP_MB,10):void 0),O=!v,dt=Pe(o,"vitest","vitest"),gt=await Oe(o,t.vitestConfig),he={cwd:o,vitestBin:dt,vitestConfig:gt,conditions:_,nodeEnv:N},A=[...u];if(a&&!A.some(i=>i==="--coverage"||i.startsWith("--coverage."))&&A.unshift("--coverage"),A.some(i=>i==="--coverage"||i.startsWith("--coverage."))){let i=me.resolve(o,$??".vitest-coverage-blobs"),d=me.resolve(o,".vitest-coverage-tmp");await Promise.all([K.rm(i,{recursive:!0,force:!0}),K.rm(d,{recursive:!0,force:!0})]),await Promise.all([K.mkdir(i,{recursive:!0}),K.mkdir(d,{recursive:!0})]);let F=await de({cwd:o,testDir:n,testPatterns:s,testListFile:r,testFilePattern:c,earlyRunPatterns:x,exclude:P}),D=Ae(F);if(F.length===0){let b=s.length>0?`\u274C No Vitest test files found matching: ${s.join(", ")}`:"\u274C No Vitest test files found";return O&&console.log(b),v?{exitCode:1,mode:"coverage",message:b,options:{cwd:o,testDir:n,testPatterns:s,testListFile:r,workers:h,coverageQuiet:a,suppressFileOutput:l,suppressPassingFiles:p,topSummary:m,vitestArgs:A}}:1}let k=A.filter(b=>b!=="--coverage"&&b.startsWith("--coverage.")),be=A.filter(b=>b!=="--coverage"&&!b.startsWith("--coverage.")),ie=F.filter(b=>x.some(M=>b.replace(/\\/g,"/").includes(M))),Fe=F.filter(b=>!x.some(M=>b.replace(/\\/g,"/").includes(M))),xe=a||l||v,Ft=a&&!v;!a&&!l&&O&&(console.log(`
21
+ \u{1F9EA} Running ${F.length} test files for coverage (blob + merge mode)`),console.log(`\u2699\uFE0F Workers: ${h} (${ie.length} solo first, then parallel)`),B&&console.log(`\u{1F9E0} Heap limit: ${B} MB`),console.log(""));let we=Ft?_e(F.length):Be,j=[],Te=0,Ye=async b=>{let M=me.join(i,`run-${Te}.blob`);Te++,!xe&&O&&(console.log(`
22
+ ${"=".repeat(80)}`),console.log(`\u25B6\uFE0F ${b}`),console.log("=".repeat(80))),we.onStart();let U=me.join(d,`run-${Te}`),xt=[...be,"--coverage",`--coverage.reportsDirectory=${U}`,"--reporter=default","--reporter=blob",`--outputFile=${M}`],wt=await He(e,We++),z=await ge(b,{...he,maxOldSpaceMb:ut(b,B,E),vitestArgs:xt,streamOutput:!xe,excludePaths:D.get(b),extraEnv:{VITEST_RUNNER_TMP:wt}});if(j.push(z),we.onComplete(z.code!==0),!xe&&O){let tt=(z.duration/1e3).toFixed(2);if(z.code===0){let Tt=z.heapMb?` | ${z.heapMb} MB heap`:"";console.log(`
23
+ \u2705 PASSED (${tt}s${Tt})
24
24
  `)}else console.log(`
25
- \u274C FAILED (exit code ${z.code}, ${Xe}s)
26
- `)}};for(let F of ie)await Qe(F).catch(M=>{O&&console.error(`Error running ${F}:`,M)});let Me=0,Q=new Set;for(;Me<be.length||Q.size>0;){for(;Me<be.length&&Q.size<h;){let F=be[Me++],M=Qe(F).catch(U=>{O&&console.error(`Error running ${F}:`,U)}).finally(()=>Q.delete(M));Q.add(M)}Q.size>0&&await Promise.race(Q)}we.finish();let Ee=(await K.readdir(i).catch(()=>[])).filter(F=>F.endsWith(".blob"));if(Ee.length===0){let F="\u274C No coverage blobs were generated \u2014 coverage report cannot be produced";return O&&console.error(F),m?{exitCode:1,mode:"coverage",message:F,options:{cwd:o,testDir:r,testPatterns:s,testListFile:n,workers:h,coverageQuiet:c,suppressFileOutput:p,suppressPassingFiles:f,topSummary:v,showErrorDetails:g,worstCoverageCount:w,vitestArgs:A},totals:{testFiles:b.length,failedFiles:j.filter(M=>M.code!==0).length,passedFiles:j.filter(M=>M.code===0).length},results:{all:j,failed:j.filter(M=>M.code!==0)},merge:{blobFiles:0,exitCode:1,output:""},coverageSummary:null}:1}let pe=0,ye="",Ze=null;d&&(!c&&!p&&O&&(console.log(`
27
- ${"=".repeat(80)}`),console.log(`\u{1F4CA} Merging ${Ee.length} coverage blobs into final report...`),console.log("=".repeat(80))),{exitCode:pe,output:ye}=await Ne(i,{...he,maxOldSpaceMb:B,extraCoverageArgs:k,quietOutput:c||m}),c&&O&&Ve(pe,ye),Ze=await Ue(o,k,w,{silent:m})),await Promise.all([...d?[K.rm(i,{recursive:!0,force:!0}).catch(()=>{})]:[],K.rm(u,{recursive:!0,force:!0}).catch(()=>{})]);let ce=j.filter(F=>F.code!==0);c&&O&&Be(ce);let Ye=ce.length>0?1:pe;if(m){let F=j.filter(M=>M.heapMb!==null);return{exitCode:Ye,mode:"coverage",options:{cwd:o,testDir:r,testPatterns:s,testListFile:n,workers:h,coverageQuiet:c,suppressFileOutput:p,suppressPassingFiles:f,topSummary:v,showErrorDetails:g,worstCoverageCount:w,vitestArgs:A},totals:{testFiles:b.length,failedFiles:ce.length,passedFiles:j.length-ce.length},results:{all:j,failed:ce},merge:{blobFiles:Ee.length,exitCode:pe,output:ye},coverageSummary:Ze,...v?{topMemoryUsers:[...F].sort((M,U)=>U.heapMb-M.heapMb).slice(0,10),topDuration:[...j].sort((M,U)=>U.duration-M.duration).slice(0,10)}:{}}}return Ye}let q=await de({cwd:o,testDir:r,testPatterns:s,testListFile:n,testFilePattern:a,earlyRunPatterns:x}),dt=Ie(q);if(q.length===0){let i=s.length>0?`\u274C No Vitest test files found matching: ${s.join(", ")}`:"\u274C No Vitest test files found";return O&&console.log(i),m?{exitCode:1,mode:"standard",message:i,options:{cwd:o,testDir:r,testPatterns:s,testListFile:n,workers:h,coverageQuiet:c,suppressFileOutput:p,suppressPassingFiles:f,topSummary:v,vitestArgs:A}}:1}let He=q.filter(i=>x.some(u=>i.replace(/\\/g,"/").includes(u))),ve=q.filter(i=>!x.some(u=>i.replace(/\\/g,"/").includes(u))),gt=Date.now(),We=new Date().toLocaleTimeString("en-US",{hour12:!1});O&&!p&&s.length>0?console.log(`
28
- \u{1F9EA} Running ${q.length} test files matching: ${s.join(", ")}`):O&&!p&&console.log(`
29
- \u{1F9EA} Running ${q.length} test files (${He.length} solo first, then parallel)`),O&&!p&&(console.log(`\u2699\uFE0F Workers: ${h}`),B&&console.log(`\u{1F9E0} Heap limit: ${B} MB`),A.length>0&&console.log(`\u{1F527} Vitest args: ${A.join(" ")}`),console.log(""));let I=[...N??[]],Ke=async i=>{!p&&O&&(console.log(`
30
- ${"=".repeat(80)}`),console.log(`\u25B6\uFE0F ${i}`),console.log("=".repeat(80)));let u=await ze(t,T++),b=await ge(i,{...he,maxOldSpaceMb:pt(i,B,y),vitestArgs:A,streamOutput:!p&&!m,excludePaths:dt.get(i),extraEnv:{VITEST_RUNNER_TMP:u}});if(!p&&O){let D=(b.duration/1e3).toFixed(2);if(b.code===0){let k=b.heapMb?` | ${b.heapMb} MB heap`:"";console.log(`
25
+ \u274C FAILED (exit code ${z.code}, ${tt}s)
26
+ `)}};for(let b of ie)await Ye(b).catch(M=>{O&&console.error(`Error running ${b}:`,M)});let Me=0,Q=new Set;for(;Me<Fe.length||Q.size>0;){for(;Me<Fe.length&&Q.size<h;){let b=Fe[Me++],M=Ye(b).catch(U=>{O&&console.error(`Error running ${b}:`,U)}).finally(()=>Q.delete(M));Q.add(M)}Q.size>0&&await Promise.race(Q)}we.finish();let Ee=(await K.readdir(i).catch(()=>[])).filter(b=>b.endsWith(".blob"));if(Ee.length===0){let b="\u274C No coverage blobs were generated \u2014 coverage report cannot be produced";return O&&console.error(b),v?{exitCode:1,mode:"coverage",message:b,options:{cwd:o,testDir:n,testPatterns:s,testListFile:r,workers:h,coverageQuiet:a,suppressFileOutput:l,suppressPassingFiles:p,topSummary:m,showErrorDetails:f,worstCoverageCount:w,vitestArgs:A},totals:{testFiles:F.length,failedFiles:j.filter(M=>M.code!==0).length,passedFiles:j.filter(M=>M.code===0).length},results:{all:j,failed:j.filter(M=>M.code!==0)},merge:{blobFiles:0,exitCode:1,output:""},coverageSummary:null}:1}let fe=0,ye="",Xe=null;g&&(!a&&!l&&O&&(console.log(`
27
+ ${"=".repeat(80)}`),console.log(`\u{1F4CA} Merging ${Ee.length} coverage blobs into final report...`),console.log("=".repeat(80))),{exitCode:fe,output:ye}=await Le(i,{...he,maxOldSpaceMb:B,extraCoverageArgs:k,quietOutput:a||v}),a&&O&&Ue(fe,ye),Xe=await ze(o,k,w,{silent:v})),await Promise.all([...g?[K.rm(i,{recursive:!0,force:!0}).catch(()=>{})]:[],K.rm(d,{recursive:!0,force:!0}).catch(()=>{})]);let ce=j.filter(b=>b.code!==0);a&&O&&Ve(ce);let et=ce.length>0?1:fe;if(v){let b=j.filter(M=>M.heapMb!==null);return{exitCode:et,mode:"coverage",options:{cwd:o,testDir:n,testPatterns:s,testListFile:r,workers:h,coverageQuiet:a,suppressFileOutput:l,suppressPassingFiles:p,topSummary:m,showErrorDetails:f,worstCoverageCount:w,vitestArgs:A},totals:{testFiles:F.length,failedFiles:ce.length,passedFiles:j.length-ce.length},results:{all:j,failed:ce},merge:{blobFiles:Ee.length,exitCode:fe,output:ye},coverageSummary:Xe,...m?{topMemoryUsers:[...b].sort((M,U)=>U.heapMb-M.heapMb).slice(0,10),topDuration:[...j].sort((M,U)=>U.duration-M.duration).slice(0,10)}:{}}}return et}let q=await de({cwd:o,testDir:n,testPatterns:s,testListFile:r,testFilePattern:c,earlyRunPatterns:x,exclude:P}),mt=Ae(q);if(q.length===0){let i=s.length>0?`\u274C No Vitest test files found matching: ${s.join(", ")}`:"\u274C No Vitest test files found";return O&&console.log(i),v?{exitCode:1,mode:"standard",message:i,options:{cwd:o,testDir:n,testPatterns:s,testListFile:r,workers:h,coverageQuiet:a,suppressFileOutput:l,suppressPassingFiles:p,topSummary:m,vitestArgs:A}}:1}let Ke=q.filter(i=>x.some(d=>i.replace(/\\/g,"/").includes(d))),ve=q.filter(i=>!x.some(d=>i.replace(/\\/g,"/").includes(d))),ht=Date.now(),qe=new Date().toLocaleTimeString("en-US",{hour12:!1});O&&!l&&s.length>0?console.log(`
28
+ \u{1F9EA} Running ${q.length} test files matching: ${s.join(", ")}`):O&&!l&&console.log(`
29
+ \u{1F9EA} Running ${q.length} test files (${Ke.length} solo first, then parallel)`),O&&!l&&(console.log(`\u2699\uFE0F Workers: ${h}`),B&&console.log(`\u{1F9E0} Heap limit: ${B} MB`),A.length>0&&console.log(`\u{1F527} Vitest args: ${A.join(" ")}`),console.log(""));let I=[...T??[]],Ge=async i=>{!l&&O&&(console.log(`
30
+ ${"=".repeat(80)}`),console.log(`\u25B6\uFE0F ${i}`),console.log("=".repeat(80)));let d=await He(e,We++),F=await ge(i,{...he,maxOldSpaceMb:ut(i,B,E),vitestArgs:A,streamOutput:!l&&!v,excludePaths:mt.get(i),extraEnv:{VITEST_RUNNER_TMP:d}});if(!l&&O){let D=(F.duration/1e3).toFixed(2);if(F.code===0){let k=F.heapMb?` | ${F.heapMb} MB heap`:"";console.log(`
31
31
  \u2705 PASSED (${D}s${k})
32
32
  `)}else console.log(`
33
- \u274C FAILED (exit code ${b.code}, ${D}s)
34
- `)}return b};if(!N){for(let b of He){let D=await Ke(b).catch(k=>(O&&console.error(`Error running ${b}:`,k),null));D&&I.push(D)}let i=0,u=new Set;for(;i<ve.length||u.size>0;){for(;i<ve.length&&u.size<h;){let b=ve[i++],D=Ke(b).then(k=>I.push(k)).catch(k=>{O&&console.error(`Error running ${b}:`,k)}).finally(()=>u.delete(D));u.add(D)}u.size>0&&await Promise.race(u)}}let G=I.reduce((i,u)=>i+u.testFilesPass,0),V=I.reduce((i,u)=>i+u.testFilesFail,0),se=I.reduce((i,u)=>i+u.testsPass,0),ne=I.reduce((i,u)=>i+u.testsFail,0),re=I.reduce((i,u)=>i+(u.testsSkip||0),0),mt=I.reduce((i,u)=>i+u.duration,0),J=I.filter(i=>i.code!==0),le=I.filter(i=>i.code===0),ht=J.length>0?1:0,qe=process.memoryUsage(),$e=Math.round(qe.heapUsed/1024/1024),Se=Math.round(qe.rss/1024/1024),C=I.filter(i=>i.heapMb!==null),Ge=((Date.now()-gt)/1e3).toFixed(2),Je=(mt/1e3).toFixed(2);if(m)return{exitCode:ht,mode:"standard",options:{cwd:o,testDir:r,testPatterns:s,testListFile:n,workers:h,coverageQuiet:c,suppressFileOutput:p,suppressPassingFiles:f,topSummary:v,showErrorDetails:g,worstCoverageCount:w,vitestArgs:A},totals:{testFilesPass:G,testFilesFail:V,testsPass:se,testsFail:ne,testsSkip:re,totalTests:se+ne+re},timing:{startAt:We,wallClockSeconds:Number(Ge),testsSeconds:Number(Je)},heap:{scriptHeapMb:$e,scriptRssMb:Se,maxHeapMb:C.length>0?Math.max(...C.map(i=>i.heapMb)):null,avgHeapMb:C.length>0?Number((C.reduce((i,u)=>i+u.heapMb,0)/C.length).toFixed(0)):null},results:{all:I,passed:le,failed:J},...v?{topMemoryUsers:[...C].sort((i,u)=>u.heapMb-i.heapMb).slice(0,10),topDuration:[...I].sort((i,u)=>u.duration-i.duration).slice(0,10)}:{}};console.log(`
35
- `+"=".repeat(80)),v&&C.length>0&&(console.log(`
36
- `+S.bold("\u{1F9E0} TOP MEMORY USERS")),console.log("-".repeat(80)),[...C].sort((i,u)=>u.heapMb-i.heapMb).slice(0,10).forEach(i=>{console.log(` ${String(i.heapMb).padStart(4)} MB ${S.dim(i.file)}`)})),v&&I.length>0&&(console.log(`
37
- `+S.bold("\u23F1\uFE0F TOP DURATION")),console.log("-".repeat(80)),[...I].sort((i,u)=>u.duration-i.duration).slice(0,10).forEach(i=>{let u=(i.duration/1e3).toFixed(2);console.log(` ${(u+"s").padStart(8)} ${S.dim(i.file)}`)})),le.length>0&&!f&&(console.log(`
38
- `+"=".repeat(80)),console.log(S.bold.green("\u2713 PASSED TEST FILES")),console.log("=".repeat(80)),le.forEach(i=>{let u=(i.duration/1e3).toFixed(2),b=[...i.heapMb?[`${i.heapMb} MB`]:[],`${u}s`],D=i.testsPass>0?` - ${i.testsPass} tests`:"";console.log(S.green(`\u2713 ${i.file}${D}`)+S.dim(` (${b.join(", ")})`))})),console.log(`
33
+ \u274C FAILED (exit code ${F.code}, ${D}s)
34
+ `)}return F};if(!T){for(let F of Ke){let D=await Ge(F).catch(k=>(O&&console.error(`Error running ${F}:`,k),null));D&&I.push(D)}let i=0,d=new Set;for(;i<ve.length||d.size>0;){for(;i<ve.length&&d.size<h;){let F=ve[i++],D=Ge(F).then(k=>I.push(k)).catch(k=>{O&&console.error(`Error running ${F}:`,k)}).finally(()=>d.delete(D));d.add(D)}d.size>0&&await Promise.race(d)}}let G=I.reduce((i,d)=>i+d.testFilesPass,0),V=I.reduce((i,d)=>i+d.testFilesFail,0),se=I.reduce((i,d)=>i+d.testsPass,0),ne=I.reduce((i,d)=>i+d.testsFail,0),re=I.reduce((i,d)=>i+(d.testsSkip||0),0),vt=I.reduce((i,d)=>i+d.duration,0),J=I.filter(i=>i.code!==0),le=I.filter(i=>i.code===0),$t=J.length>0?1:0,Je=process.memoryUsage(),$e=Math.round(Je.heapUsed/1024/1024),Se=Math.round(Je.rss/1024/1024),R=I.filter(i=>i.heapMb!==null),Qe=((Date.now()-ht)/1e3).toFixed(2),Ze=(vt/1e3).toFixed(2);if(v)return{exitCode:$t,mode:"standard",options:{cwd:o,testDir:n,testPatterns:s,testListFile:r,workers:h,coverageQuiet:a,suppressFileOutput:l,suppressPassingFiles:p,topSummary:m,showErrorDetails:f,worstCoverageCount:w,vitestArgs:A},totals:{testFilesPass:G,testFilesFail:V,testsPass:se,testsFail:ne,testsSkip:re,totalTests:se+ne+re},timing:{startAt:qe,wallClockSeconds:Number(Qe),testsSeconds:Number(Ze)},heap:{scriptHeapMb:$e,scriptRssMb:Se,maxHeapMb:R.length>0?Math.max(...R.map(i=>i.heapMb)):null,avgHeapMb:R.length>0?Number((R.reduce((i,d)=>i+d.heapMb,0)/R.length).toFixed(0)):null},results:{all:I,passed:le,failed:J},...m?{topMemoryUsers:[...R].sort((i,d)=>d.heapMb-i.heapMb).slice(0,10),topDuration:[...I].sort((i,d)=>d.duration-i.duration).slice(0,10)}:{}};console.log(`
35
+ `+"=".repeat(80)),m&&R.length>0&&(console.log(`
36
+ `+S.bold("\u{1F9E0} TOP MEMORY USERS")),console.log("-".repeat(80)),[...R].sort((i,d)=>d.heapMb-i.heapMb).slice(0,10).forEach(i=>{console.log(` ${String(i.heapMb).padStart(4)} MB ${S.dim(i.file)}`)})),m&&I.length>0&&(console.log(`
37
+ `+S.bold("\u23F1\uFE0F TOP DURATION")),console.log("-".repeat(80)),[...I].sort((i,d)=>d.duration-i.duration).slice(0,10).forEach(i=>{let d=(i.duration/1e3).toFixed(2);console.log(` ${(d+"s").padStart(8)} ${S.dim(i.file)}`)})),le.length>0&&!p&&(console.log(`
38
+ `+"=".repeat(80)),console.log(S.bold.green("\u2713 PASSED TEST FILES")),console.log("=".repeat(80)),le.forEach(i=>{let d=(i.duration/1e3).toFixed(2),F=[...i.heapMb?[`${i.heapMb} MB`]:[],`${d}s`],D=i.testsPass>0?` - ${i.testsPass} tests`:"";console.log(S.green(`\u2713 ${i.file}${D}`)+S.dim(` (${F.join(", ")})`))})),console.log(`
39
39
  `+S.bold("=".repeat(80))),J.length>0&&(console.log(`
40
40
  \u274C ${J.length} test file(s) failed`),console.log(S.bold.red(`
41
- Failed Test Files:`)),J.forEach(i=>{let u=(i.duration/1e3).toFixed(2),b=[...i.testsFail>0?[S.red(`${i.testsFail} failed`)]:[],...i.testsPass>0?[S.green(`${i.testsPass} passed`)]:[],...i.testsSkip>0?[S.yellow(`${i.testsSkip} skipped`)]:[]],D=[...i.heapMb?[`${i.heapMb} MB`]:[],`${u}s`],k=b.length>0?` (${b.join(", ")})`:"";if(console.log(` ${S.red("\u2716")} ${i.file}${k}`+S.dim(` [${D.join(", ")}]`)),g&&i.errors.length>0){let Fe=Ce(i.errors).split(`
41
+ Failed Test Files:`)),J.forEach(i=>{let d=(i.duration/1e3).toFixed(2),F=[...i.testsFail>0?[S.red(`${i.testsFail} failed`)]:[],...i.testsPass>0?[S.green(`${i.testsPass} passed`)]:[],...i.testsSkip>0?[S.yellow(`${i.testsSkip} skipped`)]:[]],D=[...i.heapMb?[`${i.heapMb} MB`]:[],`${d}s`],k=F.length>0?` (${F.join(", ")})`:"";if(console.log(` ${S.red("\u2716")} ${i.file}${k}`+S.dim(` [${D.join(", ")}]`)),f&&i.errors.length>0){let be=Re(i.errors).split(`
42
42
  `).map(ie=>ie.trim()?` ${ie}`:"").join(`
43
- `);console.log(Fe),console.log("")}}),console.log("")),console.log(S.bold("=".repeat(80))),V>0&&G>0?console.log(` ${S.bold("Test Files")} ${S.red(`${V} failed`)} ${S.dim("|")} ${S.green(`${G} passed`)} ${S.dim(`(${G+V})`)}`):V>0?console.log(` ${S.bold("Test Files")} ${S.red(`${V} failed`)} ${S.dim(`(${V})`)}`):console.log(` ${S.bold("Test Files")} ${S.green(`${G} passed`)} ${S.dim(`(${G})`)}`);let vt=se+ne+re,$t=[...ne>0?[S.red(`${ne} failed`)]:[],...se>0?[S.green(`${se} passed`)]:[],...re>0?[S.yellow(`${re} skipped`)]:[]];if(console.log(` ${S.bold("Tests")} ${$t.join(` ${S.dim("|")} `)} ${S.dim(`(${vt})`)}`),console.log(` ${S.bold("Start at")} ${We}`),console.log(` ${S.bold("Duration")} ${Ge}s ${S.dim(`(tests ${Je}s)`)}`),C.length>0){let i=Math.max(...C.map(b=>b.heapMb)),u=(C.reduce((b,D)=>b+D.heapMb,0)/C.length).toFixed(0);console.log(` ${S.bold("Heap")} max ${i} MB | avg ${u} MB | script ${$e} MB (RSS ${Se} MB)`)}else console.log(` ${S.bold("Heap")} script ${$e} MB (RSS ${Se} MB)`);return J.length>0?1:(console.log(`
43
+ `);console.log(be),console.log("")}}),console.log("")),console.log(S.bold("=".repeat(80))),V>0&&G>0?console.log(` ${S.bold("Test Files")} ${S.red(`${V} failed`)} ${S.dim("|")} ${S.green(`${G} passed`)} ${S.dim(`(${G+V})`)}`):V>0?console.log(` ${S.bold("Test Files")} ${S.red(`${V} failed`)} ${S.dim(`(${V})`)}`):console.log(` ${S.bold("Test Files")} ${S.green(`${G} passed`)} ${S.dim(`(${G})`)}`);let St=se+ne+re,bt=[...ne>0?[S.red(`${ne} failed`)]:[],...se>0?[S.green(`${se} passed`)]:[],...re>0?[S.yellow(`${re} skipped`)]:[]];if(console.log(` ${S.bold("Tests")} ${bt.join(` ${S.dim("|")} `)} ${S.dim(`(${St})`)}`),console.log(` ${S.bold("Start at")} ${qe}`),console.log(` ${S.bold("Duration")} ${Qe}s ${S.dim(`(tests ${Ze}s)`)}`),R.length>0){let i=Math.max(...R.map(F=>F.heapMb)),d=(R.reduce((F,D)=>F+D.heapMb,0)/R.length).toFixed(0);console.log(` ${S.bold("Heap")} max ${i} MB | avg ${d} MB | script ${$e} MB (RSS ${Se} MB)`)}else console.log(` ${S.bold("Heap")} script ${$e} MB (RSS ${Se} MB)`);return J.length>0?1:(console.log(`
44
44
  \u2705 All ${le.length} test files passed
45
- `),0)}export{ke as buildNodeOptions,H as colourPct,Le as createCoverageProgressTracker,Ce as deduplicateErrors,fe as discoverFilesInDir,de as discoverVitestFiles,ee as formatDuration,Rt as makeRunTmpDir,_e as noopProgressTracker,Ae as parseVitestOutput,Ue as printCoverageSummary,Ve as printMergeOutput,Be as printQuietCoverageFailureDetails,Pe as resolveBin,Oe as resolveVitestConfig,To as run,Ne as runMergeReports,ge as runSingleFile,yt as runVitestDirect,ue as sortWithPriority,L as stripAnsi};
45
+ `),0)}export{ke as buildNodeOptions,H as colourPct,_e as createCoverageProgressTracker,Re as deduplicateErrors,pe as discoverFilesInDir,de as discoverVitestFiles,ee as formatDuration,Lt as makeRunTmpDir,Be as noopProgressTracker,Ce as parseVitestOutput,ze as printCoverageSummary,Ue as printMergeOutput,Ve as printQuietCoverageFailureDetails,Pe as resolveBin,Oe as resolveVitestConfig,yo as run,Le as runMergeReports,ge as runSingleFile,Dt as runVitestDirect,ue as sortWithPriority,L as stripAnsi};
46
46
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cldmv/vitest-runner",
3
- "version": "1.4.4",
3
+ "version": "1.5.0",
4
4
  "description": "Sequential Vitest runner to avoid OOM issues with large test suites",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -65,6 +65,10 @@ export type ParsedArgs = {
65
65
  * - Path substrings from `--solo-pattern <pattern>` (repeatable).
66
66
  */
67
67
  soloPatterns: string[];
68
+ /**
69
+ * - Directory / file globs from `--exclude <glob>` (repeatable), relative to `cwd`, that discovery never enters.
70
+ */
71
+ exclude: string[];
68
72
  /**
69
73
  * - Compiled regex from `--file-pattern <regex>`, or undefined.
70
74
  */
@@ -1,15 +1,34 @@
1
+ /**
2
+ * Test whether a cwd-relative path matches any of the given exclude globs.
3
+ * Callers checking a directory should also test the path with a trailing
4
+ * slash appended, so a pattern like `tmp/**` prunes the `tmp` directory
5
+ * itself rather than only the files found inside it.
6
+ *
7
+ * @param {string} relPath - Path relative to `cwd`, forward-slash-normalised.
8
+ * @param {string[]} excludePatterns - Glob patterns relative to `cwd`.
9
+ * @returns {boolean}
10
+ * @example
11
+ * isExcluded("tmp/worktree/a.test.vitest.mjs", ["tmp/**"]); // true
12
+ * isExcluded("tmp/", ["tmp/**"]); // true — prunes the directory itself
13
+ */
14
+ export function isExcluded(relPath: string, excludePatterns: string[]): boolean;
1
15
  /**
2
16
  * Recursively discover all Vitest test files under a directory.
3
- * Skips `node_modules` and hidden directories (names starting with `.`).
17
+ * Skips `node_modules` and hidden directories (names starting with `.`),
18
+ * plus any directory or file matching an `exclude` glob.
4
19
  *
5
20
  * @param {string} dir - Absolute path of the directory to scan.
6
21
  * @param {string} cwd - Project root used to compute relative paths.
7
22
  * @param {RegExp} [pattern=DEFAULT_TEST_FILE_PATTERN] - Regex tested against the file name.
23
+ * @param {string[]} [exclude=[]] - Directory / file globs, relative to `cwd`, that discovery never enters.
8
24
  * @returns {Promise<string[]>} Paths relative to `cwd`.
9
25
  * @example
10
26
  * const files = await discoverFilesInDir('/project/src/tests', '/project');
27
+ * @example
28
+ * // Skip scratch worktrees carrying their own copy of the suite
29
+ * const files = await discoverFilesInDir('/project', '/project', DEFAULT_TEST_FILE_PATTERN, ['tmp/**']);
11
30
  */
12
- export function discoverFilesInDir(dir: string, cwd: string, pattern?: RegExp): Promise<string[]>;
31
+ export function discoverFilesInDir(dir: string, cwd: string, pattern?: RegExp, exclude?: string[]): Promise<string[]>;
13
32
  /**
14
33
  * Sort test files alphabetically while hoisting files matching `earlyRunPatterns`
15
34
  * to the front (in pattern-declaration order, then alphabetically within each group).
@@ -52,6 +71,7 @@ export function computeFilterConflicts(files: string[]): Map<string, string[]>;
52
71
  * @property {string} [testListFile] - Path to a JSON array of test file paths to run instead of scanning.
53
72
  * @property {RegExp} [testFilePattern] - Regex to match file names (default: `DEFAULT_TEST_FILE_PATTERN`).
54
73
  * @property {string[]} [earlyRunPatterns=[]] - Path substrings for files that must run solo first.
74
+ * @property {string[]} [exclude=[]] - Directory / file globs, relative to `cwd`, that discovery never enters. Applies to both the default scan and partial-path pattern resolution.
55
75
  */
56
76
  /**
57
77
  * Discover Vitest test files according to the provided options.
@@ -95,4 +115,8 @@ export type DiscoverOptions = {
95
115
  * - Path substrings for files that must run solo first.
96
116
  */
97
117
  earlyRunPatterns?: string[];
118
+ /**
119
+ * - Directory / file globs, relative to `cwd`, that discovery never enters. Applies to both the default scan and partial-path pattern resolution.
120
+ */
121
+ exclude?: string[];
98
122
  };
@@ -102,6 +102,10 @@ export type RunOptions = {
102
102
  * - Path substrings — matching files run solo before the worker pool.
103
103
  */
104
104
  earlyRunPatterns?: string[];
105
+ /**
106
+ * - Directory / file globs, relative to `cwd`, that discovery never enters (e.g. `['tmp/**']`). Applies to both the default scan and partial-path pattern resolution.
107
+ */
108
+ exclude?: string[];
105
109
  /**
106
110
  * - Per-file minimum heap overrides.
107
111
  */