vitest 0.0.63 → 0.0.64

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/LICENSE CHANGED
@@ -1,6 +1,7 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2021 Anthony Fu <https://github.com/antfu>
3
+ Copyright (c) 2021-Present Anthony Fu <https://github.com/antfu>
4
+ Copyright (c) 2021-Present Matias Capeletto <https://github.com/patak-dev>
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
7
  of this software and associated documentation files (the "Software"), to deal
package/dist/node/cli.js CHANGED
@@ -1,4 +1,4 @@
1
- import{addSnapshotResult,emptySummary,getNames,getSuites,getTests,hasFailed}from"../chunk-H3VLV7UP.js";import{__commonJS,__spreadProps,__spreadValues,__toModule,defaultExcludes,defaultIncludes,distDir,init_esm_shims}from"../chunk-CNY47EZT.js";var require_indent_string=__commonJS({"node_modules/.pnpm/indent-string@4.0.0/node_modules/indent-string/index.js"(exports,module){init_esm_shims();"use strict";module.exports=(string,count=1,options)=>{if(options=__spreadValues({indent:" ",includeEmptyLines:!1},options),typeof string!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof string}\``);if(typeof count!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof count}\``);if(typeof options.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\``);if(count===0)return string;let regex=options.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return string.replace(regex,options.indent.repeat(count))}}});init_esm_shims();import sade from"sade";import c4 from"picocolors";import{install as installSourceMapSupport}from"source-map-support";var version="0.0.63";init_esm_shims();import{performance}from"perf_hooks";import{relative as relative2}from"path";import c3 from"picocolors";init_esm_shims();import{promises as fs,existsSync}from"fs";import c from"picocolors";import*as diff from"diff";import{notNullish}from"@antfu/utils";import{SourceMapConsumer}from"source-map";import cliTruncate from"cli-truncate";init_esm_shims();var F_RIGHT="\u2192",F_DOWN="\u2193",F_UP="\u2191",F_DOWN_RIGHT="\u21B3",F_POINTER="\u276F",F_DOT="\xB7",F_CHECK="\u221A",F_CROSS="\xD7";async function printError(error){let{server}=process.__vitest__,e=error;typeof error=="string"&&(e={message:error.split(/\n/g)[0],stack:error});let codeFramePrinted=!1,nearest=parseStack(e.stack||e.stackStr||"").find(stack=>server.moduleGraph.getModuleById(stack.file));if(nearest){let mod=server.moduleGraph.getModuleById(nearest.file),transformResult=mod==null?void 0:mod.ssrTransformResult,pos=await getOriginalPos(transformResult==null?void 0:transformResult.map,nearest);if(pos&&existsSync(nearest.file)){let sourceCode=await fs.readFile(nearest.file,"utf-8");displayErrorMessage(e),displayFilePath(nearest.file,pos),displayCodeFrame(sourceCode,pos),codeFramePrinted=!0}}codeFramePrinted||console.error(e),e.showDiff&&displayDiff(e.actual,e.expected)}function displayDiff(actual,expected){console.error(c.gray(generateDiff(stringify(actual),stringify(expected))))}function displayErrorMessage(error){let errorName=error.name||error.nameStr||"Unknown Error";console.error(c.red(cliTruncate(`${c.bold(errorName)}: ${error.message}`,process.stdout.columns)))}function displayFilePath(filePath,pos){console.log(c.gray(`${filePath}:${pos.line}:${pos.column}`))}function displayCodeFrame(sourceCode,pos){console.log(c.yellow(generateCodeFrame(sourceCode,pos)))}function getOriginalPos(map,{line,column}){return new Promise(resolve2=>{if(!map)return resolve2(null);SourceMapConsumer.with(map,null,consumer=>{let pos=consumer.originalPositionFor({line,column});pos.line!=null&&pos.column!=null?resolve2(pos):resolve2(null)})})}var splitRE=/\r?\n/;function posToNumber(source,pos){if(typeof pos=="number")return pos;let lines=source.split(splitRE),{line,column}=pos,start2=0;for(let i=0;i<line-1;i++)start2+=lines[i].length+1;return start2+column}function generateCodeFrame(source,start2=0,end,range=2){start2=posToNumber(source,start2),end=end||start2;let lines=source.split(splitRE),count=0,res=[];function lineNo(no=""){return c.gray(`${String(no).padStart(3," ")}| `)}for(let i=0;i<lines.length;i++)if(count+=lines[i].length+1,count>=start2){for(let j=i-range;j<=i+range||end>count;j++){if(j<0||j>=lines.length)continue;let lineLength=lines[j].length;if(lineLength>200)return"";if(res.push(lineNo(j+1)+cliTruncate(lines[j],process.stdout.columns-5)),j===i){let pad=start2-(count-lineLength),length=Math.max(1,end>count?lineLength-pad:end-start2);res.push(lineNo()+" ".repeat(pad)+F_UP.repeat(length))}else if(j>i){if(end>count){let length=Math.max(1,Math.min(end-count,lineLength));res.push(lineNo()+F_UP.repeat(length))}count+=lineLength+1}}break}return res.join(`
1
+ import{addSnapshotResult,emptySummary,getNames,getSuites,getTests,hasFailed}from"../chunk-H3VLV7UP.js";import{__spreadProps,__spreadValues,defaultExcludes,defaultIncludes,distDir,init_esm_shims}from"../chunk-CNY47EZT.js";init_esm_shims();import sade from"sade";import c4 from"picocolors";import{install as installSourceMapSupport}from"source-map-support";var version="0.0.64";init_esm_shims();import{performance}from"perf_hooks";import{relative as relative2}from"path";import c3 from"picocolors";init_esm_shims();import{promises as fs,existsSync}from"fs";import c from"picocolors";import*as diff from"diff";import{notNullish}from"@antfu/utils";import{SourceMapConsumer}from"source-map";import cliTruncate from"cli-truncate";init_esm_shims();var F_RIGHT="\u2192",F_DOWN="\u2193",F_UP="\u2191",F_DOWN_RIGHT="\u21B3",F_POINTER="\u276F",F_DOT="\xB7",F_CHECK="\u221A",F_CROSS="\xD7";async function printError(error){let{server}=process.__vitest__,e=error;typeof error=="string"&&(e={message:error.split(/\n/g)[0],stack:error});let codeFramePrinted=!1,nearest=parseStack(e.stack||e.stackStr||"").find(stack=>server.moduleGraph.getModuleById(stack.file));if(nearest){let mod=server.moduleGraph.getModuleById(nearest.file),transformResult=mod==null?void 0:mod.ssrTransformResult,pos=await getOriginalPos(transformResult==null?void 0:transformResult.map,nearest);if(pos&&existsSync(nearest.file)){let sourceCode=await fs.readFile(nearest.file,"utf-8");displayErrorMessage(e),displayFilePath(nearest.file,pos),displayCodeFrame(sourceCode,pos),codeFramePrinted=!0}}codeFramePrinted||console.error(e),e.showDiff&&displayDiff(e.actual,e.expected)}function displayDiff(actual,expected){console.error(c.gray(generateDiff(stringify(actual),stringify(expected))))}function displayErrorMessage(error){let errorName=error.name||error.nameStr||"Unknown Error";console.error(c.red(cliTruncate(`${c.bold(errorName)}: ${error.message}`,process.stdout.columns)))}function displayFilePath(filePath,pos){console.log(c.gray(`${filePath}:${pos.line}:${pos.column}`))}function displayCodeFrame(sourceCode,pos){console.log(c.yellow(generateCodeFrame(sourceCode,pos)))}function getOriginalPos(map,{line,column}){return new Promise(resolve2=>{if(!map)return resolve2(null);SourceMapConsumer.with(map,null,consumer=>{let pos=consumer.originalPositionFor({line,column});pos.line!=null&&pos.column!=null?resolve2(pos):resolve2(null)})})}var splitRE=/\r?\n/;function posToNumber(source,pos){if(typeof pos=="number")return pos;let lines=source.split(splitRE),{line,column}=pos,start2=0;for(let i=0;i<line-1;i++)start2+=lines[i].length+1;return start2+column}function generateCodeFrame(source,start2=0,end,range=2){start2=posToNumber(source,start2),end=end||start2;let lines=source.split(splitRE),count=0,res=[];function lineNo(no=""){return c.gray(`${String(no).padStart(3," ")}| `)}for(let i=0;i<lines.length;i++)if(count+=lines[i].length+1,count>=start2){for(let j=i-range;j<=i+range||end>count;j++){if(j<0||j>=lines.length)continue;let lineLength=lines[j].length;if(lineLength>200)return"";if(res.push(lineNo(j+1)+cliTruncate(lines[j],process.stdout.columns-5)),j===i){let pad=start2-(count-lineLength),length=Math.max(1,end>count?lineLength-pad:end-start2);res.push(lineNo()+" ".repeat(pad)+F_UP.repeat(length))}else if(j>i){if(end>count){let length=Math.max(1,Math.min(end-count,lineLength));res.push(lineNo()+F_UP.repeat(length))}count+=lineLength+1}}break}return res.join(`
2
2
  `)}function stringify(obj){return String(obj)}var stackFnCallRE=/at (.*) \((.+):(\d+):(\d+)\)$/,stackBarePathRE=/at ()(.+):(\d+):(\d+)$/;function parseStack(stack){return stack.split(`
3
3
  `).map(raw=>{let line=raw.trim(),match=line.match(stackFnCallRE)||line.match(stackBarePathRE);if(!match)return null;let file=match[2];return file.startsWith("file://")&&(file=file.slice(7)),{method:match[1],file:match[2],line:parseInt(match[3]),column:parseInt(match[4])}}).filter(notNullish)}function generateDiff(actual,expected){let diffSize=2048;return actual.length>diffSize&&(actual=`${actual.substring(0,diffSize)} ... Lines skipped`),expected.length>diffSize&&(expected=`${expected.substring(0,diffSize)} ... Lines skipped`),unifiedDiff(actual,expected)}function unifiedDiff(actual,expected){let indent=" ";function cleanUp(line){return line[0]==="+"?indent+c.green(`${line[0]}${line.slice(1)}`):line[0]==="-"?indent+c.red(`${line[0]}${line.slice(1)}`):line.match(/@@/)?"--":line.match(/\\ No newline/)?null:indent+line}let lines=diff.createPatch("string",actual,expected).split(`
4
4
  `).splice(5);return`
@@ -6,9 +6,9 @@ ${indent}${c.red("- actual")}
6
6
  ${indent}${c.green("+ expected")}
7
7
 
8
8
  ${lines.map(cleanUp).filter(notBlank).join(`
9
- `)}`}function notBlank(line){return typeof line!="undefined"&&line!==null}init_esm_shims();var import_indent_string=__toModule(require_indent_string());import{basename,dirname,isAbsolute,relative}from"path";import{createLogUpdate}from"log-update";import c2 from"picocolors";import cliTruncate2 from"cli-truncate";import stripAnsi from"strip-ansi";import elegantSpinner from"elegant-spinner";import{slash}from"@antfu/utils";var DURATION_LONG=300,MAX_HEIGHT=20,spinnerMap=new WeakMap,outputMap=new WeakMap,pointer=c2.yellow(F_POINTER),skipped=c2.yellow(F_DOWN);function formatTestPath(root,path){var _a;isAbsolute(path)&&(path=relative(root,path));let dir=dirname(path),ext=((_a=path.match(/(\.(spec|test)\.[cm]?[tj]sx?)$/))==null?void 0:_a[0])||"",base=basename(path,ext);return slash(c2.dim(`${dir}/`)+c2.bold(base))+c2.dim(ext)}function renderSnapshotSummary(rootDir,snapshots){let summary=[];if(snapshots.added&&summary.push(c2.bold(c2.green(`${snapshots.added} written`))),snapshots.unmatched&&summary.push(c2.bold(c2.red(`${snapshots.unmatched} failed`))),snapshots.updated&&summary.push(c2.bold(c2.green(`${snapshots.updated} updated `))),snapshots.filesRemoved&&(snapshots.didUpdate?summary.push(c2.bold(c2.green(`${snapshots.filesRemoved} files removed `))):summary.push(c2.bold(c2.yellow(`${snapshots.filesRemoved} files obsolete `)))),snapshots.filesRemovedList&&snapshots.filesRemovedList.length){let[head,...tail]=snapshots.filesRemovedList;summary.push(`${c2.gray(F_DOWN_RIGHT)}${formatTestPath(rootDir,head)}`),tail.forEach(key=>{summary.push(` ${c2.gray(F_DOT)}${formatTestPath(rootDir,key)}`)})}return snapshots.unchecked&&(snapshots.didUpdate?summary.push(c2.bold(c2.green(`${snapshots.unchecked} removed`))):summary.push(c2.bold(c2.yellow(`${snapshots.unchecked} obsolete`))),snapshots.uncheckedKeysByFile.forEach(uncheckedFile=>{summary.push(`${c2.gray(F_DOWN_RIGHT)}${formatTestPath(rootDir,uncheckedFile.filePath)}`),uncheckedFile.keys.forEach(key=>summary.push(` ${c2.gray(F_DOT)}${key}`))})),summary}function getStateString(tasks,name="tests"){if(tasks.length===0)return c2.dim(`no ${name}`);let passed=tasks.filter(i=>{var _a;return((_a=i.result)==null?void 0:_a.state)==="pass"}),failed=tasks.filter(i=>{var _a;return((_a=i.result)==null?void 0:_a.state)==="fail"}),skipped2=tasks.filter(i=>i.mode==="skip"),todo=tasks.filter(i=>i.mode==="todo");return[failed.length?c2.bold(c2.red(`${failed.length} failed`)):null,passed.length?c2.bold(c2.green(`${passed.length} passed`)):null,skipped2.length?c2.yellow(`${skipped2.length} skipped`):null,todo.length?c2.gray(`${todo.length} todo`):null].filter(Boolean).join(c2.dim(" | "))+c2.gray(` (${tasks.length})`)}function getStateSymbol(task){if(task.mode==="skip"||task.mode==="todo")return skipped;if(!task.result)return c2.gray("\xB7");if(task.result.state==="run"){if(task.type==="suite")return pointer;let spinner=spinnerMap.get(task);return spinner||(spinner=elegantSpinner(),spinnerMap.set(task,spinner)),c2.yellow(spinner())}return task.result.state==="pass"?c2.green(F_CHECK):task.result.state==="fail"?task.type==="suite"?pointer:c2.red(F_CROSS):" "}function renderTree(tasks,level=0){var _a,_b,_c,_d;let output=[];for(let task of tasks){let delta=1,suffix=task.mode==="skip"||task.mode==="todo"?` ${c2.dim("[skipped]")}`:"",prefix=` ${getStateSymbol(task)} `;if(task.type==="suite"&&(suffix+=c2.dim(` (${getTests(task).length})`)),(_a=task.result)==null?void 0:_a.end){let duration=task.result.end-task.result.start;duration>DURATION_LONG&&(suffix+=c2.yellow(` ${Math.round(duration)}${c2.dim("ms")}`))}if(task.name?output.push((0,import_indent_string.default)(prefix+task.name+suffix,level,{indent:" "})):delta=0,((_b=task.result)==null?void 0:_b.state)!=="pass"&&outputMap.get(task)!=null){let data=outputMap.get(task);if(typeof data=="string"&&(data=stripAnsi(data.trim().split(`
10
- `).filter(Boolean).pop()),data===""&&(data=void 0)),data!=null){let out=(0,import_indent_string.default)(`${F_RIGHT} ${data}`,level,{indent:" "});output.push(` ${c2.gray(cliTruncate2(out,process.stdout.columns-3))}`)}}(((_c=task.result)==null?void 0:_c.state)==="fail"||((_d=task.result)==null?void 0:_d.state)==="run")&&task.type==="suite"&&task.tasks.length>0&&(output=output.concat(renderTree(task.tasks,level+delta)))}return output.slice(0,MAX_HEIGHT).join(`
11
- `)}var createRenderer=_tasks=>{let tasks=_tasks,timer,log=createLogUpdate(process.stdout);function update(){log(renderTree(tasks))}return{start(){return timer?this:(timer=setInterval(update,200),this)},update(_tasks2){return tasks=_tasks2,update(),this},async stop(){return timer&&(clearInterval(timer),timer=void 0),log.clear(),console.log(renderTree(tasks)),this}}};function getFullName(task){return getNames(task).join(c2.gray(" > "))}var isTTY=process.stdout.isTTY&&!process.env.CI,DefaultReporter=class{constructor(ctx){this.ctx=ctx;console.log(c3.green(`Running tests at ${c3.gray(this.ctx.config.root)}
9
+ `)}`}function notBlank(line){return typeof line!="undefined"&&line!==null}init_esm_shims();import{basename,dirname,isAbsolute,relative}from"path";import{createLogUpdate}from"log-update";import c2 from"picocolors";import cliTruncate2 from"cli-truncate";import stripAnsi from"strip-ansi";import{slash}from"@antfu/utils";var DURATION_LONG=300,MAX_HEIGHT=20,spinnerMap=new WeakMap,outputMap=new WeakMap,pointer=c2.yellow(F_POINTER),skipped=c2.yellow(F_DOWN);function formatTestPath(root,path){var _a;isAbsolute(path)&&(path=relative(root,path));let dir=dirname(path),ext=((_a=path.match(/(\.(spec|test)\.[cm]?[tj]sx?)$/))==null?void 0:_a[0])||"",base=basename(path,ext);return slash(c2.dim(`${dir}/`)+c2.bold(base))+c2.dim(ext)}function renderSnapshotSummary(rootDir,snapshots){let summary=[];if(snapshots.added&&summary.push(c2.bold(c2.green(`${snapshots.added} written`))),snapshots.unmatched&&summary.push(c2.bold(c2.red(`${snapshots.unmatched} failed`))),snapshots.updated&&summary.push(c2.bold(c2.green(`${snapshots.updated} updated `))),snapshots.filesRemoved&&(snapshots.didUpdate?summary.push(c2.bold(c2.green(`${snapshots.filesRemoved} files removed `))):summary.push(c2.bold(c2.yellow(`${snapshots.filesRemoved} files obsolete `)))),snapshots.filesRemovedList&&snapshots.filesRemovedList.length){let[head,...tail]=snapshots.filesRemovedList;summary.push(`${c2.gray(F_DOWN_RIGHT)} ${formatTestPath(rootDir,head)}`),tail.forEach(key=>{summary.push(` ${c2.gray(F_DOT)} ${formatTestPath(rootDir,key)}`)})}return snapshots.unchecked&&(snapshots.didUpdate?summary.push(c2.bold(c2.green(`${snapshots.unchecked} removed`))):summary.push(c2.bold(c2.yellow(`${snapshots.unchecked} obsolete`))),snapshots.uncheckedKeysByFile.forEach(uncheckedFile=>{summary.push(`${c2.gray(F_DOWN_RIGHT)} ${formatTestPath(rootDir,uncheckedFile.filePath)}`),uncheckedFile.keys.forEach(key=>summary.push(` ${c2.gray(F_DOT)} ${key}`))})),summary}function getStateString(tasks,name="tests"){if(tasks.length===0)return c2.dim(`no ${name}`);let passed=tasks.filter(i=>{var _a;return((_a=i.result)==null?void 0:_a.state)==="pass"}),failed=tasks.filter(i=>{var _a;return((_a=i.result)==null?void 0:_a.state)==="fail"}),skipped2=tasks.filter(i=>i.mode==="skip"),todo=tasks.filter(i=>i.mode==="todo");return[failed.length?c2.bold(c2.red(`${failed.length} failed`)):null,passed.length?c2.bold(c2.green(`${passed.length} passed`)):null,skipped2.length?c2.yellow(`${skipped2.length} skipped`):null,todo.length?c2.gray(`${todo.length} todo`):null].filter(Boolean).join(c2.dim(" | "))+c2.gray(` (${tasks.length})`)}function getStateSymbol(task){if(task.mode==="skip"||task.mode==="todo")return skipped;if(!task.result)return c2.gray("\xB7");if(task.result.state==="run"){if(task.type==="suite")return pointer;let spinner=spinnerMap.get(task);return spinner||(spinner=elegantSpinner(),spinnerMap.set(task,spinner)),c2.yellow(spinner())}return task.result.state==="pass"?c2.green(F_CHECK):task.result.state==="fail"?task.type==="suite"?pointer:c2.red(F_CROSS):" "}function renderTree(tasks,level=0){var _a,_b,_c,_d;let output=[];for(let task of tasks){let delta=1,suffix=task.mode==="skip"||task.mode==="todo"?` ${c2.dim("[skipped]")}`:"",prefix=` ${getStateSymbol(task)} `;if(task.type==="suite"&&(suffix+=c2.dim(` (${getTests(task).length})`)),(_a=task.result)==null?void 0:_a.end){let duration=task.result.end-task.result.start;duration>DURATION_LONG&&(suffix+=c2.yellow(` ${Math.round(duration)}${c2.dim("ms")}`))}if(task.name?output.push(" ".repeat(level)+prefix+task.name+suffix):delta=0,((_b=task.result)==null?void 0:_b.state)!=="pass"&&outputMap.get(task)!=null){let data=outputMap.get(task);if(typeof data=="string"&&(data=stripAnsi(data.trim().split(`
10
+ `).filter(Boolean).pop()),data===""&&(data=void 0)),data!=null){let out=`${" ".repeat(level)}${F_RIGHT} ${data}`;output.push(` ${c2.gray(cliTruncate2(out,process.stdout.columns-3))}`)}}(((_c=task.result)==null?void 0:_c.state)==="fail"||((_d=task.result)==null?void 0:_d.state)==="run")&&task.type==="suite"&&task.tasks.length>0&&(output=output.concat(renderTree(task.tasks,level+delta)))}return output.slice(0,MAX_HEIGHT).join(`
11
+ `)}var createRenderer=_tasks=>{let tasks=_tasks,timer,log=createLogUpdate(process.stdout);function update(){log(renderTree(tasks))}return{start(){return timer?this:(timer=setInterval(update,200),this)},update(_tasks2){return tasks=_tasks2,update(),this},async stop(){return timer&&(clearInterval(timer),timer=void 0),log.clear(),console.log(renderTree(tasks)),this}}};function getFullName(task){return getNames(task).join(c2.gray(" > "))}var spinnerFrames=process.platform==="win32"?["-","\\","|","/"]:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function elegantSpinner(){let index=0;return()=>(index=++index%spinnerFrames.length,spinnerFrames[index])}var isTTY=process.stdout.isTTY&&!process.env.CI,DefaultReporter=class{constructor(ctx){this.ctx=ctx;console.log(c3.green(`Running tests at ${c3.gray(this.ctx.config.root)}
12
12
  `)),this.start=performance.now()}start=0;end=0;renderer;watchFilters;relative(path){return relative2(this.ctx.config.root,path)}onStart(){if(isTTY){let files=this.ctx.state.getFiles(this.watchFilters);this.renderer?this.renderer.update(files):this.renderer=createRenderer(files).start()}}onTaskUpdate(pack){var _a,_b,_c;if(isTTY)return;let task=this.ctx.state.idMap[pack[0]];task.type==="test"&&((_a=task.result)==null?void 0:_a.state)&&((_b=task.result)==null?void 0:_b.state)!=="run"&&(console.log(` ${getStateSymbol(task)} ${getFullName(task)}`),task.result.state==="fail"&&console.log(c3.red(` ${F_RIGHT} ${(_c=task.result.error)==null?void 0:_c.message}`)))}async onFinished(files=this.ctx.state.getFiles()){var _a,_b;this.end=performance.now(),await this.stopListRender(),console.log();let suites=getSuites(files),tests=getTests(files),failedSuites=suites.filter(i=>{var _a2;return(_a2=i.result)==null?void 0:_a2.error}),failedTests=tests.filter(i=>{var _a2;return((_a2=i.result)==null?void 0:_a2.state)==="fail"});if(failedSuites.length){console.error(c3.bold(c3.red(`
13
13
  Failed to run ${failedSuites.length} suites:`)));for(let suite of failedSuites)console.error(c3.red(`
14
14
  - ${getFullName(suite)}`)),await printError((_a=suite.result)==null?void 0:_a.error),console.log()}if(failedTests.length){console.error(c3.bold(c3.red(`
@@ -17,6 +17,6 @@ ${c3.inverse(" FAIL ")}`)} ${getFullName(test)}`),await printError((_b=test.resu
17
17
  `)),snapshotOutput.length>1&&console.log()),console.log(padTitle("Test Files"),getStateString(files)),console.log(padTitle("Tests"),getStateString(tests)),this.watchFilters?console.log(padTitle("Time"),time(threadTime)):console.log(padTitle("Time"),time(executionTime)+c3.gray(` (in thread ${time(threadTime)}, ${(executionTime/threadTime*100).toFixed(2)}%)`)),console.log()}async onWatcherStart(){await this.stopListRender();let failed=getTests(this.ctx.state.getFiles()).filter(i=>{var _a;return((_a=i.result)==null?void 0:_a.state)==="fail"});failed.length?console.log(`
18
18
  ${c3.bold(c3.inverse(c3.red(" FAIL ")))}${c3.red(` ${failed.length} tests failed. Watching for file changes...`)}`):console.log(`
19
19
  ${c3.bold(c3.inverse(c3.green(" PASS ")))}${c3.green(" Watching for file changes...")}`)}async onWatcherRerun(files,trigger){await this.stopListRender(),this.watchFilters=files,console.clear(),console.log(c3.blue("Re-running tests...")+c3.dim(` [ ${this.relative(trigger)} ]
20
- `))}async stopListRender(){var _a;(_a=this.renderer)==null||_a.stop(),this.renderer=void 0,await new Promise(resolve2=>setTimeout(resolve2,100))}};init_esm_shims();var SnapshotManager=class{constructor(config){this.config=config;this.clear()}summary=void 0;clear(){this.summary=emptySummary(this.config.snapshotOptions)}add(result){addSnapshotResult(this.summary,result)}};init_esm_shims();import{resolve}from"path";import{findUp}from"find-up";import{createServer}from"vite";import{toArray}from"@antfu/utils";var configFiles=["vitest.config.ts","vitest.config.js","vitest.config.mjs","vite.config.ts","vite.config.js","vite.config.mjs"];async function initViteServer(options={}){var _a,_b;let root=resolve(options.root||process.cwd());process.chdir(root);let configPath=options.config?resolve(root,options.config):await findUp(configFiles,{cwd:root}),resolved=__spreadValues({},options);resolved.config=configPath,resolved.root=root,options.cliFilters&&(resolved.cliFilters=toArray(options.cliFilters));let server=await createServer({root,logLevel:"error",clearScreen:!1,configFile:resolved.config,optimizeDeps:{exclude:["vitest"]}});await server.pluginContainer.buildStart({}),Object.assign(resolved,server.config.test),resolved.depsInline=((_a=resolved.deps)==null?void 0:_a.inline)||[],resolved.depsExternal=((_b=resolved.deps)==null?void 0:_b.external)||[],resolved.environment=resolved.environment||"node",resolved.threads=resolved.threads??!0,resolved.interpretDefault=resolved.interpretDefault??!0;let CI=!!process.env.CI,UPDATE_SNAPSHOT=resolved.update||process.env.UPDATE_SNAPSHOT;return resolved.snapshotOptions={updateSnapshot:CI&&!UPDATE_SNAPSHOT?"none":UPDATE_SNAPSHOT?"all":"new"},process.env.VITEST_MAX_THREADS&&(resolved.maxThreads=parseInt(process.env.VITEST_MAX_THREADS)),process.env.VITEST_MIN_THREADS&&(resolved.minThreads=parseInt(process.env.VITEST_MIN_THREADS)),{server,config:resolved}}init_esm_shims();init_esm_shims();import{MessageChannel}from"worker_threads";import{pathToFileURL}from"url";import Piscina from"piscina";init_esm_shims();async function transformRequest(server,id){if(id.match(/\.(?:[cm]?[jt]sx?|json)$/))return await server.transformRequest(id,{ssr:!0});{let result=await server.transformRequest(id);return result?await server.ssrTransform(result.code,result.map,id):void 0}}function createPool(ctx){return ctx.config.threads?createWorkerPool(ctx):createFakePool(ctx)}var workerPath=new URL("./dist/runtime/worker.js",pathToFileURL(distDir)).href;function createFakePool(ctx){return{runTestFiles:async(files,invalidates)=>{let{default:run}=await import(workerPath),{workerPort,port}=createChannel(ctx),data={port:workerPort,config:ctx.config,files,invalidates};await run(data,{transferList:[workerPort]}),port.close(),workerPort.close()},close:async()=>{}}}function createWorkerPool(ctx){let options={filename:workerPath};ctx.config.maxThreads!=null&&(options.maxThreads=ctx.config.maxThreads),ctx.config.minThreads!=null&&(options.minThreads=ctx.config.minThreads);let piscina=new Piscina(options);return{runTestFiles:async(files,invalidates)=>{await Promise.all(files.map(async file=>{let{workerPort,port}=createChannel(ctx),data={port:workerPort,config:ctx.config,files:[file],invalidates};await piscina.run(data,{transferList:[workerPort]}),port.close(),workerPort.close()}))},close:()=>piscina.destroy()}}function createChannel(ctx){let channel=new MessageChannel,port=channel.port2,workerPort=channel.port1;return port.on("message",async({id,method,args=[]})=>{var _a,_b,_c,_d;async function send(fn){try{port.postMessage({id,result:await fn()})}catch(e){port.postMessage({id,error:e})}}switch(method){case"snapshotSaved":return send(()=>ctx.snapshot.add(args[0]));case"fetch":return send(()=>transformRequest(ctx.server,...args));case"onCollected":ctx.state.collectFiles(args[0]),(_b=(_a=ctx.reporter).onStart)==null||_b.call(_a,args[0].map(i=>i.filepath));return;case"onTaskUpdate":ctx.state.updateTasks([args[0]]),(_d=(_c=ctx.reporter).onTaskUpdate)==null||_d.call(_c,args[0]);return}console.error("Unhandled message",method,args)}),{workerPort,port}}init_esm_shims();import fg from"fast-glob";async function globTestFiles(config){var _a;let testFilepaths=await fg(config.includes||defaultIncludes,{absolute:!0,cwd:config.root,ignore:config.excludes||defaultExcludes});return((_a=config.cliFilters)==null?void 0:_a.length)&&(testFilepaths=testFilepaths.filter(i=>config.cliFilters.some(f=>i.includes(f)))),testFilepaths}init_esm_shims();import{slash as slash2}from"@antfu/utils";async function startWatcher(ctx,pool){var _a;let{reporter,server}=ctx;(_a=reporter.onWatcherStart)==null||_a.call(reporter);let timer,changedTests=new Set,seen=new Set;server.watcher.on("change",async id=>{id=slash2(id),getAffectedTests(ctx,id,changedTests,seen),changedTests.size!==0&&(clearTimeout(timer),timer=setTimeout(async()=>{var _a2,_b,_c;if(changedTests.size===0){seen.clear();return}ctx.state.getFiles().forEach(file=>{var _a3;((_a3=file.result)==null?void 0:_a3.state)==="fail"&&changedTests.add(file.filepath)});let invalidates=Array.from(seen),tests=Array.from(changedTests);changedTests.clear(),seen.clear(),await((_a2=reporter.onWatcherRerun)==null?void 0:_a2.call(reporter,tests,id)),await pool.runTestFiles(tests,invalidates),await((_b=reporter.onFinished)==null?void 0:_b.call(reporter,ctx.state.getFiles(tests))),await((_c=reporter.onWatcherStart)==null?void 0:_c.call(reporter))},100))}),await new Promise(()=>{})}function getAffectedTests(ctx,id,set=new Set,seen=new Set){if(seen.has(id)||set.has(id)||id.includes("/node_modules/")||id.includes("/vitest/dist/"))return set;if(seen.add(id),id in ctx.state.filesMap)return set.add(id),set;let mod=ctx.server.moduleGraph.getModuleById(id);return mod&&mod.importers.forEach(i=>{i.id&&getAffectedTests(ctx,i.id,set,seen)}),set}async function start(ctx){var _a,_b;let{config}=ctx,testFilepaths=await globTestFiles(config);if(!testFilepaths.length){console.error("No test files found"),process.exitCode=1;return}let pool=createPool(ctx);await pool.runTestFiles(testFilepaths),hasFailed(ctx.state.getFiles())&&(process.exitCode=1),await((_b=(_a=ctx.reporter).onFinished)==null?void 0:_b.call(_a,ctx.state.getFiles())),config.watch?await startWatcher(ctx,pool):await pool.close()}init_esm_shims();var StateManager=class{filesMap={};idMap={};taskFileMap=new WeakMap;getFiles(keys){return keys?keys.map(key=>this.filesMap[key]):Object.values(this.filesMap)}collectFiles(files){files.forEach(file=>{this.filesMap[file.filepath]=file,this.updateId(file)})}updateId(task){this.idMap[task.id]!==task&&(this.idMap[task.id]=task,task.type==="suite"&&task.tasks.forEach(task2=>{this.updateId(task2)}))}updateTasks(packs){for(let[id,result]of packs)this.idMap[id]&&(this.idMap[id].result=result)}};sade("vitest [filter]",!0).version(version).describe("A blazing fast unit test framework powered by Vite.").option("-r, --root","root path",process.cwd()).option("-c, --config","path to config file").option("-w, --watch","watch mode",!1).option("-u, --update","update snapshot",!1).option("--global","inject apis globally",!1).option("--dom","mock browser api happy-dom",!1).option("--environment","runner environment","").action(async(cliFilters,argv)=>{process.env.VITEST="true",console.log(c4.magenta(c4.bold(`
20
+ `))}async stopListRender(){var _a;(_a=this.renderer)==null||_a.stop(),this.renderer=void 0,await new Promise(resolve2=>setTimeout(resolve2,100))}};init_esm_shims();var SnapshotManager=class{constructor(config){this.config=config;this.clear()}summary=void 0;clear(){this.summary=emptySummary(this.config.snapshotOptions)}add(result){addSnapshotResult(this.summary,result)}};init_esm_shims();import{resolve}from"path";import{findUp}from"find-up";import{createServer}from"vite";import{toArray}from"@antfu/utils";var configFiles=["vitest.config.ts","vitest.config.js","vitest.config.mjs","vite.config.ts","vite.config.js","vite.config.mjs"];async function initViteServer(options={}){var _a,_b;let root=resolve(options.root||process.cwd());process.chdir(root);let configPath=options.config?resolve(root,options.config):await findUp(configFiles,{cwd:root}),resolved=__spreadValues({},options);resolved.config=configPath,resolved.root=root,options.cliFilters&&(resolved.cliFilters=toArray(options.cliFilters));let server=await createServer({root,logLevel:"error",clearScreen:!1,configFile:resolved.config,optimizeDeps:{exclude:["vitest"]}});await server.pluginContainer.buildStart({}),Object.assign(resolved,server.config.test),resolved.depsInline=((_a=resolved.deps)==null?void 0:_a.inline)||[],resolved.depsExternal=((_b=resolved.deps)==null?void 0:_b.external)||[],resolved.environment=resolved.environment||"node",resolved.threads=resolved.threads??!0,resolved.interpretDefault=resolved.interpretDefault??!0,resolved.includes=resolved.includes??defaultIncludes,resolved.excludes=resolved.excludes??defaultExcludes;let CI=!!process.env.CI,UPDATE_SNAPSHOT=resolved.update||process.env.UPDATE_SNAPSHOT;return resolved.snapshotOptions={updateSnapshot:CI&&!UPDATE_SNAPSHOT?"none":UPDATE_SNAPSHOT?"all":"new"},process.env.VITEST_MAX_THREADS&&(resolved.maxThreads=parseInt(process.env.VITEST_MAX_THREADS)),process.env.VITEST_MIN_THREADS&&(resolved.minThreads=parseInt(process.env.VITEST_MIN_THREADS)),{server,config:resolved}}init_esm_shims();init_esm_shims();import{MessageChannel}from"worker_threads";import{pathToFileURL}from"url";import Piscina from"piscina";init_esm_shims();async function transformRequest(server,id){if(id.match(/\.(?:[cm]?[jt]sx?|json)$/))return await server.transformRequest(id,{ssr:!0});{let result=await server.transformRequest(id);return result?await server.ssrTransform(result.code,result.map,id):void 0}}function createPool(ctx){return ctx.config.threads?createWorkerPool(ctx):createFakePool(ctx)}var workerPath=new URL("./dist/runtime/worker.js",pathToFileURL(distDir)).href;function createFakePool(ctx){return{runTestFiles:async(files,invalidates)=>{let{default:run}=await import(workerPath),{workerPort,port}=createChannel(ctx),data={port:workerPort,config:ctx.config,files,invalidates};await run(data,{transferList:[workerPort]}),port.close(),workerPort.close()},close:async()=>{}}}function createWorkerPool(ctx){let options={filename:workerPath};ctx.config.maxThreads!=null&&(options.maxThreads=ctx.config.maxThreads),ctx.config.minThreads!=null&&(options.minThreads=ctx.config.minThreads);let piscina=new Piscina(options);return{runTestFiles:async(files,invalidates)=>{await Promise.all(files.map(async file=>{let{workerPort,port}=createChannel(ctx),data={port:workerPort,config:ctx.config,files:[file],invalidates};await piscina.run(data,{transferList:[workerPort]}),port.close(),workerPort.close()}))},close:()=>piscina.destroy()}}function createChannel(ctx){let channel=new MessageChannel,port=channel.port2,workerPort=channel.port1;return port.on("message",async({id,method,args=[]})=>{var _a,_b,_c,_d;async function send(fn){try{port.postMessage({id,result:await fn()})}catch(e){port.postMessage({id,error:e})}}switch(method){case"snapshotSaved":return send(()=>ctx.snapshot.add(args[0]));case"fetch":return send(()=>transformRequest(ctx.server,...args));case"onCollected":ctx.state.collectFiles(args[0]),(_b=(_a=ctx.reporter).onStart)==null||_b.call(_a,args[0].map(i=>i.filepath));return;case"onTaskUpdate":ctx.state.updateTasks([args[0]]),(_d=(_c=ctx.reporter).onTaskUpdate)==null||_d.call(_c,args[0]);return}console.error("Unhandled message",method,args)}),{workerPort,port}}init_esm_shims();import fg from"fast-glob";import mm from"micromatch";function isTargetFile(id,config){return mm.isMatch(id,config.excludes)?!1:mm.isMatch(id,config.includes)}async function globTestFiles(config){var _a;let testFilepaths=await fg(config.includes,{absolute:!0,cwd:config.root,ignore:config.excludes});return((_a=config.cliFilters)==null?void 0:_a.length)&&(testFilepaths=testFilepaths.filter(i=>config.cliFilters.some(f=>i.includes(f)))),testFilepaths}init_esm_shims();import{slash as slash2}from"@antfu/utils";var WATCHER_DEBOUNCE=50;async function startWatcher(ctx,pool){var _a;let{reporter,server}=ctx;(_a=reporter.onWatcherStart)==null||_a.call(reporter);let timer,changedTests=new Set,seen=new Set,promise;server.watcher.on("change",id=>{id=slash2(id),getAffectedTests(ctx,id,changedTests,seen),changedTests.size!==0&&rerunFile(id)}),server.watcher.on("unlink",id=>{id=slash2(id),seen.add(id),id in ctx.state.filesMap&&(delete ctx.state.filesMap[id],changedTests.delete(id))}),server.watcher.on("add",async id=>{id=slash2(id),isTargetFile(id,ctx.config)&&(changedTests.add(id),rerunFile(id))});async function rerunFile(id){await promise,clearTimeout(timer),timer=setTimeout(async()=>{if(changedTests.size===0){seen.clear();return}ctx.state.getFiles().forEach(file=>{var _a2;((_a2=file.result)==null?void 0:_a2.state)==="fail"&&changedTests.add(file.filepath)});let invalidates=Array.from(seen),tests=Array.from(changedTests);changedTests.clear(),seen.clear(),promise=start2(tests,id,invalidates),await promise},WATCHER_DEBOUNCE)}async function start2(tests,id,invalidates){var _a2,_b,_c;await((_a2=reporter.onWatcherRerun)==null?void 0:_a2.call(reporter,tests,id)),await pool.runTestFiles(tests,invalidates),await((_b=reporter.onFinished)==null?void 0:_b.call(reporter,ctx.state.getFiles(tests))),await((_c=reporter.onWatcherStart)==null?void 0:_c.call(reporter))}await new Promise(()=>{})}function getAffectedTests(ctx,id,set=new Set,seen=new Set){if(seen.has(id)||set.has(id)||id.includes("/node_modules/")||id.includes("/vitest/dist/"))return set;if(seen.add(id),id in ctx.state.filesMap)return set.add(id),set;let mod=ctx.server.moduleGraph.getModuleById(id);return mod&&mod.importers.forEach(i=>{i.id&&getAffectedTests(ctx,i.id,set,seen)}),set}async function start(ctx){var _a,_b;let{config}=ctx,testFilepaths=await globTestFiles(config);if(!testFilepaths.length){console.error("No test files found"),process.exitCode=1;return}let pool=createPool(ctx);await pool.runTestFiles(testFilepaths),hasFailed(ctx.state.getFiles())&&(process.exitCode=1),await((_b=(_a=ctx.reporter).onFinished)==null?void 0:_b.call(_a,ctx.state.getFiles())),config.watch?await startWatcher(ctx,pool):await pool.close()}init_esm_shims();var StateManager=class{filesMap={};idMap={};taskFileMap=new WeakMap;getFiles(keys){return keys?keys.map(key=>this.filesMap[key]):Object.values(this.filesMap)}collectFiles(files){files.forEach(file=>{this.filesMap[file.filepath]=file,this.updateId(file)})}updateId(task){this.idMap[task.id]!==task&&(this.idMap[task.id]=task,task.type==="suite"&&task.tasks.forEach(task2=>{this.updateId(task2)}))}updateTasks(packs){for(let[id,result]of packs)this.idMap[id]&&(this.idMap[id].result=result)}};sade("vitest [filter]",!0).version(version).describe("A blazing fast unit test framework powered by Vite.").option("-r, --root","root path",process.cwd()).option("-c, --config","path to config file").option("-w, --watch","watch mode",!1).option("-u, --update","update snapshot",!1).option("--global","inject apis globally",!1).option("--dom","mock browser api happy-dom",!1).option("--environment","runner environment","").action(async(cliFilters,argv)=>{process.env.VITEST="true",console.log(c4.magenta(c4.bold(`
21
21
  Vitest is in closed beta exclusively for Sponsors`))),console.log(c4.yellow(`Learn more at https://vitest.dev
22
22
  `)),argv.dom&&(argv.environment="happy-dom");let{config,server}=await initViteServer(__spreadProps(__spreadValues({},argv),{cliFilters})),ctx=process.__vitest__={server,config,state:new StateManager,snapshot:new SnapshotManager(config),reporter:config.reporter};installSourceMapSupport({environment:"node",hookRequire:!0,handleUncaughtExceptions:!0,retrieveSourceMap:id=>{var _a,_b;let map=(_b=(_a=ctx.server.moduleGraph.getModuleById(id))==null?void 0:_a.ssrTransformResult)==null?void 0:_b.map;return map?{url:id,map}:null}}),ctx.reporter=ctx.reporter||new DefaultReporter(ctx);try{await start(ctx)}catch(e){throw process.exitCode=1,e}finally{config.watch||await server.close()}}).parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vitest",
3
- "version": "0.0.63",
3
+ "version": "0.0.64",
4
4
  "description": "A blazing fast unit test framework powered by Vite",
5
5
  "keywords": [
6
6
  "vite",
@@ -62,10 +62,10 @@
62
62
  "chai-subset": "^1.6.0",
63
63
  "cli-truncate": "^3.1.0",
64
64
  "diff": "^5.0.0",
65
- "elegant-spinner": "^3.0.0",
66
65
  "fast-glob": "^3.2.7",
67
66
  "find-up": "^6.2.0",
68
67
  "log-update": "^5.0.0",
68
+ "micromatch": "^4.0.4",
69
69
  "nanoid": "^3.1.30",
70
70
  "picocolors": "^1.0.0",
71
71
  "piscina": "^3.2.0",
@@ -83,6 +83,7 @@
83
83
  "@types/chai-subset": "^1.3.3",
84
84
  "@types/diff": "^5.0.1",
85
85
  "@types/jsdom": "^16.2.13",
86
+ "@types/micromatch": "^4.0.2",
86
87
  "@types/natural-compare": "^1.4.1",
87
88
  "@types/node": "^16.11.12",
88
89
  "@types/sade": "^1.7.3",